我制作了一个应用程序来阻止一些来电。该应用程序似乎运行良好并完成了工作。 但是最近我尝试在android 8.0手机上崩溃了。
java.lang.SecurityException: MODIFY_PHONE_STATE permission required.
at android.os.Parcel.readException(Parcel.java:2005)
at android.os.Parcel.readException(Parcel.java:1951)
at com.android.internal.telephony.ITelephony$Stub$Proxy.endCall(ITelephony.java:2027)
at java.lang.reflect.Method.invoke(Native Method)
at anywheresoftware.b4a.agraham.reflection.Reflection.runmethod(Reflection.java:216)
at anywheresoftware.b4a.agraham.reflection.Reflection.RunMethod(Reflection.java:802)
因此,Android 8.0似乎需要MODIFY_PHONE_STATE权限。
我试图在清单上添加权限或在运行时询问。没有运气。
@Override
public void onCallStateChanged(int state, String incomingNumber) {
switch (state) {
case TelephonyManager.CALL_STATE_RINGING:
numberGlobal = incomingNumber;
//Turn ON the mute in case we have to block the call)
AudioManager audioManager = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE);
audioManager.setStreamMute(AudioManager.STREAM_RING, true);
if (hasToBeBlocked()) {
try {
Method method = telephonyManager.getClass().getDeclaredMethod("getITelephony");
method.setAccessible(true); // true
telephonyService = (ITelephony) method.invoke(telephonyManager);
telephonyService.silenceRinger();
telephonyService.endCall(); // Crashes here only on android 8.0
showToast("Ending Call");
} catch (Exception e) {
Toast.makeText(context, "AQUI: " + e.toString(), Toast.LENGTH_LONG).show();
}
}
//Turn OFF the mute
audioManager.setStreamMute(AudioManager.STREAM_RING, false);
break;
case PhoneStateListener.LISTEN_CALL_STATE:
break;
}
super.onCallStateChanged(state, incomingNumber);
}
那我该怎么做才能在android 8.0(及更高版本)上结束通话?
答案 0 :(得分:0)
按照MODIFY_PHONE_STATE
documentation:
不供第三方应用程序使用。
因此,您的应用无法获得此权限。
可穿戴设备的伴侣应用应改为使用
InCallService
API。进行呼叫筛选的应用应改用CallScreeningService
API。
根据this question,它们都仅限于默认的拨号器应用程序,直到Android Q,现在第三方应用程序可以请求该角色。