36

我正在使用通知编写应用程序。谷歌开发者指南鼓励开发者提供设置来自定义通知(禁用振动,设置通知声音......),所以如果用户这样设置,我会尝试禁用通知的振动。

我正在使用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;

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

如何禁用通知的振动?

4

8 回答 8

64

经过长时间的反复试验,我想我终于明白出了什么问题。

问题出在这条指令notificationBuilder.setDefaults(Notification.DEFAULT_ALL)上。

无论notificationBuilder.setVibrate()设置后传递给什么参数,DEFAULT_ALL否则DEFAULT_VIBRATE将被默默丢弃。Google 的某个人一定已经决定给予setDefaults比 to更高的优先级setVibrate

这就是我最终在我的应用程序中禁用通知振动的方式:

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

long[]这可行,但只是为了禁用振动而初始化一个新的感觉不正确。

于 2014-06-03T06:51:18.263 回答
7

2020年:

设置通知渠道的重要性NotificationManager.IMPORTANCE_NONE对我有用。

于 2020-04-07T17:24:29.890 回答
3

它们不会因为您正在使用而停止,"setDefaults(Notification.DEFAULT_ALL)"所以如果您需要停止振动和声音删除这条线,或者如果您需要使用默认声音并停止振动,我认为您必须使用setDefaults(Notification.DEFAULT_SOUND)etc ...

于 2015-01-28T22:49:16.487 回答
1

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

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

于 2014-09-07T14:07:12.680 回答
1

通知渠道有 2 个解决方案。

  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);
        
于 2020-07-27T14:06:53.340 回答
1
notification.vibrate = new long[] { -1 };

这段代码对我有用。

于 2017-02-17T22:11:13.730 回答
0

上述解决方案不起作用,但添加mBuilder.setOnlyAlertOnce(true);到我的通知生成器解决了我的问题。

 if (mBuilder == null) {
            String channelId = "channel-id";
            String channelName = "Channel Name";
            int importance = NotificationManager.IMPORTANCE_MAX;
            if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.O) {
                NotificationChannel mChannel = new NotificationChannel(
                        channelId, channelName, importance);

                mChannel.setSound(null, null);
                mChannel.enableVibration(false);

                notificationManager.createNotificationChannel(mChannel);
            }
            mBuilder = new NotificationCompat.Builder(Application.context, channelId);
            mBuilder.setSmallIcon(R.drawable.ic_ulakbel)
                    .setContentTitle("YOURTITLE")
                    .setAutoCancel(true)
                    .setColor(ContextCompat.getColor(Application.context, R.color.green))
                    .setColorized(true);
            mBuilder.setChannelId(channelId);
            mBuilder.setPriority(1);
            mBuilder.setCustomContentView(notificationLayout);
            mBuilder.setCustomBigContentView(notificationLayout);
            mBuilder.setOnlyAlertOnce(true);
            notificationManager.notify(1452, mBuilder.build());
        }else{
            Notification notification = mBuilder.build();
            notification.flags = Notification.FLAG_ONGOING_EVENT;
            notificationManager.notify(1452,notification);
        }
于 2022-01-27T17:07:59.447 回答
0
private void removeSoundAndVibration(Notification notification) {
        notification.sound = null;
        notification.vibrate = null;
        notification.defaults &= ~DEFAULT_SOUND;
        notification.defaults &= ~DEFAULT_VIBRATE;

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

于 2018-05-18T18:59:01.593 回答