• Android开发之通过反射获取到挂断电话的API


    Android开发黑名单工具类,需要用到挂断电话的API,但是该API处于隐藏状态,需要通过反射得到该方法。、

    步骤:

    1.通过当前类获取到ServiceManager的字节码

    Class< ? > clazz = CallSafeService.class.getClassLoader().loadClass("android.os.ServiceManager");

    2.使用getDeclaredMethod()方法得到该方法

    Method method = clazz.getDeclaredMethod("getService", String.class);

    3.通过invoke()方法执行该方法,获取到IBinder对象

    IBinder ibinder = (IBinder) method.invoke(null, TELEPHONY_SERVICE);

    4.获取到了IBinder对象了,就可以得到ITelephony方法

    ITelephony iTelephony = ITelephony.Stub.asInterface(ibinder);

    5.使用ITelephony中的endCall()方法,实现挂断电话的功能。

    iTelephony.endCall();

    其中需要把android的AIDL拷贝到当前工程下,且ITelephony.aidl的包名必须保持一致

    ITelephony.aidl包名:com.android.internal.telephony

    ITelephony.aidl还需要用到NeighboringCellInfo.aidl文件,把这个文件也拷贝到当前工程下

    NeighboringCellInfo.aidl包名:android.telephony

    然后就可以使用了挂断电话功能了。

    代码:

     1     private void endCall() {
     2         /**该方法使用反射,获取到SystemManger的方法getService()
     3          * SystemManger隐藏了,无法直接使用。需要使用反射
     4          *IBinder iBinder=SystemManger.getService(TELEPHONY_SERVICE);
     5          */
     6         try {
     7             //获取到systemmanger的字节码
     8             Class< ? > clazz = CallSafeService.class.getClassLoader().loadClass("android.os.ServiceManager");
     9             //获取到该方法,参数1:方法名,参数2:该方法需要传入参数的类型
    10             Method method = clazz.getDeclaredMethod("getService", String.class);
    11             try {
    12                 //使用该方法,参数1:该方法的执行者,static可以设置为null    参数2:该方法的参数
    13                 IBinder ibinder = (IBinder) method.invoke(null, TELEPHONY_SERVICE);
    14                 //通过iBinder获取到ITelephony对象,然后就可以调用ITelephony的endCall()方法了。
    15                 ITelephony iTelephony = ITelephony.Stub.asInterface(ibinder);
    16                 try {
    17                     //挂断电话
    18                     iTelephony.endCall();
    19                 } catch ( RemoteException e ) {
    20                     e.printStackTrace();
    21                 }
    22             } catch ( IllegalAccessException e ) {
    23                 e.printStackTrace();
    24             } catch ( InvocationTargetException e ) {
    25                 e.printStackTrace();
    26             }
    27         } catch ( ClassNotFoundException e ) {
    28             e.printStackTrace();
    29         } catch ( NoSuchMethodException e ) {
    30             e.printStackTrace();
    31         }
    32     }
  • 相关阅读:
    CSS中文API
    廖雪峰Git教程
    数据操作的几个名词即model、dal、dao、orm和ar 解释
    Jetty
    Git介绍与使用
    c3p0、dbcp、druid三大连接池对比
    (转)JavaWeb——Servlet(全网最详细教程包括Servlet源码分析)
    08 bash特性--shell脚本编程入门
    07 grep命令与正则表达式
    06 I/O重定向与管道符
  • 原文地址:https://www.cnblogs.com/liyiran/p/5175756.html
Copyright © 2020-2023  润新知