【发布时间】:2015-10-01 00:57:08
【问题描述】:
我想通过自动接听电话来使用 Android Lollipop 上的 android.permission.MODIFY_PHONE_STATE,就像 Play 商店中提供的一些免提“驾驶员辅助”应用程序一样。
我从AutoAnswer project 中找到了一些代码,但是当我运行它时,我得到一个 InvocationTargetException 说明“用户 #### 和应用程序都没有 MODIFY_PHONE_STATE 权限。”
但是,在我的清单中,我有:<uses-permission android:name="android.permission.MODIFY_PHONE_STATE" /> 并且我已将我的 apk 安装到 /system/app/AutoAnswer.apk 并将其权限设置为 644。
要求是我不需要为手机扎根即可工作,但我确实能够将我的应用程序添加到自定义 ROM(因此它是一个系统应用程序)。
调用代码如下:
TelephonyManager tm = (TelephonyManager)context.getSystemService(Context.TELEPHONY_SERVICE);
Class c = Class.forName(tm.getClass().getName());
Method m = c.getDeclaredMethod("getITelephony");
m.setAccessible(true);
Object telephonyService = m.invoke(tm);
Method m1 = telephonyService.getClass().getMethod("silenceRinger");
Method m2 = telephonyService.getClass().getMethod("answerRingingCall");
//m1.invoke(telephonyService); // not supported for OnePlus2
m2.invoke(telephonyService); // <- This is the line that throws the error
为什么不允许我从我的系统应用程序中使用 MODIFY_PHONE_STATE..?有解决办法吗?
【问题讨论】:
-
它是否由与您的 ROM 签名相同的签名签名?两者都应该由同一人签名。将 apk 推送到 /system/ 不足以使应用程序成为系统应用程序。
-
不,它没有使用相同的签名进行签名。 MODIFY_PHONE_STATE 被标记为“signatureOrSystem”所以我读这个要么由相同的签名签名,要么是从系统应用程序运行的..? android.googlesource.com/platform/frameworks/base/+/…
标签: android root android-hardware