Desative a vibração para uma notificação
-
20-12-2019 - |
Pergunta
Estou escrevendo um aplicativo usando notificação.As diretrizes para desenvolvedores do Google incentivam os desenvolvedores a fornecer configurações para personalizar as notificações (desativar vibração, definir som de notificação...), por isso estou tentando desativar a vibração para notificações se o usuário definir dessa forma.
estou usando NotificationCompat.Builder
para criar a notificação, assim:
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);
Tentei diferentes maneiras de desativar notificações:
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);`
Também tentei construir a notificação e alterar valores no objeto resultante:
Notification notification = notificationBuilder.build();
notification.vibrate = null;
Mas o telefone ainda vibra quando a notificação aparece.
Como posso desativar a vibração para notificações?
Solução
Depois de uma longa sessão de tentativa e erro, acho que finalmente entendi o que estava errado.
O problema está nesta instrução notificationBuilder.setDefaults(Notification.DEFAULT_ALL)
.
Não importa para qual parâmetro você passe notificationBuilder.setVibrate()
depois de configurar DEFAULT_ALL
ou DEFAULT_VIBRATE
será descartado silenciosamente.Alguém no Google deve ter decidido dar maior prioridade a setDefaults
do que setVibrate
.
Foi assim que acabei desativando a vibração para notificações em meu aplicativo:
notificationBuilder.setDefaults(Notification.DEFAULT_LIGHT | Notification.DEFAULT_SOUND)
.setVibrate(new long[]{0L}); // Passing null here silently fails
Isso funciona, mas não parece certo inicializar um novo long[]
apenas para desativar a vibração.
Outras dicas
Eles não param porque você está usando "setDefaults(Notification.DEFAULT_ALL)"
então se você precisar parar a vibração e o som, remova esta linha, ou se você precisar usar o som padrão e parar a vibração, acho que você deve usar setDefaults(Notification.DEFAULT_SOUND)
etc...
.setVibrate(null)
funciona para mim - e uma solução melhor do que criar um long[] desnecessário.
Resultado:o dispositivo não vibra e também não reclama no LogCat.:)
notification.vibrate = new long[] { -1 };
esse código funciona para mim.
private void removeSoundAndVibration(Notification notification) {
notification.sound = null;
notification.vibrate = null;
notification.defaults &= ~DEFAULT_SOUND;
notification.defaults &= ~DEFAULT_VIBRATE;
Este código é da classe Notification Compat Api.Isso deve funcionar, adicione tudo isso ao seu construtor.