本文執行個體講述了Android開發實現的電話竊聽和攔截應用。分享給大家供大家參考,具體如下:
今天學習了進程間Service的通訊-->AIDL,基於前幾天學習的廣播機制,我做了一個簡單的電話竊聽和錄音應用。現將具體實現方法附在下面,供大家參考,希望大家提供一些寶貴的意見。
業務需求分析:
1.當手機處於開機狀態,監聽服務就要啟動,對來電進行監聽錄音。
2.設定電話黑名單,當來電是黑名單電話,則直接掛斷。
實現步驟:
首先我們要定義一個電話監聽的服務,對來電進行監聽錄音和攔截。具體代碼如下:
PhoneListenerService:
package cn.yj3g.L21_PhoneListener;import java.lang.reflect.Method;import com.android.internal.telephony.ITelephony;import android.app.Service;import android.content.Context;import android.content.Intent;import android.media.MediaRecorder;import android.os.Environment;import android.os.IBinder;import android.telephony.PhoneStateListener;import android.telephony.TelephonyManager;import android.util.Log;import android.view.LayoutInflater;import android.view.View;import android.widget.Toast;public class PhoneListenerService extends Service { private MediaRecorder recorder; private boolean recording = false; @Override public IBinder onBind(Intent intent) { return null; } @Override public void onCreate() { Log.v("TAG", "service onCreate()"); super.onCreate(); //電話語音管理 TelephonyManager manager = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE); //監聽電話狀態 manager.listen(listener, PhoneStateListener.LISTEN_CALL_STATE); } private PhoneStateListener listener = new PhoneStateListener() { /* * @see TelephonyManager#CALL_STATE_IDLE 值為0 * * @see TelephonyManager#CALL_STATE_RINGING 值為1 * * @see TelephonyManager#CALL_STATE_OFFHOOK 值為2 */ @Override public void onCallStateChanged(int state, String incomingNumber) { super.onCallStateChanged(state, incomingNumber); //列印電話狀態改變資訊 Log.v("TAG", "onCallStateChanged state=" + state); switch (state) { case TelephonyManager.CALL_STATE_IDLE: // 沒有來電 或者 掛斷 stopRecord(); break; case TelephonyManager.CALL_STATE_RINGING: // 響鈴時 stop(incomingNumber); break; case TelephonyManager.CALL_STATE_OFFHOOK: // 接起電話 recordCalling(); break; default: break; } } }; //停止錄音 private void stopRecord() { Log.v("TAG", "stopRecord"); if (recording) { recorder.stop(); recorder.release(); recording=false; } } //電話攔截 public void stop(String s) { try { if (s.equals("110")) { Toast.makeText(this, "攔截成功", 0).show(); Log.e("TAG", "此來電為黑名單號碼,已被攔截!"); //調用ITelephony.endCall()結束通話 Method method = Class.forName("android.os.ServiceManager") .getMethod("getService", String.class); IBinder binder = (IBinder) method.invoke(null, new Object[] { TELEPHONY_SERVICE }); ITelephony telephony = ITelephony.Stub.asInterface(binder); telephony.endCall(); } else Toast.makeText(this, "不需攔截", 0).show(); recording=false; } catch (Exception e) { e.printStackTrace(); } } //進行錄音 private void recordCalling() { try { Log.v("TAG", "recordCalling"); recorder = new MediaRecorder(); recorder.setAudioSource(MediaRecorder.AudioSource.MIC); // 讀麥克風的聲音 recorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);// 輸出格式.3gp recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);// 編碼方式 recorder.setOutputFile(Environment.getExternalStorageDirectory() .getAbsolutePath() + "/" + System.currentTimeMillis() + ".3gp");// 存放的位置是放在sdcard目錄下 recorder.prepare(); recorder.start(); recording = true; } catch (Exception e) { e.printStackTrace(); } }}
Android沒有對外公開結束通話的API,如果需要結束通話,必須使用AIDL與電話管理服務進行通訊, 並調用服務中的API實現結束通話,方法如下:
1.從Android的原始碼中拷貝以下檔案到項目中:
com/android/internal/telephony/ITelephony.aidlandroid/telephony/NeighboringCellInfo.aidl
如下圖所示.開發工具會在gen目錄下自動產生ITelephony.java
我們知道服務不能自己啟動,需要手動啟動,所以我們需要一個廣播,當手機剛開機,我們就發送廣播,啟動監聽電話的服務。下面是我寫的一個發送廣播的Receiver
BootCompleteReceiver:
package cn.yj3g.L21_PhoneListener;import android.content.BroadcastReceiver;import android.content.Context;import android.content.Intent;import android.util.Log;public class BootCompleteReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { //運用廣播開啟監聽這個服務 Log.v("TAG", "開機了!"); Intent i = new Intent(context, PhoneListenerService.class); i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);//由於之前運行不能實現功能,經老師的修改加上一個任務標誌 context.startService(i); }}
下面就是要在AndroidManifest.xml中配置相關的許可權:具體代碼如下:
AndroidManifest.xml:
<?xml version="1.0" encoding="utf-8"?><manifest xmlns:android="http://schemas.android.com/apk/res/android" package="cn.yj3g.L21_PhoneListener" android:versionCode="1" android:versionName="1.0"> <uses-sdk android:minSdkVersion="8" /> <application android:icon="@drawable/icon" android:label="@string/app_name"> <service android:name=".PhoneListenerService"> <intent-filter> <action android:name="cn.yj3g.L21_PhoneListener.PhoneListenerService" ></action> </intent-filter> </service> <receiver android:name=".BootCompleteReceiver"> <intent-filter> <action android:name="android.intent.action.BOOT_COMPLETED" /> </intent-filter> </receiver> </application> <!-- 讀取電話狀態許可權--> <uses-permission android:name="android.permission.READ_PHONE_STATE"/> <!-- 錄音許可權 --> <uses-permission android:name="android.permission.RECORD_AUDIO"/> <!-- 向sdcard中寫資料的許可權 --> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <!-- 開機啟動廣播的許可權 --> <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" /> <!-- 掛斷電話時需要的許可權 --> <uses-permission android:name="android.permission.CALL_PHONE" /></manifest>
這樣一個監聽電話的應用就做好了。當安裝此應用的手機開機時,來電就處於監聽狀態,這樣就可以不動聲色的對該手機的來電進行監聽錄音或者攔截,以達到不可告人的目的。
PS:關於Android Manifest功能與使用權限設定詳細內容可參考本站線上工具:
Android Manifest功能與許可權描述大全:
http://tools.jb51.net/table/AndroidManifest
更多關於Android相關內容感興趣的讀者可查看本站專題:《Android開發入門與進階教程》、《Android視圖View技巧總結》、《Android編程之activity操作技巧總結》、《Android操作SQLite資料庫技巧總結》、《Android操作json格式資料技巧總結》、《Android資料庫操作技巧總結》、《Android檔案操作技巧匯總》、《Android編程開發之SD卡操作方法匯總》、《Android資源操作技巧匯總》及《Android控制項用法總結》
希望本文所述對大家Android程式設計有所協助。