我做的是电话黑名单的拦截,但是在调用endcall方法的时候是不行的,servicemanager对android开发者隐藏,所以不能直接调方法,要用反射的机制。
// ITelephony.Stub.asInterface(ServiceManager.getService(Context.TELEPHONY_SERVICE));
我要做的就是得到上述代码的返回方法,然后才能调用隐藏在aidl中的endcall()方法。
1:将有关的aidl文件拷贝到自己的项目工程中去。NeighboringCellInfo.aidl和NeighboringCellInfo.aidl,这两个是我所需要的。
2. // 1.获取ServiceManager的字节码文件
Class<?> clazz = Class.forName("android.os.ServiceManager");
android.os.ServiceManager对应的是ServiceManager,因为不能引入包,所以只能用反射的方式导包。
import android.app.Service; -----------这个是要导入的包,对应下面的包的话
//import android.os.ServiceManager;
什么是字节码文件:字节码文件是经过编译器预处理过的一种文件,是JAVA的执行文件存在形式,它本身是二进制文件,但是不可以被系统直接执行,而是需要虚拟机解释执行,由于被预处理过,所以比一般的解释代码要快,但是仍然会比系统直接执行的慢。
3. // 获取方法,参数1是方法的名称,参数2是方法里面的参数的类型,可以返回源码去看。
method = clazz.getMethod("getService", String.class);
4.//反射调用此方法 看源码返回的是什么类型
IBinder ibinder=(IBinder) method.invoke(null, Context.TELEPHONY_SERVICE);
//调用aidl的文件方法
ITelephony iTelephony = ITelephony.Stub.asInterface(ibinder);
//调用aidl中隐藏的endcall方法
iTelephony.endCall();
以上会有异常,统一抓就行拉。