通过aidl实现挂断电话

如何实现挂断电话?

在安卓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();

就可以实现自动挂断电话功能啦!

你可能感兴趣的:(android,aidl)