如何实现挂断电话?
在安卓1.5版本以前,TelephonyManager 类有一个endCall方法可以直接调用就可以实现挂断电话的功能了,不过在这之后出于安全考虑,这个方法被阉割了。那么在1.5之后要如果要实现自动挂断电话,就必须通过aidl来实现,其实1.5之前endCall方法也是通过这样实现的。
在TelephoneManager的源代码中有一个方法如下:
private ITelephony getITelephony() {
return ITelephony.Stub.asInterface(ServiceManager.getService(Context.TELEPHONY_SERVICE));
}
这就是获取远程服务的方法。
进一步我们在ITelephony.aidl文件中找到:
/**
* End call or go to the Home screen
*
* @return whether it hung up
*/
boolean endCall();
只要在响铃状态下调用该方法,就可以挂断电话了。
所以我们要获取ITelephony的实例,但getITelephony()是私有方法不能直接调用,所以我们要调用下面的代码直接获取ITelephony实例
ITelephony.Stub.asInterface(ServiceManager.getService(Context.TELEPHONY_SERVICE));
ServiceManager.getService(Context.TELEPHONY_SERVICE),获取一个Ibinder对象。查看ServiceManager的源码你会发现,这个类是隐藏的,不能new一个对象,这该怎么办?答案是用反射机制,代码如下
Class clazz = Class.forName("android.os.ServiceManager");
Method method = clazz.getDeclaredMethod("getService", String.class);
IBinder binder = (IBinder) method.invoke(null, Context.TELEPHONY_SERVICE);
ITelephony iTelephony =ITelephony.Stub.asInterface(binder);
这样就成功的获取到了ITelephony对象,接下来只要监听通话状态,在响铃状态时调用:
iTelephony.endCall();
就可以实现自动挂断电话功能啦!