53 votes

Sous Android 7 (API niveau 24), mon application n'est pas autorisée à mettre le téléphone en sourdine (régler le mode de sonnerie sur Silencieux)

J'ai une application qui coupe le téléphone en utilisant AudioManager et en mettant le mode de sonnerie sur Silence avec ce code:

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

Cela fonctionne avec Android 6, mais maintenant avec Android 7, j'obtiens l'erreur suivante:

 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)
 

Dois-je demander de nouvelles autorisations pour que cela fonctionne?

J'ai parcouru la liste des autorisations Android, mais je n'ai pas trouvé celles qui semblaient pertinentes.

78voto

Bjarte Aune Olsen Points 123

Merci pour vos réponses, voici un peu plus en détail.

Pour être en mesure de mettre la sonnerie en mode silencieux, vous devez avoir l'autorisation d'accès en matière de notification (comme @ucsunil dit).

Vérifiez d'abord si vous avez cette autorisation. Si vous n'avez pas, ouvrez les paramètres de Ne Pas Perturber l'accès de votre application:

NotificationManager notificationManager = 
    (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M
    && !notificationManager.isNotificationPolicyAccessGranted()) {

    Intent intent = new Intent(
                        android.provider.Settings
                        .ACTION_NOTIFICATION_POLICY_ACCESS_SETTINGS);

    startActivity(intent);
}

Lorsque vous exécutez startActivity(), Android ouvre la Ne Pas Déranger les paramètres d'accès de votre application.

Ce qui me confond, c'était que le moyen de demander cette autorisation est complètement différente des autres autorisations.

Juste pour référence, voici la façon de demander la permission 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);
}

11voto

Sunil Points 1832

L'accès que vous recherchez est:

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

Vous devez demander à l'utilisateur de vous fournir cette autorisation spécifique.

6voto

Winston Brown Points 21

ACCESS_NOTIFICATION_POLICY est considéré comme "normal" de la permission qui signifie que vous n'avez PAS à demander la permission à l'exécution. Vous n'avez qu'à ajouter l'autorisation à AndroidManifest.xml

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

Ensuite, pour désactiver toutes les notifications, vous pouvez définir l'Interruption de filtre à 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 - Alarmes uniquement
INTERRUPTION_FILTER_ALL - filtration Normale
INTERRUPTION_FILTER_NONE - Sans coupure (MUTE)
INTERRUPTION_FILTER_PRIORITY de Priorité des interruptions

J'utilise

 int previous_notification_interrupt_setting = notificationManager.getCurrentInterruptionFilter();

pour réinitialiser le filtre plus tard, quand onPause() ou onStop()

2voto

Waqar UlHaq Points 301

J'ai résolu ce problème en ouvrant le menu Configuration et en demandant à l'utilisateur de lui accorder l'autorisation si api> 23.

Appelez simplement requestMutePermissions () de n’importe où et cela fonctionnera!

 private void requestMutePermissions() {
    try {
        if (Build.VERSION.SDK_INT < 23) {
            AudioManager audioManager = (AudioManager)getApplicationContext().getSystemService(Context.AUDIO_SERVICE);
            audioManager.setRingerMode(AudioManager.RINGER_MODE_SILENT);
        } else if( Build.VERSION.SDK_INT >= 23 ) {
            this.requestForDoNotDisturbPermissionOrSetDoNotDisturbForApi23AndUp();
        }
    } catch ( SecurityException e ) {

    }
}

private void requestForDoNotDisturbPermissionOrSetDoNotDisturbForApi23AndUp() {

    NotificationManager notificationManager = (NotificationManager) getApplicationContext().getSystemService(Context.NOTIFICATION_SERVICE);
    // if user granted access else ask for permission
    if ( notificationManager.isNotificationPolicyAccessGranted()) {
        AudioManager audioManager = (AudioManager) getApplicationContext().getSystemService(Context.AUDIO_SERVICE);
        audioManager.setRingerMode(AudioManager.RINGER_MODE_SILENT);
    } else{
        // Open Setting screen to ask for permisssion
        Intent intent = new Intent(android.provider.Settings.ACTION_NOTIFICATION_POLICY_ACCESS_SETTINGS);
        startActivityForResult( intent, ON_DO_NOT_DISTURB_CALLBACK_CODE );
    }
}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    // Check which request we're responding to
    if (requestCode == ON_DO_NOT_DISTURB_CALLBACK_CODE ) {
        this.requestForDoNotDisturbPermissionOrSetDoNotDisturbForApi23AndUp();
    }
}
 

1voto

Lucas Santos Points 112

Sur la base de la documentation Android, vous devez autoriser l'accès à Ne pas déranger.

À partir de N, les ajustements en mode sonnerie qui activeraient l'option Ne pas déranger ne sont pas autorisés, sauf si l'application a reçu l'autorisation Ne pas déranger l'accès. Voir isNotificationPolicyAccessGranted ().

S'il vous plaît vérifier le lien

J'espère que ça aide!

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X