Android - 为什么endCall方法有效但answerRingingCall不起作用?

时间:2014-02-05 17:35:15

标签: android call

我使用以下代码处理来自服务的来电。当我调用endCall方法(我的手机的Android版本是ICS)时它完美地工作。但是当我调用answerRingingCall方法时,我得到一个例外,因为没有权限修改手机状态。我知道Google一度撤销了此权限,但由于我可以调用结束调用方法,因此无法调用应答调用方法的原因是什么?我的意思是......两种方法都会修改手机的状态,那么它是什么?有办法解决这个问题吗?

   try {
        TelephonyManager tm = (TelephonyManager)getBaseContext().getSystemService(Context.TELEPHONY_SERVICE);
        Class c = Class.forName(tm.getClass().getName());
        Method m = c.getDeclaredMethod("getITelephony");
        m.setAccessible(true);
        Object telephonyService = m.invoke(tm); // Get the internal ITelephony object
        c = Class.forName(telephonyService.getClass().getName()); // Get its class
        m = c.getDeclaredMethod("endCall"); // Get the "endCall()" method
        m.setAccessible(true); // Make it accessible
        m.invoke(telephonyService); // invoke endCall()
    }
    catch (Exception e) {
        Log.w("exception",e);
    }

1 个答案:

答案 0 :(得分:0)

如果我不得不猜测,我会在Phone.apk内部的com.android.phone.PhoneInterfaceManager的OEM版本中说,endCall函数不会调用enforceCallPermission();在发送结束通话的请求之前。

在answerRingingCall函数中调用enforceCallPermission();

您可以尝试访问私有方法的hack,在ITelephony对象上,可以访问true的sendRequestAsync集,然后使用4作为输入参数调用它,即CMD_ANSWER_RINGING_CALL。

这样可以避免权限检查。