Related
I am using the following code to show my notification:
NotificationCompat.Builder builder =
new NotificationCompat.Builder(context,
context.getString(R.string.notification_general_id))
.setSmallIcon(R.drawable.iit)
.setContentTitle("something")
.setContentText(notification)
.setPriority(NotificationCompat.PRIORITY_HIGH)
.setDefaults(Notification.DEFAULT_ALL)
.setAutoCancel(true);
// https://stackoverflow.com/a/28251192/2287994
long time = new Date().getTime();
String tmpStr = String.valueOf(time);
String last4Str = tmpStr.substring(tmpStr.length() - 5);
int notificationId = Integer.parseInt(last4Str);
Log.d(TAG, "notificationId " + notificationId);
notificationManager.notify(notificationId, builder.build());
I create notification channel using the following code:
// for showing general notifications
NotificationChannel generalNotificationsChannel = new NotificationChannel(
getString(R.string.notification_general_id),
getString(R.string.notification_general_name),
NotificationManager.IMPORTANCE_HIGH
);
nearbyAnchorsChannel.setDescription(getString(R.string.notification_general_desc));
// Register the channel with the system; you can't change the importance
// or other notification behaviors after this
NotificationManager notificationManager = getSystemService(NotificationManager.class);
On Google Pixel 3a, the notification only vibrates and shows up as a blip on the top left. However, on the OnePlus 6, it shows up as a proper heads-up notification that we can immediately swipe or tap on. I tried looking through the settings of my Pixel 3a (it is Android 12) but I cannot find any option that I can change to enable a heads-up display of notifications. Tbh, I am not even sure if there is something wrong with my code or the phone I am testing it on. Is it because of my OnePlus 6's Android version (it is Android 11)? Or is it due to the code that I have written? If it is due to the former then can someone please explain to me how I can change settings on my Pixel 3a to show a proper swipeable heads-up notification?
My bad, when you change channel importance, you need to uninstall the app and install it again. That's why it worked on the OnePlus 6 (because I installed it after changing the notification importance) and not on the Google Pixel 3a (because I was still working with the same install)
a while back I updated my App to add support for Android 8+, after updating the notifications to use the required NotificationChannel I noticed that I lost a feature.
The App uses a chronometer notification, back then I was able to update the Notification priority, to display a notification using PRIORITY_HIGH, so the notification was "pushed" to the user, and then edit the notification priority to PRIORITY_LOW, to hide the notification.
After reading the docs, from what I could understand, I can't control the priority after creating the NotificationChannel, leaving this control to the user, however, asking for the user to edit the notification settings is not optimal for my usage.
Relevant code:
//Creating the notification channel (while setting up the app)
NotificationChannel channel = new NotificationChannel(channelId, channelTitle, NotificationManager.IMPORTANCE_HIGH);
//Editing the NotificationChannel to lower the Notification priority (not working)
NotificationChannel channel = notificationManager.getNotificationChannel(channelId);
channel.setImportance(NotificationManager.IMPORTANCE_LOW);
notificationManager.createNotificationChannel(channel);
Is there a way accomplish this behavior, while still using the NotificationChannels?
Turns out I was overthinking this (by a lot), simply adding the option
setOnlyAlertOnce on the NotificationBuilder, while still using the NotificationManager.IMPORTANCE_HIGH to setup the channel, will result on the expected behavior, like so:
NotificationCompat.Builder notificationBuilder =
new NotificationCompat.Builder(context, channelId).setOnlyAlertOnce(true);
Today I started targeting API 26 which forced me to use Notification Channels.
My problem is that now on each new notification (including updates to it) an annoying sound is played.
How can I disable this sound?
I tried replacing this sound with a custom mp3 sound in order to then pass it a mp3 with silence in it, but this is ignored.
I'm just adding a notification which is of very low priority, basically giving the user the option to perform some actions after he has interacted with the app. There's no reason to be loud, the user will know that he can refer to the notification because he has done a certain thing with the app which he knows that will cause a notification to appear.
The user will really start getting annoyed by that sound.
If you want to keep the importance of your channel and just remove the sound notificationChannel.setSound(null, null); seems to do the job.
EDIT:
Make sure to change the channel ID (and delete the old one) to have it applied to existing users. (Channels can be created, but never modified by the app, only the user can.)
(Update 2019-05: It gets worse with Android Q, there I'm even getting a sound when using NotificationManager.IMPORTANCE_LOW, at least in the Emulator...)
The solution is to use NotificationManager.IMPORTANCE_LOW and create a new channel for it. Once a channel is created, you can't change the importance (well, you can, but the new importance is ignored). The channel information appears to get stored permanently by the system and any channel created is only deleted when you uninstall the app. [Update: According to Ferran Negre's comment, you can delete the channel via nm.deleteNotificationChannel(nChannel.getId()); and recreate it with nm.createNotificationChannel(nChannel); but apparently there's a limitation that you can't create a channel with the same id of a deleted channel and expect to be able to apply different settings to the undeleted channel, see acoder's answer]
While previous Android versions played no sound back by default, this changed with Android O, but only when you target the API 26, that is, use Notification Channels. This is an inconsistency, well, actually, it's a bug:
The reason for this is that when you create a channel with NotificationManager.IMPORTANCE_DEFAULT (not soundworthy by default) Android will actually "somewhat" register it as NotificationManager.IMPORTANCE_HIGH (plays sound by default).
You can check this by going into the options of the notifications (long press on the notification entry), where you will get to read that it is of type NotificationManager.IMPORTANCE_HIGH and then disable the notification and then re-enable it. In this process it gets "downgraded" from the NotificationManager.IMPORTANCE_HIGH to the non-sounding, actually registered NotificationManager.IMPORTANCE_DEFAULT.
The bug has been submitted to the Android issue tracker, so you may want to star it (flagged by Google as "Won't Fix (Infeasible)", because... spoiled).
BTW, the new docs at https://developer.android.com/training/notify-user/channels
claim that the default behavior used to be that way, that default played a sound prior to Android 8.0, which is definitely not true. This is their list
User-visible importance level Importance Priority
(Android 8.0 and higher) (Android 7.1 and lower)
Urgent Makes a sound and appears as IMPORTANCE_HIGH PRIORITY_HIGH
a heads-up notification or PRIORITY_MAX
High Makes a sound IMPORTANCE_DEFAULT PRIORITY_DEFAULT
Medium No sound IMPORTANCE_LOW PRIORITY_LOW
Low No sound and does not appear IMPORTANCE_MIN PRIORITY_MIN
in the status bar
You can even see the mismatch between visibility importance high and notification importance high... I don't know why they are doing this. They definitely have a bug in their code.
Everything below the next line is obsolete, yet that bug mentioned there is still valid. My error there was to think that NotificationManager.IMPORTANCE_MIN is the next lower one from NotificationManager.IMPORTANCE_DEFAULT, but NotificationManager.IMPORTANCE_LOW is.
When you then go into the notification settings of the app via long-press-notification and all-channels button and toggle the switch for that channel off and on again, then it actually sets itself to NotificationManager.IMPORTANCE_DEFAULT and no sound will get played. I also noticed that after a crash it did get reset to NotificationManager.IMPORTANCE_HIGH
So basically the workaround is to use NotificationManager.IMPORTANCE_MIN. But you have to create a new channel so that this NotificationManager.IMPORTANCE_MIN is in effect, because it appears that you can't change the importance of an already existing channel once you have created it.
Update: Turns out the workaround with NotificationManager.IMPORTANCE_MIN has a drawback.
When you use that importance level then your notification no longer displays fully inside the notification drawer, but inserts itself in a new Notification Channel Group which is collapsed by default (and will collapse itself again each time the drawer is pulled down). What a bummer!
Update 2: Digging a bit deeper it turns out that it is as if it correctly registered it as NotificationManager.IMPORTANCE_DEFAULT, but somehow it magically got upgraded to NotificationManager.IMPORTANCE_HIGH, like it would when the user explicitly changes the setting from default to high. That one also gets reset to default after turning the notification off and then on again.
Well i will add a complete answer to help. If you read NotificationCompat code from androidx.
/**
* Silences this instance of the notification, regardless of the sounds or vibrations set
* on the notification or notification channel.
*/
public #NonNull Builder setNotificationSilent() {
mSilent = true;
return this;
}
So you have to use like this if you want remove sound AND vibration.
NotificationCompat.Builder builder = new NotificationCompat.Builder(this, CHANNEL_ID)
// no sound or vibration
.setNotificationSilent()
If you want remove sound only. This is the way.
// no sound
builder.setSound(null);
If you want remove viration only.
// no vibration
mChannel.setVibrationPattern(new long[]{ 0 });
mChannel.enableVibration(true);
NotificationCompat.Builder.setSilent(true)
This allows you to post a silent notification (no sound or vibration) regardless of the channel's importance setting.
Reference:
https://developer.android.com/reference/androidx/core/app/NotificationCompat.Builder#setSilent(boolean)
As far as I have seen, since API 26 (Oreo) it is not possible to change the sound of a notification after it was once created.
notificationManager.deleteNotificationChannel("channel_id"));
NotificationChannel notificationChannel = new NotificationChannel(
"channel_id", "channel_name",
NotificationManager.IMPORTANCE_HIGH);
notificationChannel.setSound(null, null);
notificationManager.createNotificationChannel(notificationChannel);
Even deleting the channel before creation does not help.
Google documentation says:
android.app.NotificationManager public void deleteNotificationChannel(String channelId)
Deletes the given notification channel.
If you create a new channel with this same id, the deleted channel will be un-deleted with all of the same settings it had before it was deleted.
NotificationChannel#setSound() documentation states
Only modifiable before the channel is submitted to NotificationManager#createNotificationChannel(NotificationChannel)
Too bad that notificationBuilder.setSound(defaultSoundUri) does not work as well:
This method was deprecated in API level 26. Use NotificationChannel#setSound(Uri, AudioAttributes) instead.
Also using support library does not work. So sound is only settable once in the app and changing by the user is only possible in the settings of the notification. For me Ferran Negre's comment did not work. I do not understand why Google made this restriction. Too bad.
I have tested a lot of android devices,the following code works for me properly
Firstly, create a notificationBuilder, if your Build.Version is bigger than 26, please add a new channel.
private val notificationBuilder: NotificationCompat.Builder by lazy {
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.O) NotificationCompat.Builder(context) else {
val manager = context.getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
val channelId = "MUSIC"
val channelName = "音乐控制栏"
val importance = NotificationManager.IMPORTANCE_MIN
val channel = NotificationChannel(channelId, channelName, importance)
manager.createNotificationChannel(channel)
channel.enableLights(false)
channel.vibrationPattern = longArrayOf(0L)
channel.enableVibration(false)
channel.setSound(null, null)
NotificationCompat.Builder(context, channelId)
}
}
Secondly, init this notificationBuilder, and set sound null
notificationBuilder.setDefaults(Notification.DEFAULT_LIGHTS ).setVibrate( longArrayOf(0L)).setSound(null)
Thirdly,if build.version is bigger than 24, please set its priority.
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
notificationBuilder.priority = NotificationManager.IMPORTANCE_MIN
}
Hope that works for you.
NotificationManager.IMPORTANCE_LOW
It produces no sound when notification is created as I need the same in my Music Application.
And yes if you have already created a notification channel then either you need to change the channel id or simply uninstall the previous application and install again.
For me the solution was to create group notification.
val builder = NotificationCompat.Builder(this)
.setGroupAlertBehavior(GROUP_ALERT_SUMMARY)
.setGroup("My Group")
.setGroupSummary(false)
.setDefaults(DEFAULT_ALL)
.setSound(null)
But in this case, if you send a new notification with a new ID, then it will be grouped with the previous notifications.
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
val notificationChannel = NotificationChannel(
channelId.toString(), title,
NotificationManager.IMPORTANCE_DEFAULT
)
notificationChannel.setSound(null,null)
notificationChannel.enableVibration(false)
notificationChannel.description = body
if(notificationManager.getNotificationChannel(channelId.toString())==null) {
notificationManager.createNotificationChannel(notificationChannel)
}
if (data["sound"]?.equals("default", true) == true) {//if your app need contorl sound enable
RingtoneManager.getRingtone(
this,
RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION)
).play()
}
if(pushShake.isTrue() ){//if your app need contorl vibarate enable
val vbmanager= getSystemService(Context.VIBRATOR_SERVICE) as Vibrator
vbmanager.vibrate(VibrationEffect.createOneShot(500,VibrationEffect.DEFAULT_AMPLITUDE))
}
}
below code is about notification, but sound,vibrate will not play at API 26 ,so dont worry about setsound or setvibrate
notificationManager.notify(channelId.toInt(), notificationBuilder.apply {
setContentIntent(pendingIntent)
setSmallIcon(R.drawable.img_logo)
setTicker(title)
setNumber(data["badge"]?.toIntOrNull() ?: 0)
setBadgeIconType(NotificationCompat.BADGE_ICON_SMALL)
color = if (Build.VERSION.SDK_INT > Build.VERSION_CODES.M) {
resources.getColorMuteDepre(R.color.colorAccent2)
} else {
Color.parseColor("#ffffff")
}
setContentTitle(title)
setContentText(body)
setWhen(System.currentTimeMillis())
setAutoCancel(true)
setSound(null)
setVibrate(longArrayOf())
if (pushShake.isTrue() && data["sound"]?.equals("default", true) == true) {
setSound(RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION))
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.O) {
val vbmanager = getSystemService(Context.VIBRATOR_SERVICE) as Vibrator
vbmanager.vibrate(500)
}
}else{
if (data["sound"]?.equals("default", true) == true) {
setSound(RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION))
}
if (pushShake.isTrue() ) {
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.O) {
val vbmanager = getSystemService(Context.VIBRATOR_SERVICE) as Vibrator
vbmanager.vibrate(500)
}
}
}
setStyle(
NotificationCompat.BigTextStyle().bigText(body).setSummaryText(body).setBigContentTitle(
title
)
)
setPriority(NotificationCompat.PRIORITY_DEFAULT)
}.build())
As IMPORTANCE solution has the side effect of no notification popup, I got a final solution is:
adding a silent sound resource which downloaded from below repo
set sound for the channel with the silent sound resource.
https://github.com/anars/blank-audio/blob/master/1-second-of-silence.mp3
If the case is like mine, that I am forced to show a notification for background service and I don't really want to show any notification the solution that worked on 8.0 was:
.setPriority(NotificationManager.IMPORTANCE_NONE)
With this not only I didn't get the annoying sound every 5 minutes but also minimized the appearance of the notification itself.
On 8.1 I didn't have the problem with the sound with following:
.setPriority(NotificationManager.IMPORTANCE_MIN)
You can use 2 different notification channel to send notification depending on there priority to user.
If its a high priority notification the send it via
new NotificationChannel("Channel ID", "Channel Name", NotificationManager.IMPORTANCE_HIGH);
Your user will get sound and pop when they will receive a notification.
If you want to send less important notification then use this channel.
new NotificationChannel("Channel ID", "Channel Name", NotificationManager.IMPORTANCE_LOW);
Your user will get a notification with no sound and pop up.
check different priority from here - https://developer.android.com/reference/android/app/NotificationManager
No need to use .setSound(null, null)
just use below code
NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(this,
getString(R.string.notification_channel_id))
.setContentTitle("Audio Recording")
.setContentText("recording in progress")
.setLargeIcon(BitmapFactory.decodeResource(getResources(), R.mipmap.ic_launcher))
.setSmallIcon(R.mipmap.ic_launcher);
NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
NotificationChannel channel = new NotificationChannel(
getString(R.string.notification_channel_id), "AOD+", NotificationManager.IMPORTANCE_LOW
);
channel.setDescription("Call Recorder is running");
channel.setShowBadge(true);
channel.canShowBadge();
channel.setLightColor(Color.GREEN);
channel.enableVibration(false);
assert notificationManager != null;
notificationManager.createNotificationChannel(channel);
}
assert notificationManager != null;
startForeground(256/* must be greater than 0*/, notificationBuilder.build()); //I am using this for audio recording
//notificationManager.notify(0, notificationBuilder.build());
First you need to set
importance = NotificationManager.IMPORTANCE_LOW;
then
Notification n = builder.setPriority(Notification.DEFAULT_ALL).build();
n.defaults = 0;
n.defaults |= Notification.DEFAULT_VIBRATE;
NotificationManager.IMPORTANCE_LOW
This will work but also collapsed your notification.
NotificationManager.IMPORTANCE_LOW will work for sure
I faced the same issue in the 8.1 and made the below changes. Change the priority of the notification as LOW and it will disable the sound of notification.
NotificationManager.IMPORTANCE_LOW
The code is like following:
NotificationChannel chan1 = new NotificationChannel("default", "default", NotificationManager.IMPORTANCE_LOW);
I am building an android app that replaces the notification drawer and show notifications in its own window. I managed to show notifications on my drawer when they are posted by overriding onNotificationPosted() method. But, same notification is also shown by android. So,I want that notifications should be shown ONLY on my window, there are other apps who have done it,so it's not impossible. Please tell me how to override default behavior of android. Thanks in advance. :)
EDIT
What i want is to disable heads-up notification. Any solutions there?
In Oreo and above OS It is in the Notification channel Where you have to set the Priority any thing lesser than NotificationManager.IMPORTANCE_HIGH or some thing like this below stops the heads up banner.
NotificationChannel channel = new NotificationChannel(CHANNEL_ID,
CHANNEL_NAME,
NotificationManager.IMPORTANCE_DEFAULT)
On Pre-Oreo devices, the notification priority itself helps the system to show/hide the heads up banner.
Also remember when you make this change you have to delete the app and reinstall to see the change!
I used NotificationManager.IMPORTANCE_DEFAULT with setPriority(NotificationCompat.PRIORITY_DEFAULT) and it seems to work (Oneplus 3 and Note 8).
String channelId = "ch01";
String channelName = "Status";
int importance = NotificationManager.IMPORTANCE_DEFAULT;
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.O) {
NotificationChannel mChannel = new NotificationChannel(
channelId, channelName, importance);
notificationManager.createNotificationChannel(mChannel);
}
NotificationCompat.Builder nb = new NotificationCompat.Builder(this, channelId);
nb.setSmallIcon(R.drawable.ic_logo);
nb.setContentTitle(notificationText);
nb.setContentText("");
nb.setContentIntent(mainActivityPendingIntent);
nb.setPriority(NotificationCompat.PRIORITY_DEFAULT);
nb.setOnlyAlertOnce(true);
nb.setOngoing(true);
nb.setWhen(System.currentTimeMillis());
Huh! Looks like Android provides no way to disable heads-up notification of other apps via code.
Here is a little hack!
So, what we need is, not show any heads-up notification from any other app. To solve this, we need to understand that at one time there could be only one heads-up notification on screen.
Hack is, send your own notification right after you listen any notification being posted i.e. in onNotificationPosted() of a NotificationListener subclass.
this.mNotificationManager.notify(12321, new Notification.Builder(this)
.setContentTitle("").setContentText("")
.setSmallIcon(R.drawable.transparent)
.setPriority(Notification.PRIORITY_DEFAULT)
.setFullScreenIntent(this.mBlankIntent, true)
.setAutoCancel(true)
.build());
It will replace the notification of the 3rd app with your almost blank notification. Oh wow! Wait!! This looks ugly.
Ofcourse, Now we need to remove this notification before the user could even see this.
Now that you know package name of the android. You can show cancel your notification some thing like this.
if(packageName.equals("com.my.package")){
mNotificationManager.cancel(12321);
return;
}
So, what we are doing is showing our notification, when any other heads up notification shows up, and then remove our own notification. All this happens so quick that user does not sees any heads-up notification, and for doing this, I did not needed to store the notification in memory even.
Set the IMPORTANCE to LOW and PRIORITY to LOW.
It work for me
var notificationChannel = NotificationChannel(channelId, "Call" , NotificationManager.IMPORTANCE_LOW)
var notification = NotificationCompat.Builder(context,channelId)
.setContentTitle("Calling")
.setContentText("Call")
.setContentIntent(pendingIntent)
.setAutoCancel(true)
.setPriority(NotificationCompat.PRIORITY_LOW)
I need a program that will add a notification on Android. And when someone clicks on the notification, it should lead them to my second activity.
I have established code. The notification should be working, but for some reason it is not working. The Notification isn't showing at all. I don't know what am I missing.
Code of those files:
Notification n = new Notification.Builder(this)
.setContentTitle("New mail from " + "test#gmail.com")
.setContentText("Subject")
.setContentIntent(pIntent).setAutoCancel(true)
.setStyle(new Notification.BigTextStyle().bigText(longText))
.build();
NotificationManager notificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
// Hide the notification after it's selected
notificationManager.notify(0, n);
The code won't work without an icon. So, add the setSmallIcon call to the builder chain like this for it to work:
.setSmallIcon(R.drawable.icon)
Android Oreo (8.0) and above
Android 8 introduced a new requirement of setting the channelId property by using a NotificationChannel.
NotificationManager mNotificationManager;
NotificationCompat.Builder mBuilder =
new NotificationCompat.Builder(mContext.getApplicationContext(), "notify_001");
Intent ii = new Intent(mContext.getApplicationContext(), RootActivity.class);
PendingIntent pendingIntent = PendingIntent.getActivity(mContext, 0, ii, 0);
NotificationCompat.BigTextStyle bigText = new NotificationCompat.BigTextStyle();
bigText.bigText(verseurl);
bigText.setBigContentTitle("Today's Bible Verse");
bigText.setSummaryText("Text in detail");
mBuilder.setContentIntent(pendingIntent);
mBuilder.setSmallIcon(R.mipmap.ic_launcher_round);
mBuilder.setContentTitle("Your Title");
mBuilder.setContentText("Your text");
mBuilder.setPriority(Notification.PRIORITY_MAX);
mBuilder.setStyle(bigText);
mNotificationManager =
(NotificationManager) mContext.getSystemService(Context.NOTIFICATION_SERVICE);
// === Removed some obsoletes
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O)
{
String channelId = "Your_channel_id";
NotificationChannel channel = new NotificationChannel(
channelId,
"Channel human readable title",
NotificationManager.IMPORTANCE_HIGH);
mNotificationManager.createNotificationChannel(channel);
mBuilder.setChannelId(channelId);
}
mNotificationManager.notify(0, mBuilder.build());
Actually the answer by ƒernando Valle doesn't seem to be correct. Then again, your question is overly vague because you fail to mention what is wrong or isn't working.
Looking at your code I am assuming the Notification simply isn't showing.
Your notification is not showing, because you didn't provide an icon. Even though the SDK documentation doesn't mention it being required, it is in fact very much so and your Notification will not show without one.
addAction is only available since 4.1. Prior to that you would use the PendingIntent to launch an Activity. You seem to specify a PendingIntent, so your problem lies elsewhere. Logically, one must conclude it's the missing icon.
You were missing the small icon.
I did the same mistake and the above step resolved it.
As per the official documentation:
A Notification object must contain the following:
A small icon, set by setSmallIcon()
A title, set by setContentTitle()
Detail text, set by setContentText()
On Android 8.0 (API level 26) and higher, a valid notification channel ID, set by setChannelId() or provided in the NotificationCompat.Builder constructor when creating a channel.
See http://developer.android.com/guide/topics/ui/notifiers/notifications.html
This tripped me up today, but I realized it was because on Android 9.0 (Pie), Do Not Disturb by default also hides all notifications, rather than just silencing them like in Android 8.1 (Oreo) and before. This doesn't apply to notifications.
I like having DND on for my development device, so going into the DND settings and changing the setting to simply silence the notifications (but not hide them) fixed it for me.
Creation of notification channels are compulsory for Android versions after Android 8.1 (Oreo) for making notifications visible. If notifications are not visible in your app for Oreo+ Androids, you need to call the following function when your app starts -
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 behaviours after this
NotificationManager notificationManager =
getSystemService(NotificationManager.class);
notificationManager.createNotificationChannel(channel);
}
}
You also need to change the build.gradle file, and add the used Android SDK version into it:
implementation 'com.android.support:appcompat-v7:28.0.0'
This worked like a charm in my case.
I think that you forget the
addAction(int icon, CharSequence title, PendingIntent intent)
Look here: Add Action
I had the same issue with my Android app. I was trying out notifications and found that notifications were showing on my Android emulator which ran a Android 7.0 (Nougat) system, whereas it wasn't running on my phone which had Android 8.1 (Oreo).
After reading the documentation, I found that Android had a feature called notification channel, without which notifications won't show up on Oreo devices. Below is the link to official Android documentation on notification channels.
Notifications Overview, Notification anatomy
Create and Manage Notification Channels
For me it was an issue with deviceToken. Please check if the receiver and sender device token is properly updated in your database or wherever you are accessing it to send notifications.
For instance, use the following to update the device token on app launch. Therefore it will be always updated properly.
// Device token for push notifications
FirebaseInstanceId.getInstance().getInstanceId().addOnSuccessListener(
new OnSuccessListener<InstanceIdResult>() {
#Override
public void onSuccess(InstanceIdResult instanceIdResult) {
deviceToken = instanceIdResult.getToken();
// Insert device token into Firebase database
fbDbRefRoot.child("user_detail_profile").child(currentUserId).child("device_token")).setValue(deviceToken)
.addOnSuccessListener(
new OnSuccessListener<Void>() {
#Override
public void onSuccess(Void aVoid) {
}
});
}
});
I encountered a similar problem to yours and while searching for a solution I found these answers but they weren't as direct as I hoped they would be but it gives an Idea; Your notifications may not be showing because for versions >=8 notifications are done relatively differently there is a NotificationChannel which aids in managing notifications this helped me. Happy coding.
void Note(){
//Creating a notification channel
NotificationChannel channel=new NotificationChannel("channel1",
"hello",
NotificationManager.IMPORTANCE_HIGH);
NotificationManager manager=(NotificationManager) getSystemService(NOTIFICATION_SERVICE);
manager.createNotificationChannel(channel);
//Creating the notification object
NotificationCompat.Builder notification=new NotificationCompat.Builder(this,"channel1");
//notification.setAutoCancel(true);
notification.setContentTitle("Hi this is a notification");
notification.setContentText("Hello you");
notification.setSmallIcon(R.drawable.ic_launcher_foreground);
//make the notification manager to issue a notification on the notification's channel
manager.notify(121,notification.build());
}
Make sure your notificationId is unique. I couldn't figure out why my test pushes weren't showing up, but it's because the notification ids were generated based on the push content, and since I was pushing the same notification over and over again, the notification id remained the same.
Notifications may not be shown if you show the notifications rapidly one after the other or cancel an existing one, then right away show it again (e.g. to trigger a heads-up-notification to notify the user about a change in an ongoing notification). In these cases the system may decide to just block the notification when it feels they might become too overwhelming/spammy for the user.
Please note, that at least on stock Android (tested with 10) from the outside this behavior looks a bit random: it just sometimes happens and sometimes it doesn't. My guess is, there is a very short time threshold during which you are not allowed to send too many notifications. Calling NotificationManager.cancel() and then NotificationManager.notify() might then sometimes cause this behavior.
If you have the option, when updating a notification don't cancel it before, but just call NotificationManager.notify() with the updated notification. This doesn't seem to trigger the aforementioned blocking by the system.
If you are on version >= Android 8.1 (Oreo) while using a Notification channel, set its importance to high:
int importance = NotificationManager.IMPORTANCE_HIGH;
NotificationChannel channel = new NotificationChannel(CHANNEL_ID, name, importance);
val pendingIntent = PendingIntent.getActivity(applicationContext, 0, Intent(), 0)
var notification = NotificationCompat.Builder(applicationContext, CHANNEL_ID)
.setContentTitle("Title")
.setContentText("Text")
.setSmallIcon(R.drawable.icon)
.setPriority(NotificationCompat.PRIORITY_HIGH)
.setContentIntent(pendingIntent)
.build()
val mNotificationManager = getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
mNotificationManager.notify(sameId, notification)