在service之监听段话状态的那篇代码基础上修改,在service监听中添加具体代码就可以了。
写电话录音功能保存文件的时候避免不了存盘,所以要申请权限
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
这个权限申请了向SD卡中写文件的权限
电话空闲时,录音器关闭清零
// 电话空闲
case TelephonyManager.CALL_STATE_IDLE:
Log.i(TAG,"电话空闲");
// 如果电话空闲判断录音器如果不空就停止录音并放掉录音亲资源
if (mediaRecorder != null){
mediaRecorder.stop();
mediaRecorder.release();
mediaRecorder = null;
}
break;
当电话铃响是准备录音器
// 正在响铃
case TelephonyManager.CALL_STATE_RINGING:
Log.i(TAG,"正在响铃");
// 录音器准备工作
if (mediaRecorder == null){
getRecorder();
}
break;
当电话正在通话时,录音器开始录音
// 正在通话
case TelephonyManager.CALL_STATE_OFFHOOK:
Log.i(TAG,"电话通话");
// 正在通话,判断有录音器就开始录音
if (mediaRecorder != null){
mediaRecorder.start();
}
break;
以下是录音器初始化准备工作的代码
private void getRecorder() {
// 初始化录音器
mediaRecorder = new MediaRecorder();
// 设置输入——麦克风
mediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
// 设置音频编码
mediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
// 设置音频输出格式
mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
// 设置音频输出路径
mediaRecorder.setOutputFile("sdcard/audio.3gp");
try {
// 打开录音器准备录音
mediaRecorder.prepare();
} catch (IOException e) {
e.printStackTrace();
}
}
附上service完整代码
package com.example.jack.servicetest.service;
/**
* 监听通话状态
*/
import android.app.Service;
import android.content.Intent;
import android.media.MediaRecorder;
import android.os.IBinder;
import android.support.annotation.Nullable;
import android.telephony.PhoneStateListener;
import android.telephony.TelephonyManager;
import android.util.Log;
import java.io.IOException;
public class MyServiceForPhoneState extends Service{
private final String TAG = "MyServiceForPhoneState";
private MediaRecorder mediaRecorder;
@Nullable
@Override
public IBinder onBind(Intent intent) {
return null;
}
// 创建service
@Override
public void onCreate() {
super.onCreate();
Log.i(TAG,"创建");
}
// service运行中
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
Log.i(TAG, "运行");
getService();
return super.onStartCommand(intent, flags, startId);
}
private void getService() {
TelephonyManager tm = (TelephonyManager) getSystemService(TELEPHONY_SERVICE);
tm.listen(new MyPhoneStateListener(),PhoneStateListener.LISTEN_CALL_STATE);
}
class MyPhoneStateListener extends PhoneStateListener{
@Override
public void onCallStateChanged(int state, String phoneNumber) {
super.onCallStateChanged(state, phoneNumber);
switch (state){
// 电话空闲
case TelephonyManager.CALL_STATE_IDLE:
Log.i(TAG,"电话空闲");
// 如果电话空闲判断录音器如果不空就停止录音并放掉录音亲资源
if (mediaRecorder != null){
mediaRecorder.stop();
mediaRecorder = null;
}
break;
// 正在响铃
case TelephonyManager.CALL_STATE_RINGING:
Log.i(TAG,"正在响铃");
// 录音器准备工作
if (mediaRecorder == null){
getRecorder();
}
break;
// 正在通话
case TelephonyManager.CALL_STATE_OFFHOOK:
Log.i(TAG,"电话通话");
// 正在通话,判断有录音器就开始录音
if (mediaRecorder != null){
mediaRecorder.start();
}
break;
}
}
}
private void getRecorder() {
// 初始化录音器
mediaRecorder = new MediaRecorder();
// 设置输入——麦克风
mediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
// 设置音频编码
mediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
// 设置音频输出格式
mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
// 设置音频输出路径
mediaRecorder.setOutputFile("sdcard/audio.3gp");
try {
// 打开录音器准备录音
mediaRecorder.prepare();
} catch (IOException e) {
e.printStackTrace();
}
}
// service销毁
@Override
public void onDestroy() {
Log.i(TAG,"销毁");
super.onDestroy();
}
}