在进行电话录音中,我们需要首先要继承PhoneStateListener 对电话的状态进行处理,注册电话状态广播,但是这些还不够因为监听是时时的,这句需要一个时刻对电话状态进行时时监听的类,那就是service,废话少说先看代码:
电话状态广播:
package com.internal.telephony; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; public class TelReceiver extends BroadcastReceiver { final String tel="android.intent.action.PHONE_STATE"; @Override public void onReceive(Context context, Intent intent) { if(intent!=null){ if(intent.getAction().equals(tel)){ Intent i=new Intent("com.tel.listner"); context.startService(i); } } } }
注册广播:
<receiver android:name="com.internal.telephony.TelReceiver" android:enabled="true"> <intent-filter> <action android:name="android.intent.action.NEW_OUTGOING_CALL"/> <action android:name="android.intent.action.PHONE_STATE"/> <action android:name="android.intent.action.CAL"/> </intent-filter> </receiver>
package com.internal.telephony; import java.io.File; import java.io.IOException; import java.text.SimpleDateFormat; import java.util.Date; import android.app.Service; import android.content.ContentResolver; import android.content.Context; import android.content.Intent; import android.database.Cursor; import android.media.MediaRecorder; import android.os.Environment; import android.os.IBinder; import android.provider.ContactsContract; import android.telephony.PhoneStateListener; import android.telephony.TelephonyManager; import android.util.Log; public class TelListenner extends Service{ private final String tag="com.tel.listner"; @Override public void onCreate() { /* 取得电话服务 */ TelephonyManager telManager = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE); TelListner listener = new TelListner() ; // 监听电话的状态 telManager.listen(listener, PhoneStateListener.LISTEN_CALL_STATE); super.onCreate(); } @Override public void onDestroy() { super.onDestroy(); } class TelListner extends PhoneStateListener{ private String number;//定义一个监听电话号码 private boolean isRecord;//定义一个当前是否正在复制的标志 private MediaRecorder recorder;//媒体复制类 @Override public void onCallStateChanged(int state, String incomingNumber) { switch (state) { case TelephonyManager.CALL_STATE_IDLE:/* 无任何状态 */ number = null; if (recorder != null && isRecord) { Log.e("msg", "record ok"); recorder.stop();//录音完成 recorder.reset(); recorder.release(); isRecord = false;//录音完成,改变状态标志 } break; case TelephonyManager.CALL_STATE_OFFHOOK:/* 接起电话 */ // 录制声音,这是录音的核心代码 number=incomingNumber; Log.e("msg", "recording"); recorder = new MediaRecorder(); recorder.setAudioSource(MediaRecorder.AudioSource.MIC);// 定义声音来自于麦克风 recorder.setOutputFormat(MediaRecorder.OutputFormat.DEFAULT);//存储格式 recorder.setAudioEncoder(MediaRecorder.AudioEncoder.DEFAULT);//设置编码 SimpleDateFormat format = new SimpleDateFormat("yy-MM-dd-HH:mm:ss");//此处定义一个format类,方便对录音文件进行命名 String fileName = number + "_" + format.format(new Date()); File file=new File(Environment.getExternalStorageDirectory(),"myapp"); if(!file.exists()){ file.mkdirs(); } recorder.setOutputFile(file.getAbsolutePath()+File.separator+fileName + ".amr"); try { recorder.prepare(); recorder.start(); // 开始刻录 isRecord = true; } catch (IllegalStateException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } break; case TelephonyManager.CALL_STATE_RINGING:/* 电话进来 */ Log.e("msg", "coming"); number = incomingNumber; getContactPeople(incomingNumber); break; default: break; } } } /** * 根据来电号码查找联系人 * @param incomingNumber */ private void getContactPeople(String incomingNumber){ ContentResolver contentResolver = getContentResolver(); Cursor cursor = null; //查询字段名称 String[] projection = new String[]{ ContactsContract.Contacts._ID, ContactsContract.Contacts.DISPLAY_NAME, ContactsContract.CommonDataKinds.Phone.NUMBER }; //根据电话号码查找该联系人 cursor = contentResolver.query( ContactsContract.CommonDataKinds.Phone.CONTENT_URI, projection, ContactsContract.CommonDataKinds.Phone.NUMBER + "=?", new String[] { incomingNumber }, null); /* 找不到联系人 */ if (cursor.getCount() == 0){ Log.e("msg", "unknown Number:" + incomingNumber); } else if (cursor.getCount() > 0){ cursor.moveToFirst(); String name = cursor.getString(1); Log.e("msg", name+" :" + incomingNumber); } cursor.close(); cursor=null; } @Override public IBinder onBind(Intent arg0) { return null; } }
录音还开可这样设置
MediaRecorder recorder = new MediaRecorder();
recorder.setAudioSource(MediaRecorder.AudioSource.VOICE_CALL);
可以录制上下行端口的通话语音
注册服务:
<service android:name="com.internal.telephony.TelListenner"> <intent-filter> <action android:name="com.tel.listner"/> </intent-filter> </service>
以上是以电话号和日期命名的录音文件,可以改成已联系人进行命名这样会方便查看文件。
最后别忘记加权限呀!
<uses-permission android:name="android.permission.RECORD_AUDIO"/> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>