自定義一個服務類,繼承Service,開啓該類後,在其onCreate方法裏拿到系統的電話管理服務,然後在合適的時候對通話內容進行錄音:
public class OutCallServices extends Service {
// 服務一旦開啓,如果用戶不在後臺手動關閉,將一直運行
@Override
public void onCreate() {
// TODO Auto-generated method stub
super.onCreate();
System.out.println("服務被創建了");
// 監聽用戶電話狀態的變化
// 電話管理器 電話管理的服務
TelephonyManager tm = (TelephonyManager) getSystemService(TELEPHONY_SERVICE);
// 爲用戶電話狀態變化添加監聽
tm.listen(new MyListener(), PhoneStateListener.LISTEN_CALL_STATE);
}
private class MyListener extends PhoneStateListener {
private MediaRecorder recorder;
@Override
public void onCallStateChanged(int state, String incomingNumber) {
// TODO Auto-generated method stub
super.onCallStateChanged(state, incomingNumber);
try {
switch(state){
case TelephonyManager.CALL_STATE_IDLE://空閒狀態 沒有通話 沒有響鈴
if(recorder != null){
recorder.stop();
recorder.reset(); // You can reuse the object by going back to setAudioSource() step
recorder.release(); // Now the object cannot be reused
recorder = null;
}
break;
case TelephonyManager.CALL_STATE_RINGING://響鈴狀態
System.out.println("發現電話號碼:"+incomingNumber);
recorder = new MediaRecorder();
//Sets the audio source to be used for recording
//Microphone audio source
recorder.setAudioSource(MediaRecorder.AudioSource.MIC);
//Sets the format of the output file produced during recording
//3GPP media file format
recorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
//Sets the audio encoder to be used for recording
//AMR (Narrowband) audio codec音頻編碼
recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
recorder.setOutputFile("/sdcard/"+System.currentTimeMillis()+".3gp");
recorder.prepare();
break;
case TelephonyManager.CALL_STATE_OFFHOOK://通話狀態
if(recorder != null){
recorder.start(); // Recording is now started
}
break;
}
} catch (Exception e) {
e.printStackTrace();
}
}
}