• 近期在友盟上看到许多关于挂断电话导致崩溃的问题,如下异常
    java.lang.NoSuchMethodError: No interface method endCall()Z in class Lcom/android/internal/telephony/ITelephony; or its super classes (declaration of 'com.android.internal.telephony.ITelephony' appears in /system/framework/framework.jar!classes3.dex)at com.lifesense.ble.tools.PhoneCall.stopCall(PhoneCall.java:45)at com.lifesense.ble.protocol.ProtocolCommand.receivePhoneCommand(ProtocolCommand.java:384)at com.lifesense.ble.protocol.worker.sync.PedometerWorker$2.onCharacteristicChange(PedometerWorker.java:467)at com.lifesense.ble.protocol.worker.BaseDeviceWorker.postCharacteristicChange(BaseDeviceWorker.java:1288)at com.lifesense.ble.system.gatt.BluetoothGattHandler$2.onCharacteristicChanged(BluetoothGattHandler.java:368)at android.bluetooth.BluetoothGatt$1$8.run(BluetoothGatt.java:478)at android.bluetooth.BluetoothGatt.runOrQueueCallback(BluetoothGatt.java:780)at android.bluetooth.BluetoothGatt.access$200(BluetoothGatt.java:41)at android.bluetooth.BluetoothGatt$1.onNotify(BluetoothGatt.java:472)at android.bluetooth.IBluetoothGattCallback$Stub.onTransact(IBluetoothGattCallback.java:306)at android.os.Binder.execTransactInternal(Binder.java:1021)at android.os.Binder.execTransact(Binder.java:994)
  • 此问题是报此方法不存在,查看手机版本信息发现都发生Android10的设备上,网上很少有关于此问题的描述,在现在的实现中,是根据反射系统API来实现挂断电话,但在API29后Google增加了对反射的限制,在高版本继续使用反射会导致更新未知问题。
  • 通过查看资料在高版本上可以TelecomManager来实现挂断电话的需求,此版本在API28及以上才能有效,且需要ANSWER_PHONE_CALLS的权限,在没有权限的情况下会提示SecurityException。
  • 可以根据下面代码进行兼容高版本的问题,在API28及以上使用TelecomManager使用endCall方法来挂断电话,API28及以下使用反射来挂断电话
