我正在尝试阻止呼叫,并在清单中添加了以下权限。

 <uses-permission-sdk-23 android:name="android.permission.MODIFY_PHONE_STATE" />
    <uses-permission android:name="android.permission.CALL_PHONE" />
    <uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />
    <uses-permission android:name="android.permission.READ_PHONE_STATE" />


我的接收器代码是:

public class PhoneCallStateListener extends PhoneStateListener {
    public class PhoneCallReceiver extends BroadcastReceiver {
        @Override
        public void onReceive(Context context, Intent intent) {
           SharedPreferences sharedPreferences = context.getSharedPreferences("CallBlockingPreference", Context.MODE_PRIVATE);
            boolean blockCalls=sharedPreferences.getBoolean("blockCall", false);
            Toast.makeText(context, "Call block enabled", Toast.LENGTH_SHORT).show();
            TelephonyManager telephony = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
            PhoneCallStateListener customPhoneListener = new PhoneCallStateListener(context);
            telephony.listen(customPhoneListener, PhoneStateListener.LISTEN_CALL_STATE);
        }
    }


比较数字的代码:

  public PhoneCallStateListener(Context context) {
        this.context = context;
    }

    @Override
    public void onCallStateChanged(int state, String incomingNumber) {
        preferences = context.getSharedPreferences(MYPREFS, Context.MODE_PRIVATE);
        setdefault.add("");
        editor = preferences.edit();
        switch (state) {

            case TelephonyManager.CALL_STATE_RINGING:
                ArrayList<String> allBlockedNuber = new ArrayList<>();
                retrievePref = preferences.getStringSet("listOfBlockedNumbers", setdefault);
                allBlockedNuber.addAll(retrievePref);
                System.out.println(allBlockedNuber.size());
                System.out.println(incomingNumber);
      }
}


我收到空输入号码和错误为:


  java.lang.SecurityException:用户10561和当前进程都没有android.permission.CALL_PHONE。


移动版仅显示一个许可权,如电话,而我已手动授予。那么,为什么会出错却没有收到呼入号码?请指导。

最佳答案

在运行时请求权限

如果设备运行的是Android 6.0或更高版本,并且您的应用程序的目标SDK是23或更高版本:该应用程序必须在清单中列出权限,并且在运行该应用程序时,它必须请求所需的每个危险权限。用户可以授予或拒绝每个许可,即使用户拒绝许可请求,应用程序也可以继续以有限的功能运行。

https://developer.android.com/training/permissions/requesting.html

07-25 21:32