custom notification not showing on lock screen oreo - android

I am building Notification with remote views. I have given NotificationCompat.VISIBILITY_PUBLIC. but Notification is not showing on lock screen in Oreo.
My compileSdkVersion and targetSdkVersion is 27
remoteViews = new RemoteViews(getPackageName(), R.layout.player_noti_layout);
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.O) {
NotificationChannel channel = new NotificationChannel("default",
getString(R.string.player_channel),
NotificationManager.IMPORTANCE_LOW);
channel.setDescription("Notification, Play/pause & Next/Prev");
channel.setLockscreenVisibility(Notification.VISIBILITY_PUBLIC);
notificationmanager.createNotificationChannel(channel);
}
builder = new NotificationCompat.Builder(this, "default");
Notification foregroundNote;
// Set Icon
foregroundNote = builder.setSmallIcon(R.drawable.ic_radio)
.setTicker(getResources().getString(R.string.app_name))
.setAutoCancel(false).setOngoing(true)
.setContent(remoteViews)
.setContentTitle("app name").setContentText("").setWhen(0).setPriority(NotificationCompat.PRIORITY_MAX)
.setVisibility(NotificationCompat.VISIBILITY_PUBLIC)
.build();
Help appreciated!!! Thanks

try this:
Notification.Builder.setVisibility(Notification.VISIBILITY_PUBLIC);

What I found working for me is in your notificationchannel you change the LockscreenVisibility to this
channel.LockscreenVisibility = NotificationVisibility.Public;
And in your NotificationCompat.Builder
.setVisibility(NotificationCompat.VisibilityPublic)
You do seem to be using a slightly different Syntax as for me I had to capitalise .SetVisibility
I hope this still helps.
PS: Keep in mind that your phone might not allow lockscreen notifications. This also happened to me where the code worked but my phone still didn't show the notifications. ;)

Related

Android push header/heads-up notification doesn't work

I am currently trying to get a header notification on a Nexus S (API 29), but with no success. I've seen some threads with various solutions, but none of them worked. The code is as follows:
Context applicationContext = getApplicationContext();
NotificationCompat.Builder builder = new NotificationCompat.Builder(applicationContext, CHANNEL_ID)
.setDefaults(NotificationCompat.DEFAULT_ALL)
.setDefaults(NotificationCompat.DEFAULT_SOUND)
.setSmallIcon(R.drawable.ic_account_circle)
.setContentTitle(notificationTitle)
.setContentText(notificationTextBody)
.setPriority(NotificationCompat.PRIORITY_HIGH)
.setLights(Color.RED, 3000, 3000);
NotificationManagerCompat notificationManager = NotificationManagerCompat.from(applicationContext);
int notificationId = new Random().nextInt();
//launches the notification on the device
notificationManager.notify(notificationId, builder.build());
I have tried setting sound on, vibrations on, to set the priority as high or max. I have even used the method setFullScreenIntent, separately and all at once, but nothing accomplished, what I seek.
on Android 8+ you have to create notification channel, like in DOC
private void createNotificationChannel() {
// Create the NotificationChannel, but only on API 26+ because
// the NotificationChannel class is new and not in the support library
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
CharSequence name = getString(R.string.channel_name);
String description = getString(R.string.channel_description);
int importance = NotificationManager.IMPORTANCE_DEFAULT;
NotificationChannel channel = new NotificationChannel(CHANNEL_ID, name, importance);
channel.setDescription(description);
// Register the channel with the system; you can't change the importance
// or other notification behaviors after this
NotificationManager notificationManager = getSystemService(NotificationManager.class);
notificationManager.createNotificationChannel(channel);
}
}
note that channel also have importance. if you want a heads-up notification you have to set high priority for this channel, DOC
Example conditions that might trigger heads-up notifications include the following:
The notification channel has high importance on devices running Android 8.0 (API level 26) and higher.

Why are stock image resources fuzzy in notifications?

