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を「偽」に更新し続け、android:summaryに最初に許可を与える必要があります。次の情報で確認できます。

private boolean isNotificationPolicyAccessGranted() { 
    NotificationManager notificationManager = (NotificationManager) 
      getActivity().getSystemService(Context.NOTIFICATION_SERVICE); 
    return notificationManager.isNotificationPolicyAccessGranted(); 
} 
関連する問題