关于获取手机通话状态获取方式,请参考其他文档,此文不做介绍。
1.非ROOT手机
反射方法
通过AIDL和放射的方式实现电话挂断,是网上使用最多的方法。
首先我们需要创建一个aidl文件,包路径为:com.android.internal.telephony;
文件的内容如下:
实现挂断的代码如下:
存在问题:
部分手机移动联通正常使用,电信手机无法挂断,反射方法也无异常抛出
辅助功能(无障碍)
辅助功能就不做介绍
请记得提前开启辅助功能
辅助功能实现挂断电话的操作如下几种:
1.通过打开通话界面“挂断”按钮
2.通过打开任务栏,点击通话选项中的“挂断”字样实现挂断
此方案需要根据不同手机实现做不同的适配。
辅助功能的实现,这里不做太多的介绍。
获取通话挂断按键id的方法
- 先找到monitor.bat文件,AS在对应sdk路径如下(实在找不到,下载“Everything”去搜索):
- 打开monitor.bat文件,进入如下界面,判断手机是否正常连接
- 让手机处于通话状态(ps:测试过程可以通过打运营客服,免费),点击红色圈圈里面的按钮
- 通过按键的id(com.android.incallui:id/endButton)获取到AccessibilityNodeInfo,然后调用点击方法
2.ROOT手机
root手机拥有更多的权限可以执行“su”命令
执行su命令的框架可以参考github上面有个Superuser
主要实现挂断电话方式
1.模拟耳机媒体按键实现电话挂断(input keyevent 79)
2.部分手机可以使用service获取通话服务(service call phone code)
code的获取方法(接听code将“endcall”换成“answer”):
3.模拟屏幕点击
由于root可以根据屏幕坐标点位置进行点击,长按,拖拽等操作
很多界面是不能通过辅助功能t获取到控件信息
此时就需要通过屏幕点击命令执行操作(input tap X Y)X,Y分别表示当前控件在屏幕中的位置
获取屏幕控件坐标的方法,“开发者选项”打开“指针位置”(不同手机功能名不同),如下
如图,直接调用命令执行(input tap 544 1934)实现点击挂断。
辅助功能和屏幕点击方式只有在其他方式都无法满足需求的时候才考虑
因为它的弊端很明显:
1.每个手机都需要做不同的适配
2.操作比较麻烦,实现流程繁琐
3.不少手机会出现自动关闭辅助功能
4.不可控因素太多,人工手动息屏、切换界面或者系统弹窗会影响界面监听和点击
5.监听的软件版本升级,对应的AccessibilityNodeInfo也会改变,需要重新适配