在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; } } } }