最近 经过一段时间研究了Android来去电并且录音的研究,特此作为记录

首先监听来去电并且可以录音得有以下权限:

//录音权限
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.CAPTURE_AUDIO_OUTPUT" />
<!-- 要存储文件或者创建文件夹的话还需要以下两个权限 -->
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.PROCESS_OUTGOING_CALLS" />
//读取系统日志
<uses-permission android:name="android.permission.READ_LOGS" />

前置条件,如果有录制双向声音的需求,必须手机获取root权限,且应用作为系统应用才可,因为CAPTURE_AUDIO_OUTPUT,READ_LOGS必须是系统级应用才可以。网上很多方案说配置文件加sharedid什么的然后用系统签名apk文件,各位看官这都是扯蛋。实现难度太大,去哪整每个系统的签名?如果已经获取了root权限 完全可以代码内判断/system/priv-app文件夹下是否存在自己应用文件夹是否存在,不存在移动整个文件夹到/system/priv-app,然后代码执行重启手机命令后您的应用就是系统级应用了。此处就不进行代码叙述,重点讲述来去电监听。

流程:首先建立service开启监听来去电服务,用TelephonyManager提供的PhoneStateListener监听来电接通状态跟电话挂断状态。用广播监听去电开始(未接通)的状态。当开始去电时,开启线程读取系统日志,当获取到去电接通的日志(不同机型日志不同)时返回去电接通状态。以上是我来去电状态获取的流程。在来去电接通时开启录音,电话挂断监听处停止录音即可。

一、建立service开启监听

