0

내 앱은 벨소리 모드를 자동으로 설정하지만 Android N을 사용하면 java.lang.SecurityException: Not allowed to change Do Not Disturb state이됩니다.Android N : 확인란 환경 설정을 업데이트하기 전에 DND 상태가 변경되었는지 확인

나는이 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가 필요하지 않습니다. 사용자가 권한을 부여

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); 

경우, 그는 다시 클릭 할 때, 당신은 사용자의 상태를 변경할 수 있습니다 : 당신은 사용자가 먼저 OnPreferenceClickListener와 환경 설정을 클릭 할 때 권한을 요청해야 CheckBox. 권한이 부여되지 않은 경우 CheckBox을 "false"로 업데이트하고 android:summary에 먼저 권한을 부여해야한다고 입력합니다. 다음을 통해 확인할 수 있습니다.

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