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     }

 

转载于:https://www.cnblogs.com/liyiran/p/5175756.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值