Отключить вибрацию для уведомления

Я пишу приложение, используя уведомление. Руководства разработчика Google рекомендуют разработчикам предоставлять настройки для настройки уведомлений (отключить вибрацию, установить звук уведомления...), поэтому я пытаюсь отключить вибрацию для уведомлений, если пользователь установил ее таким образом.

Я использую NotificationCompat.Builder для создания уведомления, например:

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);

Я попробовал разные способы отключения уведомлений:

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);`

Я также попытался создать уведомление и изменить значения для результирующего объекта:

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

Но при появлении уведомления телефон все еще вибрирует.

Как отключить вибрацию для уведомлений?

Ответы

Ответ 1

После продолжительного сеанса проб и ошибок, я думаю, наконец понял, что случилось.

Проблема заключается в этой инструкции notificationBuilder.setDefaults(Notification.DEFAULT_ALL).

Независимо от того, какой параметр вы перейдете к notificationBuilder.setVibrate() после установки DEFAULT_ALL или DEFAULT_VIBRATE, будет тихо отбрасываться. Кто-то из Google должен был решить более высокий приоритет setDefaults, чем setVibrate.

Вот как я закончил отключать вибрацию для уведомлений в своем приложении:

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

Это работает, но не имеет права инициализировать новый long[], чтобы отключить вибрацию.

Ответ 2

Они не останавливаются, потому что вы используете "setDefaults(Notification.DEFAULT_ALL)", поэтому, если вам нужно остановить вибрацию и звук, удалите эту строку, или если вам нужно использовать звук по умолчанию и остановить вибрацию, я думаю, вы должны использовать setDefaults(Notification.DEFAULT_SOUND) и т.д..

Ответ 3

.setVibrate(null) работает для меня - и лучшее решение, чем создание ненужного long [].

Результат: устройство не вибрирует и не ворчит в LogCat.:)

Ответ 4

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

этот код работает для меня.