android 之通话录音
16lz
2021-01-26
在进行电话录音中,我们需要首先要继承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";@Overridepublic 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";@Overridepublic void onCreate() {/* 取得电话服务 */ TelephonyManager telManager = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE); TelListner listener = new TelListner() ; // 监听电话的状态 telManager.listen(listener, PhoneStateListener.LISTEN_CALL_STATE); super.onCreate();}@Overridepublic void onDestroy() {super.onDestroy();}class TelListner extends PhoneStateListener{private String number;//定义一个监听电话号码 private boolean isRecord;//定义一个当前是否正在复制的标志 private MediaRecorder recorder;//媒体复制类 @Overridepublic 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; }@Overridepublic 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"/>
更多相关文章
- android 点击效果动画增强
- android 状态栏颜色的改变
- Android(安卓)自定义View 实现手势监听,左右滑动,上下滑动
- webview获取Url高度
- android 状态栏字体颜色设置 黑色 anctivity+dialog
- Android(安卓)监听屏幕锁屏,用户解锁
- Android判断网络是否连接
- android Button的应用
- Android之--电话归属地的悬浮框的…