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?
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.
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.
.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. :)
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.
notification.vibrate = new long[] { -1 };
ce code fonctionne pour moi.