Android-解决Fail to post notification on channel "null"的方法

原文:https://blog.csdn.net/weixin_40604111/article/details/78674563
在sdk版本为25或25以前想在notification中添加一个点击事件 只要经过setContentIntent()传入一个PendingIntent就能够实现通知点击事件 代码以下
 
Intent intent = new Intent(Intent.ACTION_VIEW,Uri.parse("http://www.baidu.com"));
PendingIntentpendingIntent = PendingIntent.getActivity(MainActivity.this,0,intent,0);
NotificationManager manager = (NotificationManager)getSystemService(NOTIFICATION_SERVICE);
Notification notification = new NotificationCompat.Builder(MainActivity.this)
                                .setContentTitle("This is content title")
                                .setContentText("This is content text")
                                .setSmallIcon(R.mipmap.ic_launcher)
                                .build();
manager.notify(1,notification);123456789
但对于很多像我同样的新手用的模拟器或者调试工具都是最新版本即sdk为26的平台
因此若是还用上面的代码就会跳出这个错误

当时最后是在一个Android O的更新说明中找到了答案
传送门:https://www.ithome.com/html/android/298943.htm
 
再反观错误提示
Failed to post notification on channel “null”
这个时候咱们就知道问题是什么啦
意思就是在Android O后 引入了一个叫NotificationChannel的类 在sdk版本为26的时候 咱们不加这个东西 就设置用不了点击事件啦
就我我的的理解 NotificationChannel的做用就是细化对notification的设置 以前关于notification的设置都是能够在Notification.Builder(Context,int)中完成
引入NotificationChannel后  关于震动 声音 提示灯 优先级的设置就能够在NotificationChannel中设置
不过我的测试后 感受Android O在通知方面更注重用户了 就算你在代码中设置了重要性 可是实际提示的效果仍是根据用户在手机中设置的通知重要性来判断 因此我的感受开发者在代码设置重要性这部分能够直接略去
加入NotificationChannel后
代码以下

String id ="channel_1";//channel的id
String description = "123";//channel的描述信息
int importance = NotificationManager.IMPORTANCE_LOW;//channel的重要性
NotificationChannel channel = new NotificationChannel(id, "123", importance);//生成channel
//为channel添加属性
//channel.enableVibration(true); 震动
//channel.enableLights(true);提示灯
NotificationManager manager = (NotificationManager)getSystemService(NOTIFICATION_SERVICE);
manager.createNotificationChannel(channel);//添加channel
Notification notification = new Notification.Builder(MainActivity.this,id)
                                    //注意这里多了一个参数id,指配置的NotificationChannel的id
                                    //你能够本身去试一下 运行一次后 即配置完后 将这行代码以上的代
                                    //码注释掉 将参数id直接改为“channel_1”也能够成功运行
                                    //但改为别的如“channel_2”就不行了
                                    .setCategory(Notification.CATEGORY_MESSAGE)
                                    .setSmallIcon(R.mipmap.ic_launcher)
                                    .setContentTitle("This is a content title")
                                    .setContentText("This is a content text")
                                    .setContentIntent(pendingIntent)
                                    .setAutoCancel(true)
                                    .build();
manager.notify(1,notification);1234567891011121314151617181920212223
不过要用于项目中 仍是不行 由于咱们要考虑一个兼容版本问题 因此还要加上一个版本判断 或者 是一个requireApi为Android O 
不过我的建议是加一个版本判断 由于能够加上另一段代码来兼容25以前的平台
下面是最终代码
 
Intent intent = new Intent(Intent.ACTION_VIEW,Uri.parse("http://www.baidu.com"));
PendingIntent pendingIntent = PendingIntent.getActivity(MainActivity.this,0,intent,0);
NotificationManager manager = (NotificationManager)getSystemService(NOTIFICATION_SERVICE);
 if(Build.VERSION.SDK_INT >= 26)  {                //当sdk版本大于26    String id = "channel_1";    String description = "143";    int importance = NotificationManager.IMPORTANCE_LOW;    NotificationChannel channel = new NotificationChannel(id, description, importance); //                     channel.enableLights(true); //                     channel.enableVibration(true);//    manager.createNotificationChannel(channel);    Notification notification = new Notification.Builder(MainActivity.this, id)                                     .setCategory(Notification.CATEGORY_MESSAGE)                                     .setSmallIcon(R.mipmap.ic_launcher)                                     .setContentTitle("This is a content title")                                     .setContentText("This is a content text")                                     .setContentIntent(pendingIntent)                                     .setAutoCancel(true)                                     .build();    manager.notify(1, notification);    }    else    {             //当sdk版本小于26     Notification notification = new NotificationCompat.Builder(MainActivity.this)                                     .setContentTitle("This is content title")                                     .setContentText("This is content text")                                     .setContentIntent(pendingIntent)                                     .setSmallIcon(R.mipmap.ic_launcher)                                     .build();     manager.notify(1,notification);    }
相关文章
相关标签/搜索