功能:監聽來電:當在通話狀態時開啟錄音器
錄取通話聲音需要權限:<uses-permission android:name="android.permission.RECORD_AUDIO"/>
執行音頻捕獲的步驟:Audio Capture(從文檔中直接翻譯過來的)
1.android.media.MediaRecorder的創建一個新的實例。
2.使用MediaRecorder.setAudioSource設置音頻源()。你可能會想useMediaRecorder.AudioSource.MIC。(設置音頻源為麥克風)
3.設置輸出文件格式使用MediaRecorder.setOutputFormat()。
4.設置輸出文件名稱使用MediaRecorder.setOutputFile()。
5.設置音頻編碼器使用MediaRecorder.setAudioEncoder()。
6.MediaRecorder實例上調用MediaRecorder.prepare()。
7.開始音頻捕捉,叫MediaRecorder.start()。
8.停止音頻捕捉,叫MediaRecorder.stop()。
9.當你完成了MediaRecorder實例,調用MediaRecorder.release()。
CallingMediaRecorder.release()總是建議立即免費資源。
服務類:
public class PhoneListenService extends Service { private TelephonyManager tm;//電話管理者 private MyListener listener;//監聽器 private MediaRecorder mr;//錄音機 @Override public IBinder onBind(Intent intent) { return null; } @Override public void onCreate() { super.onCreate(); //得到電話管理器 tm=(TelephonyManager) getSystemService(TELEPHONY_SERVICE); listener = new MyListener();//設置監聽器 tm.listen(listener, PhoneStateListener.LISTEN_CALL_STATE);//監聽電話的狀態 System.out.println("開啟了服務"); } class MyListener extends PhoneStateListener{ @Override//當電話的呼叫狀態發生改變時回調的方法 public void onCallStateChanged(int state, String incomingNumber) { super.onCallStateChanged(state, incomingNumber); //start:為0代表空閑,1代表來電,2代表在通話 System.out.println("電話狀態發生變化:"+state+" 打進來的號碼:"+incomingNumber); switch (state) { case TelephonyManager.CALL_STATE_IDLE://=0 if(mr!=null){ //第八步:停止錄音 mr.stop(); //第九步:釋放資源 mr.release(); } break; case TelephonyManager.CALL_STATE_RINGING://=1 System.out.println("來電話了"); break; case TelephonyManager.CALL_STATE_OFFHOOK://=2 try { mr = new MediaRecorder(); //第二步:設置音頻源 如果是麥克風 音頻源為:.MIC mr.setAudioSource(MediaRecorder.AudioSource.VOICE_CALL); //第三步:設置錄制的文件格式 mr.setOutputFormat(MediaRecorder.OutputFormat.DEFAULT); //第四步:設置輸出文件名稱使用MediaRecorder.setOutputFile()。 File file=new File(Environment.getExternalStorageDirectory(),System.currentTimeMillis()+".3gp"); mr.setOutputFile(file.getAbsolutePath()); //第五步:設置音頻編碼器使用MediaRecorder.setAudioEncoder()。 mr.setAudioEncoder(MediaRecorder.AudioEncoder.DEFAULT); //第六步:准備錄制 mr.prepare(); //第七步:開始音頻捕捉 mr.start(); }catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } break; default: break; } } } @Override public void onDestroy() { super.onDestroy(); tm.listen(listener, PhoneStateListener.LISTEN_NONE);//取消監聽 listener=null; System.out.println("關閉了服務"); } }
MainActivity:
//監聽電話的狀態需要讀取電話狀態的權限 //<uses-permission android:name="android.permission.READ_PHONE_STATE" /> public class MainActivity extends Activity implements OnClickListener { private Button start; private Button stop; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); start = (Button) findViewById(R.id.start); stop = (Button) findViewById(R.id.stop); start.setOnClickListener(this); stop.setOnClickListener(this); } @Override public void onClick(View v) { Intent intent=new Intent(this, PhoneListenService.class); switch (v.getId()) { case R.id.start://開啟服務 startService(intent); break; case R.id.stop://關閉服務 stopService(intent); break; default: break; } } }