问题
I'm writing an app using notification. Google developer guidelines encourages developers to provide settings to customize the notifications (disable vibration, set notification sound...), so I am trying to disable vibration for notifications if the user set it that way.
I am using NotificationCompat.Builder
to create the notification, like this:
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);
I tried different ways to disable notifications:
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);`
I also tried to build the notification and change values on the resulting object:
Notification notification = notificationBuilder.build();
notification.vibrate = null;
But the phone still vibrates when the notification appears.
How can I disable vibration for notifications?
回答1:
After a long trial & error session, I think I finally understood what's wrong.
The problem lies in this instruction notificationBuilder.setDefaults(Notification.DEFAULT_ALL)
.
No matter what parameter you pass to notificationBuilder.setVibrate()
after setting DEFAULT_ALL
or DEFAULT_VIBRATE
will be silently discarded. Someone at Google must have decided to give a higher precedence to setDefaults
than to setVibrate
.
This is how I ended up disabling vibration for notifications in my app:
notificationBuilder.setDefaults(Notification.DEFAULT_LIGHT | Notification.DEFAULT_SOUND)
.setVibrate(new long[]{0L}); // Passing null here silently fails
This works but doesn't feel right to initialize a new long[]
just to disable the vibration.
回答2:
They are not stop because you are use "setDefaults(Notification.DEFAULT_ALL)"
so if you need to stop vibration and sound remove this line , or if you need to use the default sound and stop vibration I think you must use setDefaults(Notification.DEFAULT_SOUND)
etc ...
回答3:
.setVibrate(null)
works for me - and a better solution than creating a needless long[].
Result: device doesn't vibrate and no grumbling in LogCat either. :)
回答4:
notification.vibrate = new long[] { -1 };
this code work for me.
回答5:
private void removeSoundAndVibration(Notification notification) {
notification.sound = null;
notification.vibrate = null;
notification.defaults &= ~DEFAULT_SOUND;
notification.defaults &= ~DEFAULT_VIBRATE;
This code is from Notification Compat Api Class. This should work, add all these to your builder.
来源:https://stackoverflow.com/questions/24008764/disable-vibration-for-a-notification