標籤:
需求:設定來電後自動錄音。
首先設定一個按鈕,代碼很簡單這裡就不再給出。
建一個類,RecorderServicer extends Service
package com.ydl.recorder;import java.io.IOException;import android.app.Service;import android.content.Intent;import android.media.MediaRecorder;import android.os.IBinder;import android.telecom.TelecomManager;import android.telephony.PhoneStateListener;import android.telephony.TelephonyManager;public class RecorderServicer extends Service {private MediaRecorder recorder;@Overridepublic IBinder onBind(Intent intent) {return null;}@Overridepublic void onCreate() {super.onCreate();TelephonyManager tm = (TelephonyManager) getSystemService(TELEPHONY_SERVICE);//監聽電話狀態tm.listen(new MyListener(), PhoneStateListener.LISTEN_CALL_STATE);}class MyListener extends PhoneStateListener {@Overridepublic void onCallStateChanged(int state, String incomingNumber) {// TODO Auto-generated method stubsuper.onCallStateChanged(state, incomingNumber);switch (state) {case TelephonyManager.CALL_STATE_IDLE:System.out.println("空閑");if (recorder != null) {recorder.stop();// 停止錄音recorder.release();recorder = null;}break;case TelephonyManager.CALL_STATE_RINGING:System.out.println("響鈴");// 進行初始化if (recorder != null) {recorder = new MediaRecorder();recorder.setAudioSource(MediaRecorder.AudioSource.MIC);// Microphone// audio// sourcerecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);// 設定輸出3gp格式recorder.setOutputFile("sdcard/luyin.3gp");recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);// 設定音頻編碼格式try {recorder.prepare();// 做好準備} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();}}break;case TelephonyManager.CALL_STATE_OFFHOOK:System.out.println("摘機");// 開始錄音if (recorder != null) {recorder.start();}default:break;}}}}
在主活動介面設定按鈕點擊事件:用於啟動上述服務
package com.ydl.recorder;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 { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } public void click(View v){ Intent intent = new Intent(this, RecorderServicer.class); startService(intent); }}為了做的更逼真一些,設定開機啟動服務:因此用到了上一章的開機廣播機制
建立一個類:BootReceiver extends BroadcastReceiver 用於開機啟動服務。因為服務是在背景,不可見面,因此不必設定任務棧即不需要addFlags()方法
package com.ydl.recorder;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 it = new Intent(context, RecorderServicer.class);context.startService(it);}}
上述代碼都是對系統進行操作,例如:監聽電話狀態、設定開機廣播、寫出資料到SDcard、設定錄音方式。因此需要配置許可權,同時上邊的而廣播和服務都要進行相應的配置。
資訊清單檔的許可權和服務廣播註冊如下:
<uses-permission android:name="android.permission.READ_PHONE_STATE"/> <uses-permission android:name="android.permission.RECORD_AUDIO"/> <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<service android:name="com.ydl.recorder.RecorderServicer"></service> <receiver android:name="com.ydl.recorder.BootReceiver"> <intent-filter > <action android:name="android.intent.action.BOOT_COMPLETED"/> </intent-filter> </receiver>
Android初級教程實現電話錄音