博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
android 之通话录音
阅读量:4595 次
发布时间:2019-06-09

本文共 5200 字,大约阅读时间需要 17 分钟。

在进行电话录音中,我们需要监听Phone的状态,通过PhoneStateListener 对phone的状态判断当前通话中的各种状态,根据状态进行对应的处理,

1,注册phone状态Receiver

 

 这里使用service进行具体实现

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

 录音处理:

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);
可以录制上下行端口的通话语音

注册服务:

 

以上是以电话号和日期命名的录音文件,可以改成已联系人进行命名这样会方便查看文件。

最后别忘记加权限

 

 

 

转载于:https://www.cnblogs.com/happyxiaoyu02/archive/2012/11/06/6818971.html

你可能感兴趣的文章
VirtualBox 下 CentOS6.5 网络配置(NAT) (公司内部用)
查看>>
面向对象三大基本特性,五大基本原则
查看>>
User32.dll 函数的相关方法整理
查看>>
Bootstarp 水平垂直居中
查看>>
LInux Centos7 重装yum
查看>>
HDU 3802Ipad,IPhone
查看>>
高德坐标转百度坐标并导航
查看>>
mpvue配合less
查看>>
查询一个表的不同数据,显示到一个表
查看>>
Unity随手记
查看>>
Swagger入门教程
查看>>
nginx日志定时切割脚本
查看>>
HashSet的实现原理
查看>>
oracle创建简单的包
查看>>
[POJ2689]Prime Distance
查看>>
python连接zookeeper的日志问题
查看>>
pycharm上传代码到码云错误现象用户密码
查看>>
柔性数组-读《深度探索C++对象模型》有感
查看>>
rmdir 命令(转)
查看>>
生产者消费者
查看>>