在进行电话录音中,我们需要首先要继承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"/>



更多相关文章

  1. android 点击效果动画增强
  2. android 状态栏颜色的改变
  3. Android(安卓)自定义View 实现手势监听,左右滑动,上下滑动
  4. webview获取Url高度
  5. android 状态栏字体颜色设置 黑色 anctivity+dialog
  6. Android(安卓)监听屏幕锁屏,用户解锁
  7. Android判断网络是否连接
  8. android Button的应用
  9. Android之--电话归属地的悬浮框的…

随机推荐

  1. 自学第五十二天
  2. 华为交换机开启Telnet服务及修改端口
  3. 【前端词典】Vuex 注入 Vue 生命周期的过
  4. 初次见面,请多关注
  5. 写独立个人博客,还有机会吗?
  6. 【前端词典】如何向老板解释反向代理
  7. 25条很棒的Python一行代码,建议收藏!
  8. Ansible 之 配置文件解析
  9. 【前端词典】学习 Vue 源码的必要知识储
  10. 搭建个人博客,我遇到哪些棘手的问题?