从1.5版本后,挂断电话的api被隐藏起来了.通过查询2.0版本的安卓api源码可知,
再通过反射拿到当前方法getService()
调用这个方法获得代理,getService的返回值为IBinder对象 即TelephonyManager
TelephonyManager(电话管理器)是一个安卓的一个API,其有一个私有的方法为getITelephony(),返回值为itelephony接口类型;而itelephony是一个接口.其有一个挂断电话的方法.
private ITelephony getITelephony() {
return ITelephony.Stub.asInterface(ServiceManager.getService(Context.TELEPHONY_SERVICE));
}itelephony的挂断电话的方法:
public boolean endCall() throws android.os.RemoteException;分析步骤:首先需要获得itelephony,将以下代码放入ADT中,想要获取返回值itelephony,但是ServiceManager报错,ServiceManager获取不到.
return ITelephony.Stub.asInterface(ServiceManager.getService(Context.TELEPHONY_SERVICE));
于是通过反射调用,通过类加载器拿到ServiceManager的字节码文件
Class clazz=getClassLoader().loadClass("android.os.ServiceManager");
再通过反射拿到当前方法getService()
Method method =clazz.getDeclaredMethod("getService", String.class);//第一个参数为要获取的方法名,第二个参数为什么类型的字节码文件调用这个方法获得代理,getService的返回值为IBinder对象 即TelephonyManager
IBinder iBinder = (IBinder) method.invoke(null, Context.TELEPHONY_SERVICE);挂断电话需要用到AIDL,拷贝需要用到的AIDL文件,ITelephony.aidl和NeighboringCellInfo.aidl,包名要与原包名一致
把代理人对象转成一个接口类型
iTelephony.endCall();
...未完待续...
这篇博客探讨了如何在Android系统中利用TelephonyManager的私有方法getITelephony()来获取itelephony接口,并通过反射调用ServiceManager以实现电话挂断功能。由于直接调用会报错,因此需要借助AIDL(Android Interface Definition Language)来处理。博主详细介绍了处理过程,包括引入必要的AIDL文件和将代理人对象转换为接口类型,最终调用itelephony的endCall()方法来挂断电话。

460

被折叠的 条评论
为什么被折叠?



