it-swarm.com.ru

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

Я пишу приложение, используя уведомление. Руководства 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;

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

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

24
nstCactus

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

Проблема заключается в этой инструкции 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[] только для отключения вибрации.

48
nstCactus

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

3
Oubaida AlQuraan

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

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

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

Этот код взят из класса Notification Compat Api. Это должно работать, добавьте все это вашему строителю.

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

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

0
Houssin Boulla