通过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();

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值