Android N:在更新复选框首选项之前检查免打扰状态已更改

Android N: checking for DND state changed before updating checkbox preference

我的应用程序将铃声模式设置为静音,但使用 Android N 我得到 java.lang.SecurityException: Not allowed to change Do Not Disturb state.

我按照此 中的步骤进行操作,以下代码将打开一个 activity,其中包含一个切换按钮,用于启用更改铃声模式的权限。这个activity可以是"backed"从没有启用权限。

Intent intent = new Intent(
                        android.provider.Settings
                        .ACTION_NOTIFICATION_POLICY_ACCESS_SETTINGS);

    startActivity(intent);

问题是我想确保在尝试使用静音铃声模式功能之前已授予权限。

我正在添加一个 CheckBoxPreference 来启用和禁用此铃声模式切换。因此,如果复选框被选中,我可以将铃声模式设置为静音,如果没有,我将不会更改铃声模式。

到目前为止,当用户单击复选框时,我设法启动了此权限请求:

disableSoundCheckboxPreference.setOnPreferenceChangeListener(
                new Preference.OnPreferenceChangeListener() {
                    @Override
                    public boolean onPreferenceChange(Preference preference, Object o) {
...
// check for Android N and start the activity mentioned above

但是只有在授予权限的情况下才启用此复选框的正确方法是什么?我猜它应该与 ACTION_NOTIFICATION_POLICY_ACCESS_GRANTED_CHANGED 和一个监听器有关,但我需要一些想法来实现它。

谢谢!

我设法解决了这个问题,并将 post 提供答案以备不时之需。

在这种情况下不需要 BroadcastListener。当用户第一次点击带有 OnPreferenceClickListener:

的首选项时,您只需要请求权限
private void requestNotificationPolicyAccess() {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N && !isNotificationPolicyAccessGranted()) {
            Intent intent = new Intent(android.provider.Settings.
                    ACTION_NOTIFICATION_POLICY_ACCESS_SETTINGS);
            startActivity(intent);

如果用户授予权限,当他再次点击时,你将允许用户改变CheckBox的状态。如果未授予权限,您将继续用 "false" 更新 CheckBox 并且可能会在 android:summary 中写入必须首先授予权限。您可以通过以下方式验证:

private boolean isNotificationPolicyAccessGranted()  {
    NotificationManager notificationManager = (NotificationManager)
            getActivity().getSystemService(Context.NOTIFICATION_SERVICE);
    return notificationManager.isNotificationPolicyAccessGranted();
}