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 }