Any idea why these media controls appear fuzzy?
I'm creating the icons so:
start = Icon.createWithResource(this, android.R.drawable.ic_media_play);
pause = Icon.createWithResource(this, android.R.drawable.ic_media_pause);
reset = Icon.createWithResource(this, android.R.drawable.ic_media_previous);
finish = Icon.createWithResource(this, R.drawable.ic_media_stop);
then creating the various Notification.Action instances:
public Notification.Action getStartAction() {
PendingIntent pendingIntent = getPendingIntent(NOTI_START_CLICKED);
return new Notification.Action.Builder(start, "Start", pendingIntent).build();
}
then adding to the Notification.Builder:
Notification noti = getNotificationBuilder(time, description)
.addAction(getResetAction())
.addAction(getFinishAction())
.addAction(getStartAction())
.setStyle(new Notification.MediaStyle().
setShowActionsInCompactView(0, 1, 2))
.build();
notificationManager.notify(MEDITATION_NOTIFICATION_ID, noti);
The finish icon is my own but the others are all from the framework so I don't understand why they aren't sharp. This is built with compileSdkVersion 27 Oreo and running on Nexus 5X running 8.1.0.

Android Oreo notification keep making Sound even if I do not set sound. On Older version, works perfectly

So I am making my app compatible with Oreo and facing issue with notification.
I added notification channel according to documentation and everything is working smooth except notification keep making sound on every posting, tried setting defaults to 0 as well.
I am testing my app in emulator, any help is highly appreciated.
Used this code for creating channel
NotificationCompat.Builder builder = new NotificationCompat.Builder(PlayerService.this, "channel_01")
.setAutoCancel(false)
.setContentIntent(pendingIntent)
.setContent(viewsSmall)
.setCustomBigContentView(viewsExpanded)
.setDeleteIntent(pSwipeToDismiss);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
builder.setVisibility(Notification.VISIBILITY_PUBLIC);
}
if (Build.VERSION.SDK_INT > Build.VERSION_CODES.ICE_CREAM_SANDWICH_MR1) {
builder.setPriority(Notification.PRIORITY_MAX);
}
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
/* Create or update. */
NotificationChannel channel = new NotificationChannel("channel_01",
"Playback Notification",
NotificationManager.IMPORTANCE_DEFAULT);
mNotificationManager.createNotificationChannel(channel);
mBuilder.setChannelId("channel_01");
}
final Notification notification = builder.build();
startForeground(Constants.NOTIFICATION_ID.FOREGROUND_SERVICE,notification);
Take a look at the notification channel settings (swipe your notification and press the settings icon under it and then select your channel). Those settings are set the first time you create the channel and then not modified unless you do it manually in the device (at least that is my experience from uninstalling and reinstalling my app to see what settings I get by default).
Basically, channel.setSound(null, null) will only have effect when you create the channel on a fresh installation. That might be what they try to explain in the official guide:
Attempting to create an existing notification channel with its original values performs no operation
If you tried to follow that guide and set NotificationManager.IMPORTANCE_HIGH and didn't use channel.setSound(null, null), the channel would get importance level Urgent Make sound and pop on screen with the default sound.
^Benjamin answer works but he is missing some important detail! You must change your channel ID each time you adjust your code or Oreo will not make the changes. Not sure why.
My code below and you can see where the chnage must be made with this <-------here
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
String channelID = "My Channel I"; <-------here
String appName = mContext.getResources().getString(R.string.app_name);
NotificationCompat.Builder notificationCompatBuilder = new NotificationCompat.Builder(mContext );
notificationCompatBuilder
.setOngoing(true)
.setContentTitle(mContext.getResources().getString(R.string.app_name))
.setContentText(mContext.getString(R.string.clocked_in))
.setSmallIcon(R.drawable.ic_action_name)
.setChannelId(channelID)
.setSound(null);
NotificationManager notificationManager = (NotificationManager) mContext.getSystemService(Context.NOTIFICATION_SERVICE);
NotificationChannel notificationChannel = new NotificationChannel(channelID, appName, NotificationManager.IMPORTANCE_LOW);
notificationChannel.setSound(null, null);
notificationManager.createNotificationChannel(notificationChannel);
notificationManager.notify(ONGOINGNOTIFICATION_ID, notificationCompatBuilder.build());
}
Replace your code with this
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
/* Create or update. */
NotificationChannel channel = new NotificationChannel("channel_01",
"Playback Notification",
NotificationManager.IMPORTANCE_LOW);
channel.setSound(null, null);
mNotificationManager.createNotificationChannel(channel);
mBuilder.setChannelId("channel_01");
}
My scene is the first time there is a sound, and the update notification does not require a sound.
I use this setOnlyAlertOnce() method
Reference: https://developer.android.com/training/notify-user/build-notification#Updating
Test pass version 26

