您的位置:首页 > 移动开发 > Android开发

Android 通话录音功能实现

2014-06-06 18:04 369 查看
  在Android平台实现实现通话录音功能

  1.作为后台运行的程序需要使用service去实现,在录音的时候雨IO操作需要启动新线程

  2.使用平台的MediaRecorder类录音

  3.用PhoneStateListener监听电话的状态

  4.添加相应的权限

<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.MOUNT_UNMOUNT_FILESYSTEMS"/>

 

具体代码如下:

package com.mobi.app;

import android.app.Service;
import android.content.Context;
import android.content.Intent;
import android.media.MediaRecorder;
import android.os.Environment;
import android.os.Handler;
import android.os.HandlerThread;
import android.os.IBinder;
import android.os.Looper;
import android.os.Message;
import android.os.Process;
import android.telephony.PhoneStateListener;
import android.telephony.TelephonyManager;
import android.util.Log;

import java.io.File;
import java.io.IOException;

public class CallRecorderService extends Service {
private static final String TAG = "CallRecorderService";

private ServiceHandler mServiceHandler;
private Looper mServiceLooper;
private TelephonyManager mTelmgr;

public Handler mToastHandler = new Handler();

public static final String ACTION_LISTEN_CALL_STATE =
"com.mobi.bootttest.ACTION_LISTEN_CALL_STATE";

public void onCreate() {
HandlerThread thread = new HandlerThread(TAG, Process.THREAD_PRIORITY_BACKGROUND);
thread.start();
mServiceLooper = thread.getLooper();
mServiceHandler = new ServiceHandler(mServiceLooper);
}

public int onStartCommand(Intent intent, int flags, int startId) {
Message msg = mServiceHandler.obtainMessage();
msg.arg1 = startId;
msg.obj = intent;
mServiceHandler.sendMessage(msg);
return Service.START_STICKY;
}

public IBinder onBind(Intent intent) {
return null;
}

public void onDestory() {
mServiceLooper.quit();
}

private final class ServiceHandler extends Handler {
public ServiceHandler(Looper looper) {
super(looper);
}

public void handleMessage(Message msg) {
Intent intent = (Intent) msg.obj;
if (intent != null) {
if(ACTION_LISTEN_CALL_STATE.equals(intent.getAction())) {
PhoneListener mPhoneListener = new PhoneListener(getApplicationContext());
if(null == mPhoneListener){
mPhoneListener = new PhoneListener(getApplicationContext());
}
mTelmgr =(TelephonyManager)getApplicationContext().getSystemService(
Context.TELEPHONY_SERVICE);
mTelmgr.listen(mPhoneListener, PhoneStateListener.LISTEN_CALL_STATE);
}

}
}
}

private class PhoneListener extends PhoneStateListener {
private Context mContext;
private String number;
private MediaRecorder mRecoder;
public  PhoneListener(Context context){
mContext = context;
}
public void onCallStateChanged(int state,String incomingNumber){
Log.d(TAG,"The state of call is "+String.valueOf(state));
switch (state){
case TelephonyManager.CALL_STATE_IDLE:
Log.d(TAG,"The state is idle");
if(null == mRecoder){
return;
}
mRecoder.stop();
mRecoder.release();
Log.d(TAG,"The state is done");
break;
case TelephonyManager.CALL_STATE_OFFHOOK:
Log.d(TAG,"The state is offhook");
mRecoder = new MediaRecorder();
mRecoder.setAudioSource(MediaRecorder.AudioSource.MIC);
mRecoder.setOutputFormat(MediaRecorder.OutputFormat.DEFAULT);
mRecoder.setAudioEncoder(MediaRecorder.AudioEncoder.DEFAULT);
File file = new File(Environment.getExternalStorageDirectory().getPath(),"XXXX");
if(!file.exists()){
file.mkdirs();
}
mRecoder.setOutputFile(file.getAbsolutePath()+File.separator+number+".amr");
try{
mRecoder.prepare();
mRecoder.start();
Log.d(TAG,"start recording");
}catch (IOException e){
Log.d(TAG,"Recording fails");
mRecoder.reset();
mRecoder.release();
mRecoder = null;
}
break;
case TelephonyManager.CALL_STATE_RINGING:
if(incomingNumber!=null){
number = incomingNumber;
}else{
number = "unknown";
}
Log.d(TAG,"The state is ringing "+incomingNumber);
break;
default:
break;
}
}
}
}


 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Android 通话录音