继续浏览精彩内容
慕课网APP
程序员的梦工厂
打开
继续
感谢您的支持,我会继续努力的
赞赏金额会直接到老师账户
将二维码发送给自己后长按识别
微信支付
支付宝支付

android开发中的反射方法的使用案列

繁华开满天机
关注TA
已关注
手记 134
粉丝 15
获赞 68

我做的是电话黑名单的拦截,但是在调用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();

以上会有异常,统一抓就行拉。

原文链接:http://www.apkbus.com/blog-846519-61638.html

打开App,阅读手记
0人推荐
发表评论
随时随地看视频慕课网APP