//在项目中建com.android.internal.telephony包,创建ITelephony.aidl文件,以用反射实现挂断电话功能
package com.android.internal.telephony;interface ITelephony{boolean endCall();void answerRingingCall();}
 /*** 挂断电话   android 9 及以上  可以使用系统api来挂断电话 android 9 及以下 使用反射来挂断电话* @param context* @return*/public static boolean stopCall(Context context) {if(context == null) {return false;}if (Build.VERSION.SDK_INT >= 28) { //android 9及以上商用此方式挂断电话try {if(context.checkSelfPermission(Manifest.permission.ANSWER_PHONE_CALLS) == PackageManager.PERMISSION_GRANTED) {TelecomManager manager = (TelecomManager) context.getSystemService(Context.TELECOM_SERVICE);return manager.endCall();}} catch (Exception e) {e.printStackTrace();}if(Build.VERSION.SDK_INT > 28) {   //android 10 挂断电话使用反射存在NoSuchMethodError问题return false;}}boolean result = false;String msg=null;try {ITelephony iTelephony = getITelephony(context); if(iTelephony==null){msg="failed to hang up,is null";logMessage(msg,false);return false;}// 结束电话result = iTelephony.endCall();if (!result) {boolean isPermiss = PermissionUtils.checkPermission(context, Manifest.permission.CALL_PHONE);logMessage("result false isPermiss:" + isPermiss, false);}msg="telephony end call results="+result;logMessage(msg,result);} catch (Exception e){e.printStackTrace();String className=null;if(e.getClass()!=null){className=e.getClass().getName()+e.getMessage();}result=PermissionUtils.checkPermission(context, Manifest.permission.CALL_PHONE);msg="failed to hang up,has exception >>"+className+"("+result+")";logMessage(msg,false);return false;}return result;}private static ITelephony getITelephony(Context context) {IBinder binder = null;Method method = null;ITelephony telephony=null;try {Class<?> classObj = Class.forName("android.os.ServiceManager");method = classObj.getMethod("getService", String.class);binder = (IBinder) method.invoke(null, new Object[] { "phone" });telephony = ITelephony.Stub.asInterface(binder);} catch (Exception e1) {e1.printStackTrace();String className=null;if(e1.getClass()!=null){className=e1.getClass().getName();}return null;}return telephony;}

Android挂断电话流程相关推荐

  1. Android 5.1 Phone 挂断电话流程分析

    写在前面的话 本文主要分析Android挂断电话的流程,研究的代码是Android 5.1的,以CDMA为例,GSM同理. 挂断电话主要分两种情况: 本地主动挂断电话 \color{red}{本地主动 ...

  2. 远程挂断电话流程分析

    3,远程挂断电话流程分析 3.1 services Telephony 当远程挂断/拒接电话时,GsmCallTracker的handlePollCalls 方法有关代码如下, if (mDroppe ...

  3. Android 7.0 挂断电话流程分析

    1.图形显示 挂断电话分为本地挂断和远程对方挂断 2.本地挂断 1).点击按钮 先看按键的监听事件 CallCardFragment.java 中有对按钮的监听事件 @Overridepublic v ...

  4. android6.0 挂断电话流程分析(一)

    下面是android 6.0挂断电话的流程分析图: 后继续更新挂断回调...........................!

  5. Android挂断电话以及Java Class Loader

    Android中,要自己实现一个挂断电话方法时,很久之前可以endCall().不过现在已经不行了,要应用反射机制,获取到 "android.os.ServiceManager" ...

  6. Android挂断电话代码

    监听来电这里就不贴代码了,这是监听到来电后挂断电话 /*** 通过反射的方式挂断电话*/public void endcall() {try {//获取到ServiceManagerClass< ...

  7. android挂断电话广播,android实现接通和挂断电话

    android实现接通和挂断电话 发布时间:2020-08-21 01:52:02 来源:脚本之家 阅读:230 作者:WillenWu 本文实例为大家分享了android实现接通和挂断电话的具体代码 ...

  8. android蓝牙耳机来电铃声,Android蓝牙耳机接听挂断电话流程

    一.alps/packages/apps/Bluetooth/src/com/android/bluetooth/hfp/HeadsetStateMachine.java image.png proc ...

  9. Android挂断电话最新教程

    1.Android 动态申请权限 首先,需要在AndroidManifest.xml静态申请电话权限,否则无法动态申请权限,以下代码位置不能放错(在application之外): <uses-p ...

最新文章

  1. 【实操】Y7000P 2020款安装黑苹果完整步骤记录
  2. Flink State 误用之痛,你中招了吗?
  3. Microsoft Graph Toolkit 初探
  4. 使用requests模块简单获取数据
  5. 面向大数据处理的数据流编程模型和工具综述
  6. pika集群水平扩展——让性能容量不再受限
  7. HDC.Cloud | 解秘一杯茶的物联之旅
  8. 彻底搞懂 python 中文乱码问题_Python BeautifulSoup中文乱码问题的2种解决方法
  9. qt执行linux sudo命令语句,linux命令_sudo
  10. STM32系列单片机在进入main函数前都在干些什么?
  11. 报表填报时,如何实现多个单元格绑定一个字段?
  12. Java 12 要来了!
  13. 制作nginx的spec分享
  14. 芝加哥大学计算机专业硕士,芝加哥大学计算机硕士录取条件有哪些?_托普仕留学...
  15. 隔离电源模块的5个作用
  16. zipfile — 访问 ZIP 压缩文件
  17. win7计算机虚拟内存,Win7系统怎样关闭虚拟内存?win7关闭虚拟内存的方法
  18. 在外行人眼中的程序员
  19. 数说CS|北大信科保研生源大起底
  20. java web孤傲苍狼,JavaWeb学习笔记

热门文章

  1. 万物互联重新定义“耳朵经济”,荔枝财报透露出什么行业信号?
  2. 知乎简历10年互联网从业经验
  3. 双频段GSM/DCS移动电话射频指标分析
  4. 我的世界服务器无限箱子,MC:服务器这个op漏洞,钻石堆满整个箱子,你不懂单机的乐趣...
  5. Java范例开发大全源程序
  6. 【程序源代码】表白墙-小程序
  7. 迫于无奈,顺丰再进电商市场,可惜已太迟
  8. [科普]3.5mm耳机国标和美标
  9. 高效的HPPC java库
  10. hp服务器如何找回阵列信息,HP服务器数据恢复 RAID5结构实例手工分析