使用PhoneStateListener在Marshmallow中空入队号

时间:2017-02-08 10:08:30

标签: java android android-permissions

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

 <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。

移动设备只显示一个权限作为电话,我手动提供。那么为什么错误并没有得到传入号码?请指导。

1 个答案:

答案 0 :(得分:0)

在运行时请求权限

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

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