Android實現電話錄音功能
阿新 • • 發佈:2019-02-16
需求分析
- 電話錄音是在通話的時候進行錄音,所以需要使用一個服務來完成功能。
- 需要監聽電話的狀態,分為三種狀態:
- 空閒狀態 TelephonyManager.CALL_STATE_IDLE
- 響鈴狀態 TelephonyManager.CALL_STATE_RINGING
- 摘機狀態 TelephonyManager.CALL_STATE_OFFHOOK
- 可以加入開機啟動這個服務。
具體編碼
manifest.xml檔案 。需要申請四個許可權,並實現服務,廣播的註冊。
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.easzz.recorder">
<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="@mipmap/ic_launcher"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme ="@style/AppTheme">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<service android:name=".RecorderService">
</service>
<receiver android:name=".BootReceiver">
<intent-filter>
<!--新增過濾實現開機啟動-->
<action android:name="android.intent.action.BOOT_COMPLETED"/>
</intent-filter>
</receiver>
</application>
</manifest>
通過一個Button按鈕來啟動該服務 MainActivity.java
public class MainActivity extends AppCompatActivity {
private Button btnRecorder;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btnRecorder= (Button) findViewById(R.id.btn_recorder);
//啟動服務
btnRecorder.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent=new Intent(MainActivity.this,RecorderService.class);
startService(intent);
}
});
}
}
服務的具體實現程式碼RecorderService.java
/**
* Created by Easzz on 2015/12/6.
*/
public class RecorderService extends Service {
private MediaRecorder recorder; //錄音的一個例項
@Override
public IBinder onBind(Intent intent) {
return null;
}
@Override
public void onCreate() {
super.onCreate();
//獲得電話管理器
TelephonyManager tm= (TelephonyManager) getSystemService(TELEPHONY_SERVICE);
//啟動監聽.傳入一個listener和監聽的事件,
tm.listen(new MyListener(),PhoneStateListener.LISTEN_CALL_STATE);
}
class MyListener extends PhoneStateListener{
//在電話狀態改變的時候呼叫
@Override
public void onCallStateChanged(int state, String incomingNumber) {
super.onCallStateChanged(state, incomingNumber);
switch (state){
case TelephonyManager.CALL_STATE_IDLE:
//空閒狀態
if (recorder!=null){
recorder.stop();//停止錄音
recorder.release();//釋放資源
recorder=null;
}
break;
case TelephonyManager.CALL_STATE_RINGING:
//響鈴狀態 需要在響鈴狀態的時候初始化錄音服務
if (recorder==null){
recorder=new MediaRecorder();//初始化錄音物件
recorder.setAudioSource(MediaRecorder.AudioSource.MIC);//設定錄音的輸入源(麥克)
recorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);//設定音訊格式(3gp)
createRecorderFile();//建立保存錄音的資料夾
recorder.setOutputFile("sdcard/recorder" + "/" + getCurrentTime() + ".3gp"); //設定錄音儲存的檔案
recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);//設定音訊編碼
try {
recorder.prepare();//準備錄音
} catch (IOException e) {
e.printStackTrace();
}
}
break;
case TelephonyManager.CALL_STATE_OFFHOOK:
//摘機狀態(接聽)
if (recorder!=null){
recorder.start(); //接聽的時候開始錄音
}
break;
}
}
//建立保存錄音的目錄
private void createRecorderFile() {
String absolutePath = Environment.getExternalStorageDirectory().getAbsolutePath();
String filePath=absolutePath+"/recorder";
File file=new File(filePath);
if (!file.exists()){
file.mkdir();
}
}
//獲取當前時間,以其為名來保存錄音
private String getCurrentTime(){
SimpleDateFormat format=new SimpleDateFormat("yyyyMMddHHmmss");
Date date=new Date();
String str=format.format(date);
return str;
}
}
}
在開機廣播中實現開機啟動服務
/**
* Created by Easzz on 2015/12/6.
*/
public class BootReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Intent i=new Intent(context,RecorderService.class);
//啟動服務不需要到棧頂 ,因為沒有前臺介面。但是開機啟動一個活動需要一個flag
//i.setFlag(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startService(i);
}
}
完。。。