private TelephonyManager mTelephonyManager;
private CallListener mCallListener = new CallListener(new CallListener.OnIncomingListener() {@Overridepublic void incomingOn(String number) {//来电接通,开启录音startRecord(number)}
}, new TelListener.OnCallOffStateListener() {@Overridepublic void off() {//电话挂断,不分来去电,停止录音stopRecord()}
});@Override
public void onCreate() {super.onCreate();mTelephonyManager = (TelephonyManager) this.getSystemService(Context.TELEPHONY_SERVICE);mTelephonyManager.listen(mCallListener, PhoneStateListener.LISTEN_CALL_STATE);
}@Override
public int onStartCommand(Intent intent, int flags, int startId) {if ("outgoingAction".equals(intent.getAction())) {String number = intent.getStringExtra("outgoingNumber");
//开启读取日志,获取去电状态if (mOutGoingLogThread == null) {mOutGoingLogThread = new OutGoingLogThread(CallService.this, new OutGoingLogThread.OutGoingListener() {@Overridepublic void outGoingOn() {
//去电接通了 开启录音startRecord(number)}});}mOutGoingLogThread.start();}return START_REDELIVER_INTENT;
}

二、来电监听:

public class CallListener extends PhoneStateListener {
//上个电话状态,当上个状态为响铃,当前状态为OFFHOOK时即为来电接通private int mLastState = TelephonyManager.CALL_STATE_IDLE;private OnIncomingListener mOnIncomingListener;private OnCallOffListener mOnCallOffListener;
//来电号码private String mIncomingNumber;public TelListener(OnIncomingListener listener, OnCallOffListener callOffistener) {this.mOnIncomingListener = listener;this.mOnCallOffListener = callOffListener;}@Overridepublic void onCallStateChanged(int state, String incomingNumber) {switch (state) {case TelephonyManager.CALL_STATE_IDLE: // 空闲状态,即无来电也无去电if (mLastState == TelephonyManager.CALL_STATE_OFFHOOK&&mOnCallOffListener!=null) {mOnCallOffListener.off();}break;case TelephonyManager.CALL_STATE_RINGING: // 来电响铃mIncomingNumber = String.valueOf(incomingNumber);break;case TelephonyManager.CALL_STATE_OFFHOOK: // 摘机,即接通//此处添加一系列功能代码if (mLastState == TelephonyManager.CALL_STATE_RINGING && mOnIncomingListener != null) {mOnIncomingListener.incomingOn(mIncomingNumber);}break;}mLastState = state;super.onCallStateChanged(state, incomingNumber);}
//来电接通 public interface OnIncomingListener { void incomingOn(String number); } //电话挂断监听,不分来去电 public interface OnCallOffListener { void Off(); }
}  

三、去电监听:

开启广播:

public class OutGoingReceiver extends BroadcastReceiver {@Overridepublic void onReceive(Context context, Intent intent) {//只获取去电广播if (intent.getAction().equals(Intent.ACTION_NEW_OUTGOING_CALL)) {String number = intent.getExtras().getString(Intent.EXTRA_PHONE_NUMBER);Intent intent1 = new Intent();intent1.putExtra("outgoingNumber", number);intent1.setAction("outgoingAction");intent1.setClass(context, CallService.class);context.startService(intent1);}}
}

去电日志获取线程:

 //系统通话信息的TAG,不同机型TAG不同,自己获取public final static String LOG_TAG="your phone system phone call tag";//日志里接通的信息,不同机型信息不同,自己研究获取public final static String OUTGOING_ON="call_state = 5";

@Override
public void run() {
mIsRunning = true;
Process process = null;
BufferedReader bufferReader=null;
try {
//此处尤为注意!!!读取日志前如果不清理日志,会获取缓存区域的日志,导致不是最新实时日志,影响本次判断
//网上很多清理日志时没调用waitFor(),经测试根本无法及时清理日志,所以必须调用
Runtime.getRuntime().exec("logcat -c").waitFor();
//获取系统指定TAG日志
String cmd = "logcat -b system -s "+LOG_TAG;
process = Runtime.getRuntime().exec(cmd);
bufferReader = new BufferedReader(new InputStreamReader(process.getInputStream()));
String line = null;
while (mIsRunning && (line = bufferReader.readLine()) != null) {
if (line.contains(OUTGOING_ON)) {
if (mOutGoingListener != null) {
mOutGoingListener.outGoingOn();
}
mIsRunning = false;
Log.d(TAG, "去电接通");
}
}
} catch (IOException e) {
} catch (InterruptedException e) {
} finally {
try {
if (bufferReader != null) {
bufferReader.close();
}
if (process != null) {
process.destroy();
}
} catch (IOException e) {
}

}
}

四:总结

以上就是本次来去电状态获取的部分代码,其中注释部分尤为注意,就是我掉进去的坑。其中没叙述录音的实现,网上借助mediarecoder很多录音方法,此处不在叙述

Android监听来去电通话录音真正可实行方案,可获取电话接通时状态相关推荐

  1. android 监听来电去电,Android监听来电和去电的实现方法

    本文实例讲述了Android监听来电和去电的实现方法.分享给大家供大家参考,具体如下: 要监听android打电话和接电话,只需下面2步骤 第一步,写一个Receiver继承自BroadcastRec ...

  2. android监听来电去电广播

    转http://www.cnblogs.com/pen-ink/archive/2010/12/20/1911957.html 要监听android打电话和接电话,只需下面2步骤 1.第一步,写一个R ...

  3. Android 监听来去电状态的实现

    本文授权发布公众号[刘桂林],星球[Hi Android] 在Android中我们想要实现监听电话状态一般都会通过TelephonyManager来监听,他提供了一个PhoneStateListene ...

  4. Android 监听手机来电和去电

    1.继承BroadcastReceiver,监听来去电状态 package com.example.callphonetest.receiver;import android.app.Service; ...

  5. android监听通话状态

    samsung提审结果报告里: application sound is audible during the call in pop up window //在弹出窗口中的呼叫期间,<缺陷&g ...

  6. Android监听button按钮的click事件

    方式一: 提供所有按钮监听事件入口,在OnClick方法中通过View.getId()获取到发生点击事件的按钮Id,再进行相应的处理, 在页面有多个按钮的情况下比较适用. package com.ex ...

  7. Android 监听 WiFi 开关状态

    Android 监听 WiFi 开关状态 转载请标明出处:http://blog.csdn.net/zhaoyanjun6/article/details/70854309 本文出自[赵彦军的博客] ...

  8. android 监听手机电量变化

    今天,简单讲讲如何监听手机电量的变化. 监听电量是不能静态注册的. 后来上网搜索,发现有五个不能静态注册的广播,这里记录一下,免得下次再后知后觉的发现并惊讶于自己的笨拙. 不能静态注册的广播: and ...

  9. android 监听手机开机

    今天,简单讲讲  android 监听手机开机. 需求描述:有些时候,我们需要我们的程序在开机后能自动运行,在系统即将关闭时,能写入一些记录到指定的文件里. 一.开机广播监听: Android系统 ...

最新文章

  1. mobaxterm最多10个链接_短袖、纱裙、泳衣…百元左右夏季童装,我回购最多的10个品牌...
  2. python mysql 转义方法
  3. Jenkins集成java非maven/ant项目的打包思路
  4. linux 路由表 的一些相关资料
  5. 无废话XML--XML约束(DTD)
  6. 惊艳!28岁就任副教授,“最美女教授”年纪轻轻已是博导、院长
  7. Win7系统隐藏文件恢复的方法
  8. mysql怎么绿化绿化_Windows下MySQL的绿化与精简
  9. C++中的异常处理(上)
  10. JSON字符串和JSON对象的相互转换
  11. 微信如何屏蔽别人发来的消息,如何屏蔽微信消息
  12. git提交 [rejected] fetch first 解决办法
  13. 微信小程序使用canvas绘制分享海报
  14. 毛概(毛中特)期末/考研复习笔记——导论
  15. 事务隔离级别脏读幻读_脏读和未提交读隔离级别
  16. nvim代码格式化插件formatter.nvim
  17. 如何进入VMware Fusion虚拟机BIOS
  18. 支付宝员工因绩效3.25B被辞退,员工告上法院,结果来了!
  19. Google earth engine的python版安装:GEEMAP
  20. 校花干得土得掉渣的事

热门文章

  1. 3款国产软件,让你工作效率翻倍,白嫖党的最爱,还不来看
  2. ear的英语怎么念_ear怎么读
  3. CRFHMM模型——理论
  4. Excel透视表如何新增自定义列以及设置值汇总方式和值呈现方式
  5. 普通人怎么在一年内赚到100万?
  6. 最近爆火的ChatGPT是什么?
  7. 如何在Windows 10上隐藏任务栏
  8. 生产部门如何快速应对订单变更?订单变更管理方案
  9. 小鱼游泳时间(C语言)
  10. 解决SysFader:iexplore.exe应用程序错误