NotificationCompat with API 26

I dont see any information about how to use NotificationCompat with Android O's Notification Channels
I do see a new Constructor that takes a channelId but how to take a Compat notification and use it in a NotificationChannel since createNotificationChannel takes a NotificationChannel object
Create the NotificationChannel only if API >= 26
public void initChannels(Context context) {
if (Build.VERSION.SDK_INT < 26) {
return;
}
NotificationManager notificationManager =
(NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
NotificationChannel channel = new NotificationChannel("default",
"Channel name",
NotificationManager.IMPORTANCE_DEFAULT);
channel.setDescription("Channel description");
notificationManager.createNotificationChannel(channel);
}
And then just use:
NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(context, "default");
So your notifications are working with both API 26 (with channel) and below (without).
Declare Notification Manager:
final NotificationManager mNotific=
(NotificationManager)getSystemService(Context.NOTIFICATION_SERVICE);
CharSequence name="Ragav";
String desc="this is notific";
int imp=NotificationManager.IMPORTANCE_HIGH;
final String ChannelID="my_channel_01";
Notification Channel
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O)
{
NotificationChannel mChannel = new NotificationChannel(ChannelID, name,
imp);
mChannel.setDescription(desc);
mChannel.setLightColor(Color.CYAN);
mChannel.canShowBadge();
mChannel.setShowBadge(true);
mNotific.createNotificationChannel(mChannel);
}
final int ncode=101;
String Body="This is testing notific";
Notification Builder
Notification n= new Notification.Builder(this,ChannelID)
.setContentTitle(getPackageName())
.setContentText(Body)
.setBadgeIconType(R.mipmap.ic_launcher)
.setNumber(5)
.setSmallIcon(R.mipmap.ic_launcher_round)
.setAutoCancel(true)
.build();
NotificationManager notify to User:
mNotific.notify(ncode, n);
NotificationChannel actually groups multiple notifications into channels. It basically gives more control of the notification behavior to the user. You can read more about Notification Channel and its implementation at Working with Notification Channel | With Example
Notification Channel is only applicable for Android Oreo.
//Notification channel should only be created for devices running Android 26
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
NotificationChannel notificationChannel = new NotificationChannel("unique_channel_id","channel_name",NotificationManager.IMPORTANCE_DEFAULT);
//Boolean value to set if lights are enabled for Notifications from this Channel
notificationChannel.enableLights(true);
//Boolean value to set if vibration is enabled for Notifications from this Channel
notificationChannel.enableVibration(true);
//Sets the color of Notification Light
notificationChannel.setLightColor(Color.GREEN);
//Set the vibration pattern for notifications. Pattern is in milliseconds with the format {delay,play,sleep,play,sleep...}
notificationChannel.setVibrationPattern(new long[]{500,500,500,500,500});
//Sets whether notifications from these Channel should be visible on Lockscreen or not
notificationChannel.setLockscreenVisibility( Notification.VISIBILITY_PUBLIC);
}
Note that Channel ID passed to the constructor acts as the unique identifier for that Notification Channel. Now create the Notification as shown below
// Creating the Channel
NotificationManager notificationManager = (NotificationManager)getSystemService(NOTIFICATION_SERVICE);
notificationManager.createNotificationChannel(notificationChannel);
To add any Notification to this Channel just pass the Channel ID as shown below
//We pass the unique channel id as the second parameter in the constructor
NotificationCompat.Builder notificationCompatBuilder=new NotificationCompat.Builder(this,NOTIFICATION_CHANNEL_ID);
//Title for your notification
notificationCompatBuilder.setContentTitle("This is title");
//Subtext for your notification
notificationCompatBuilder.setContentText("This is subtext");
//Small Icon for your notificatiom
notificationCompatBuilder.setSmallIcon(R.id.icon);
//Large Icon for your notification
notificationCompatBuilder.setLargeIcon( BitmapFactory.decodeResource(getResources(),R.id.icon));
notificationManager.notify( NOTIFICATION_ID,notificationCompatBuilder.build());
Please be careful if you did all the work and you did not get any results. On some devices, you must set the notification priority.
final NotificationCompat.Builder mBuilder = new
NotificationCompat.Builder(mContext, "default")
.setPriority(Notification.PRIORITY_MAX);
I know this answer is late, but better late then never!
I have just released the notification-channel-compat library which provides Notification Channel support going back to OS 4.0. Since developers anyways have to design for Channels, they can now use the benefits of Channels for all devices, and they don't have to design separately for older devices.
The library uses the built-in channel classes for OS 8.0+ devices, and mimics it for older devices. All it takes, is using our NotificationChannelCompat, NotificationChannelGroupCompat and NotificationChannelManagerHelper classes, and adding one line of code. You can see more at github. Please test it and let me know of any issues.
Thank you,
Lionscribe

