我使用以下代码处理来自服务的来电。当我调用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);
}
答案 0 :(得分:0)
如果我不得不猜测,我会在Phone.apk内部的com.android.phone.PhoneInterfaceManager的OEM版本中说,endCall函数不会调用enforceCallPermission();在发送结束通话的请求之前。
在answerRingingCall函数中调用enforceCallPermission();
您可以尝试访问私有方法的hack,在ITelephony对象上,可以访问true的sendRequestAsync集,然后使用4作为输入参数调用它,即CMD_ANSWER_RINGING_CALL。
这样可以避免权限检查。