zoukankan      html  css  js  c++  java
  • 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     }
  • 相关阅读:
    linux中压缩、解压缩命令
    linux中的sed指令
    linux中shell编程(一)
    linux中的正则表达式
    linux中的管道和重定向
    linux中用户、组和权限相关指令
    linux中bash常见的指令
    linux文本操作相关指令
    java.lang.OutOfMemoryError 解决程序启动内存溢出问题
    Java常用排序算法/程序员必须掌握的8大排序算法
  • 原文地址:https://www.cnblogs.com/liyiran/p/5175756.html
Copyright © 2011-2022 走看看