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?

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top