編輯:關於Android編程
本文實例講述了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.aidl android/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程序設計有所幫助。
Bitmap src = BitmapFactory.decodeResource(getResources(), imageId); //獲取Bitmap圖片Round
幾年前,看到過有個牛人用HTML5繪制了浪漫的愛心表白動畫。發現原來程序員也是可以很浪……漫…..的(PS:剛過520,被妹子罵
關於android多線程數據讀寫請看博客: android 多線程數據庫讀寫 常常糾結於獲取了SQLiteDatabase每次操作完是否要關閉的問題,每次關閉又怕影
本文是對已實現的藍牙防丟器項目的總結,闡述藍牙防丟器的原理、實現與android客戶端的藍牙BLE接口編程。在這裡重點關注如何利用BLE接口來進行工程實現,對於BLE的協