手机自动挂断电话

这篇博客探讨了如何在Android系统中利用TelephonyManager的私有方法getITelephony()来获取itelephony接口,并通过反射调用ServiceManager以实现电话挂断功能。由于直接调用会报错,因此需要借助AIDL(Android Interface Definition Language)来处理。博主详细介绍了处理过程,包括引入必要的AIDL文件和将代理人对象转换为接口类型,最终调用itelephony的endCall()方法来挂断电话。
从1.5版本后,挂断电话的api被隐藏起来了.通过查询2.0版本的安卓api源码可知,

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 iTelephony =ITelephony.Stub.asInterface(iBinder);

 iTelephony.endCall();


...未完待续...

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值