0

Мое приложение устанавливает режим звонка в режим молчания, но с Android N я получаю java.lang.SecurityException: Not allowed to change Do Not Disturb state.Android N: проверка состояния «Не беспокоить» изменилась до обновления. Предпочтение

Я выполнил шаги из этого 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 и слушателем, но мне нужно было бы несколько идей для его реализации.

Спасибо!

ответ

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. Если разрешение не предоставлено, вы продолжите обновление CheckBox с «ложным» и, возможно, напишите в нем android:summary, что разрешение должно быть предоставлено в первую очередь. Вы можете подтвердить:

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