In Android 7 (livello API 24), la mia applicazione non è autorizzata a distriggersre il telefono (impostare la modalità suoneria in silenzio)

Ho un'applicazione che cancella il telefono usando AudioManager e impostando la modalità suoneria per silenzio con questo codice:

AudioManager audioManager = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE); try { audioManager.setRingerMode(AudioManager.RINGER_MODE_SILENT) } catch (Exception e) { e.printStackTrace(); } 

Questo funziona con Android 6, ma ora con Android 7, ho il seguente errore:

  • Tabella di riferimento locale di Android JNI, stato corrente dump
  • Come generare diagramma di class (UML) su Android Studio
  • Modo alternativo per l'implementazione di un dispositivo di scorrimento scorrevole che è stato deprecato sin dall'epoca 17
  • Crea phonegap per il file .apk per android
  • aggiungendo più voci ad un HashMap in una sola istruzione
  • Come get l'elenco delle applicazioni recenti con Android API 21 Lollipop?
  •  System.err: java.lang.SecurityException: Not allowed to change Do Not Disturb state System.err: at android.os.Parcel.readException(Parcel.java:1683) System.err: at android.os.Parcel.readException(Parcel.java:1636) System.err: at android.media.IAudioService$Stub$Proxy.setRingerModeExternal(IAudioService.java:962) System.err: at android.media.AudioManager.setRingerMode(AudioManager.java:1022) System.err: at controllers.SearchResultController.mutePhone(SearchResultController.java:185) 

    Ci sono nuove autorizzazioni che devo chiedere per fare questo lavoro?

    Ho guardato l'elenco delle autorizzazioni Android, ma non sono riuscito a trovare qualsiasi cosa che sia sembrata rilevante.

  • Problemi con intersezione tra i segmenti di linea
  • Cartella risorse di Android Studio Unit Test
  • selectionArgs in ContentResolver.query (...) può essere una subquery?
  • Aggiornamenti di posizione each 35 secondi e disegnare un cerchio nella posizione corrente
  • Come verificare se il thread corrente non è thread principale
  • C'è bisogno di implementare JAXB per Android?
  • 5 Solutions collect form web for “In Android 7 (livello API 24), la mia applicazione non è autorizzata a distriggersre il telefono (impostare la modalità suoneria in silenzio)”

    Grazie per le tue risposte, ecco un po 'di dettaglio.

    Per poter impostare la modalità suoneria in silenzio, è necessario disporre dell'authorization per accedere ai criteri di notifica (ad esempio @ucsunil).

    Prima di controllare se hai questa authorization. Se non lo fai, apri le impostazioni per l'accesso non disturbare per l'applicazione:

     NotificationManager notificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N && !notificationManager.isNotificationPolicyAccessGranted()) { Intent intent = new Intent( android.provider.Settings .ACTION_NOTIFICATION_POLICY_ACCESS_SETTINGS); startActivity(intent); } 

    Quando si esegue startActivity (), Android apre le impostazioni di accesso Do not Disturb per l'applicazione.

    Quello che mi ha confuso era che il modo di chiedere questa authorization è completamente diverso da altre autorizzazioni.

    Solo per riferimento, ecco il modo di chiedere il permesso READ_CONTACTS:

     if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M && ActivityCompat.checkSelfPermission(activity, Manifest.permission.READ_CONTACTS) == PackageManager.PERMISSION_DENIED) { ActivityCompat.requestPermissions(activity, new String[]{ Manifest.permission.READ_CONTACTS }, REQUEST_CODE_READ_CONTACTS); } 

    L'accesso che stai cercando è:

     <uses-permission android:name="android.permission.ACCESS_NOTIFICATION_POLICY" /> 

    Devi richiedere all'utente di fornire questo permesso specifico.

    Basato sulla documentazione di Android, devi concedere l'accesso a Non disturbare.

    Da N in avanti, le regolazioni delle modalità di suoneria che avrebbero triggersto la function Non disturbare non sono consentite a less che l'applicazione non sia stata concessa Non disturbare l'accesso. Vedere isNotificationPolicyAccessGranted ().

    Controlli prego il collegamento

    Spero che sia d'aiuto!

    ACCESS_NOTIFICATION_POLICY è considerato un permesso "normale", il che significa che NON deve richiedere l'authorization in fase di runtime. Devi solo aggiungere l'authorization a AndroidManifest.xml

      <uses-permission android:name="android.permission.ACCESS_NOTIFICATION_POLICY" /> 

    Quindi, per distriggersre tutte le notifiche, è ansible impostare il filter Interruzione su INTERRUPTION_FILTER_NONE

     NotificationManager notificationManager = (NotificationManager)getSystemService(Context.NOTIFICATION_SERVICE); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { previous_notification_interrupt_setting = notificationManager.getCurrentInterruptionFilter(); notificationManager.setInterruptionFilter(NotificationManager.INTERRUPTION_FILTER_NONE); } 

    INTERRUPTION_FILTER_ALARMS – Solo allarmi
    INTERRUPTION_FILTER_ALL – Filtro normale
    INTERRUPTION_FILTER_NONE – Nessuna interruzione (MUTE)
    INTERRUPTION_FILTER_PRIORITY – Interruzioni di priorità

    Io uso

      int previous_notification_interrupt_setting = notificationManager.getCurrentInterruptionFilter(); 

    per ripristinare il filter più avanti quando onPause () o onStop ()

    @Bjarte che succede perché a partire dall'intestazione API 23 è permesso a runtime. Una volta aggiunta questa NotifyPolicy anche nel livello api 23, è per questo che devi implementare in un modo diverso.

    ps: Mi dispiace, non posso aggiungere questo come commento: /

    Saluti

    L'Android è un fan Android di Google, tutto su telefoni Android, Android Wear, Android Dev e applicazioni Android Games e così via.