web-dev-qa-db-fra.com

Désactiver les vibrations pour une notification

J'écris une application en utilisant la notification. Les directives pour les développeurs de Google encouragent les développeurs à définir des paramètres pour personnaliser les notifications (désactiver la vibration, définir le son de la notification, etc.). Par conséquent, j'essaie de désactiver la vibration pour les notifications si l'utilisateur le définit de cette manière.

J'utilise NotificationCompat.Builder pour créer la notification, comme ceci:

NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(Application.getContext())
            .setDefaults(Notification.DEFAULT_ALL)
            .setPriority(Notification.PRIORITY_MAX)
            .setSmallIcon(R.drawable.ic_launcher)
            .setLargeIcon(largeIconBitmap)
            .setAutoCancel(true)
            .setContentIntent(resultPendingIntent)
            .setContentTitle(title)
            .setContentText(content);

J'ai essayé différentes manières de désactiver les notifications:

notificationBuilder.setVibrate(null);

notificationBuilder.setVibrate(new long[]{0l, 0l});

notificationBuilder.setDefaults(Notification.DEFAULT_ALL | ~Notification.DEFAULT_VIBRATE);

notificationBuilder.setDefaults(Notification.DEFAULT_LIGHTS | Notification.DEFAULT_SOUND);`

J'ai également essayé de créer la notification et de modifier les valeurs sur l'objet résultant:

Notification notification = notificationBuilder.build();
notification.vibrate = null;

Mais le téléphone vibre toujours lorsque la notification apparaît.

Comment puis-je désactiver les vibrations pour les notifications?

24
nstCactus

Après une longue session d'essai et d'erreur, je pense avoir enfin compris ce qui n'allait pas.

Le problème réside dans cette instruction notificationBuilder.setDefaults(Notification.DEFAULT_ALL).

Quel que soit le paramètre que vous transmettez à notificationBuilder.setVibrate() après le paramétrage de DEFAULT_ALL ou DEFAULT_VIBRATE, celui-ci sera automatiquement supprimé. Quelqu'un chez Google doit avoir décidé de donner une priorité plus élevée à setDefaults qu'à setVibrate.

Voici comment j'ai fini par désactiver les vibrations pour les notifications dans mon application:

notificationBuilder.setDefaults(Notification.DEFAULT_LIGHT | Notification.DEFAULT_SOUND)
                   .setVibrate(new long[]{0L}); // Passing null here silently fails

Cela fonctionne mais ne vous sentez pas juste d'initialiser un nouveau long[] juste pour désactiver les vibrations.

48
nstCactus

Ils ne sont pas arrêtés parce que vous utilisez "setDefaults(Notification.DEFAULT_ALL)", donc si vous devez arrêter les vibrations et le son, supprimez cette ligne, ou si vous devez utiliser le son par défaut et arrêter les vibrations, je pense que vous devez utiliser setDefaults(Notification.DEFAULT_SOUND), etc.

3
Oubaida AlQuraan

.setVibrate(null) fonctionne pour moi - et une meilleure solution que de créer un long [] inutile.

Résultat: l'appareil ne vibre pas et ne grogne pas non plus dans LogCat. :)

1
ban-geoengineering
private void removeSoundAndVibration(Notification notification) {
        notification.sound = null;
        notification.vibrate = null;
        notification.defaults &= ~DEFAULT_SOUND;
        notification.defaults &= ~DEFAULT_VIBRATE;

Ce code provient de Notification Compat Api Class. Cela devrait fonctionner, ajoutez-les tous à votre constructeur.

0
Bipin
notification.vibrate = new long[] { -1 };

ce code fonctionne pour moi.

0
Houssin Boulla