在Oreo上进行endCall需要MODIFY_PHONE_STATE权限

时间:2019-05-24 20:37:22

标签: android android-permissions

我制作了一个应用程序来阻止一些来电。该应用程序似乎运行良好并完成了工作。 但是最近我尝试在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(及更高版本)上结束通话?

1 个答案:

答案 0 :(得分:0)

按照MODIFY_PHONE_STATE documentation

  

不供第三方应用程序使用。

因此,您的应用无法获得此权限。

按照endCall documentation

  

可穿戴设备的伴侣应用应改为使用InCallService API。进行呼叫筛选的应用应改用CallScreeningService API。

根据this question,它们都仅限于默认的拨号器应用程序,直到Android Q,现在第三方应用程序可以请求该角色。