NotificationCompat with API 26

AndroidAndroid Notifications

Android Problem Overview


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

Android Solutions


Solution 1 - Android

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).

Solution 2 - Android

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);

Solution 3 - Android

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());

Solution 4 - Android

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);

Solution 5 - Android

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

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestiontyczjView Question on Stackoverflow
Solution 1 - AndroidstankockenView Answer on Stackoverflow
Solution 2 - AndroidRagavendra MView Answer on Stackoverflow
Solution 3 - AndroidIrshad KumailView Answer on Stackoverflow
Solution 4 - AndroidIman MarashiView Answer on Stackoverflow
Solution 5 - AndroidlionscribeView Answer on Stackoverflow