Disable vibration for a notification

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?
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.
In the year 2020:
Setting the importance of the notification channel to NotificationManager.IMPORTANCE_NONE worked for me.
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 ...
You have 2 solutions with the notification channel.
Set a "fake" pattern to disable the vibration.
Set Importance flag, but less flexible (see https://developer.android.com/training/notify-user/channels#importance). Takes care, it will also impact some other stuff like priority...
As a result, you can use
NotificationChannel channel = new NotificationChannel(channelId, channelName, importance);
// no vibration
channel.setVibrationPattern(new long[]{ 0 });
channel.enableVibration(true);
Or
int importance = NotificationManager.IMPORTANCE_LOW;
NotificationChannel channel = new NotificationChannel(channelId, channelName, importance);
.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. :)
notification.vibrate = new long[] { -1 };
this code work for me.
Above solutions didnt work but adding mBuilder.setOnlyAlertOnce(true); to my notification builder solved my problem.
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);
}
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.
private void createNotificationChannel() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
NotificationChannel serviceChannel = new NotificationChannel(
CHANNEL_ID,
"Example Service Channel",
NotificationManager.IMPORTANCE_MIN
);
serviceChannel.setVibrationPattern(new long[]{ 0 });
serviceChannel.enableVibration(true);
serviceChannel.enableLights(false);
serviceChannel.setSound(null, null);
serviceChannel.setShowBadge(false); //
NotificationManager manager = getSystemService(NotificationManager.class);
manager.createNotificationChannel(serviceChannel);
}
If you make IMPORTANCE_MIN that you can disabled vibration, if you make IMPORTANCE_DEFAULT it happens vibration so you can try IMPORTANCE_MIN
July 2022: I have tried everything in this thread, and the only thing that worked was Zhar's suggestion to set importance to low:
int importance = NotificationManager.IMPORTANCE_LOW;
NotificationChannel channel = new NotificationChannel(channelId, channelName, importance);
I am targeting Android API level 24.
setVibrate(new long[0]) works if you're targetting API 28. I'm working with chinese smartwatches running smartphone android roms so in the rest of the devices should work fine. Hope it helps!

Categories

Resources