我正在使用通知编写应用程序。 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;
但是当通知出现时,手机仍会振动。
如何禁用通知振动?
答案 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)
您在通知渠道上有两种解决方案。
因此,您可以使用
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);