禁用通知的振动

时间:2014-06-03 06:51:18

标签: android notifications vibrate vibration android-vibration

我正在使用通知编写应用程序。 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;

但是当通知出现时,手机仍会振动。

如何禁用通知振动?

7 个答案:

答案 0 :(得分:50)

经过长时间的试验和错误会话,我想我终于明白了什么是错误的。

问题在于这条指令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[]感觉不对。

答案 1 :(得分:3)

他们没有因为你使用"setDefaults(Notification.DEFAULT_ALL)"而停止,所以如果你需要停止振动和声音去除这条线,或者你需要使用默认声音并停止振动我认为你必须使用{{1}等等......

答案 2 :(得分:3)

在2020年:

将通知渠道的重要性设置为NotificationManager.IMPORTANCE_NONE对我来说很有效。

答案 3 :(得分:1)

.setVibrate(null)对我有用 - 比创建一个不必要的长[]更好的解决方案。

结果:设备不会振动,也不会在LogCat中抱怨。 :)

答案 4 :(得分:0)

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

这段代码对我有用。

答案 5 :(得分:0)

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

此代码来自Notification Compat Api Class。这应该有效,将所有这些添加到您的构建器中。

答案 6 :(得分:0)

您在通知渠道上有两种解决方案。

  1. 设置“假”模式以禁用振动。
  2. 设置重要性标志,但灵活性较差(请参见https://developer.android.com/training/notify-user/channels#importance)。请注意,它也会影响其他优先事项,例如...

因此,您可以使用

NotificationChannel channel = new NotificationChannel(channelId, channelName, importance);
            // no vibration
            channel.setVibrationPattern(new long[]{ 0 });
            channel.enableVibration(true);

 int importance = NotificationManager.IMPORTANCE_LOW;
            NotificationChannel channel = new NotificationChannel(channelId, channelName, importance);