Android N:在更新复选框首选项之前检查DND状态是否已更改

时间:2016-09-27 19:31:45

标签: android android-notifications android-preferences android-audiomanager android-7.0-nougat

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

我按照此post中的步骤操作,以下代码将打开一个活动,其中包含一个切换按钮,用于启用更改振铃模式的权限。这项活动可以得到支持"从没有启用许可。

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和一个监听器有关,但我需要一些想法来实现它。

谢谢!

1 个答案:

答案 0 :(得分:2)

我设法解决了这个问题,并会在其他人需要的时候发布答案。

在这种情况下不需要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();
}