android 8.0 通知栏Notification适配以及自定义铃声

  • 一、8.0手机 通知栏适配
  • 二、自定义铃声所遇到的坑
  • 三、Android O Preview 之 通知渠道(Notification Channels)

一、8.0手机 通知栏适配

针对Android 8.0手机,无论是推送消息还是自定义的Notification,如果不作处理都将无法收到通知。项目跑在Android 8.0模拟器上弹出了Toast: ***Developer warning for package “xxx.xxx.xxx” Failed to post notification on channel “12345” See log for more details***追其原因:由于此条通知没有查找到应用中对应的NotificationChannel的原因,而无法弹出来。那NotificationChannel是个什么鬼,查阅官文得知,这是Android O新增的通知渠道,其允许您为要显示的每种通知类型创建用户可自定义的渠道。用户界面将通知渠道称之为通知类别。

此时我们需要单独创建notificationChannel,我直接将代码贴出来,在Application中初始化就好了

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {NotificationManager mNotificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);// 通知渠道的id 这个地方只要一直即可String id = "111111";// 用户可以看到的通知渠道的名字.CharSequence name = "notification channel";// 用户可以看到的通知渠道的描述String description = "notification description";int importance = NotificationManager.IMPORTANCE_HIGH;NotificationChannel mChannel = new NotificationChannel(id, name, importance);// 配置通知渠道的属性mChannel.setDescription(description);// 设置通知出现时的闪灯(如果 android 设备支持的话)mChannel.enableLights(true);mChannel.setLightColor(Color.RED);// 自定义声音mChannel.setSound(Uri.parse("android.resource://" + getPackageName() + "/raw/qqqq"),null);// 设置通知出现时的震动(如果 android 设备支持的话)mChannel.enableVibration(true);mChannel.setVibrationPattern(new long[]{100, 200, 300, 400, 500, 400, 300, 200, 400});//最后在notificationmanager中创建该通知渠道mNotificationManager.createNotificationChannel(mChannel);}

1、然后自定义通知时候:传入相同的id即可

NotificationCompat.Builder  builder = new NotificationCompat.Builder(context, "111111");//后面的通知创建不多赘述。

2、针对推送,不同厂家是不一样的。贴出阿里推送(个人比较推荐阿里推送,免费,推送到大率很高)

在控制台发送时候:

将8.0推送配置文档贴在这里:

https://help.aliyun.com/knowledge_detail/67398.html

这样便可以收到通知了。。

二、自定义铃声所遇到的坑

Android8.0 Google推出了NotificationChannel渠道的概念,对于NotificationChannel我们可以通过以下方式来设置铃声和振动。

NotificationChannel channel = new NotificationChannel(newChannelId, BaseApplication.getAppString(R.string.push_channel_name), NotificationManager.IMPORTANCE_HIGH);if (!TextUtils.isEmpty(uri)) {Logger.i(TAG, "8.0通知铃声:" + uri);Uri mUri = Uri.parse(uri);channel.setSound(mUri, Notification.AUDIO_ATTRIBUTES_DEFAULT);} else {channel.setSound(null, null);}Logger.i(TAG, "8.0是否开启振动:" + vibrateEnable);channel.enableLights(true);if (vibrateEnable) {channel.enableVibration(true);channel.setVibrationPattern(new long[]{100, 200, 300});} else {channel.enableVibration(false);channel.setVibrationPattern(new long[]{0});}nm.createNotificationChannel(channel);

那么如何的修改铃声和振动呢?最初天真的我以为重新调用NotificationChannel.setSound()方法来修改铃声,最终结果大家都清楚,是不会生效的,看了google的文档有这样一句话

意思是只能在create一个渠道之前修改铃声,在创建之后不支持修改。没办法,只能去重新创建一个渠道设置铃声振动。对于之前创建的渠道,你必须还得去通过deleteNotificationChannel(String channelId)去删除。但是这里又有另外一个坑。你什么时候去删除呢?第一次测试我是在修改铃声或者振动的时候创建一个新的渠道,把之前所有旧的渠道都删除,但是这样会有一个bug,之前渠道上还在状态栏显示的Notification都会删除掉,所有要做一个判断,如果当前渠道在状态栏没有notification显示则删除,否则继续保存,代码如下:

private static void deleteNoNumberNotification(NotificationManager nm, String newChannelId) {List<NotificationChannel> notificationChannels = nm.getNotificationChannels();if (Utils.isEmpty(notificationChannels) || notificationChannels.size() < 5) {return;}for (NotificationChannel channel : notificationChannels) {if (channel.getId() == null || channel.getId().equals(newChannelId)) {continue;}int notificationNumbers = getNotificationNumbers(nm, channel.getId());Logger.i(TAG, "notificationNumbers: " + notificationNumbers + " channelId:" + channel.getId());if (notificationNumbers == 0) {Log.i(TAG, "deleteNoNumberNotification: " + channel.getId());nm.deleteNotificationChannel(channel.getId());}}}/*** 获取某个渠道下状态栏上通知显示个数** @param mNotificationManager NotificationManager* @param channelId            String* @return int*/@RequiresApi(api = Build.VERSION_CODES.O)private static int getNotificationNumbers(NotificationManager mNotificationManager, String channelId) {if (mNotificationManager == null || TextUtils.isEmpty(channelId)) {return -1;}int numbers = 0;StatusBarNotification[] activeNotifications = mNotificationManager.getActiveNotifications();for (StatusBarNotification item : activeNotifications) {Notification notification = item.getNotification();if (notification != null) {if (channelId.equals(notification.getChannelId())) {numbers++;}}}return numbers;}

三、Android O Preview 之 通知渠道(Notification Channels)

介绍
Android O 引入了 通知渠道(Notification Channels),以提供统一的系统来帮助用户管理通知,如果是针对 android O 为目标平台时,必须实现一个或者多个通知渠道,以向用户显示通知。若并不以 Android O 为目标平台,当应用运行在 android O 设备上时,其行为将与运行在 Android 7.0 上时相同。
开发者可以为需要发送的每个不同的通知类型创建一个通知渠道。还可以创建通知渠道来反映应用的用户做出的选择。例如,可以为聊天应用的用户创建的每个聊天组建立单独的通知渠道。
Android O 的用户可以使用一致的系统 UI 管理大多数与通知有关的设置。所有发布至通知渠道的通知都具有相同的行为。
具体的可以浏览该文章的详细介绍
链接:https://www.jianshu.com/p/92afa56aee05

【Android-】android 8.0 通知栏Notification适配、自定义铃声及其channel介绍相关推荐

  1. Android(Lollipop/5.0) Material Design(七) 自定义动画

    Material Design系列 Android(Lollipop/5.0) Material Design(一) 简介 Android(Lollipop/5.0) Material Design( ...

  2. android显示通知栏Notification以及自定义Notification的View

    遇到的最大的问题是监听不到用户清除通知栏的广播.所以是不能监听到的. 自定义通知栏的View,然后service运行时更改notification的信息. /*** Show a notificati ...

  3. android 蓝牙4.0 ble,Android 蓝牙4.0开启Notification 和 Indication

    ______________________________________________________________ Android BLE 框架发布,功能全面,简单易用: _________ ...

  4. Android开发 Studio4.0 APP logo 适配

    AndroidStudio4.0以后,不能一个APP图标走天下了,除了页面中的各种布局适配,现在连APP的图标也要求进行适配了,否则运行项目会报错,如下便是简单暴力的适配方法↓ 1.右键资源文件的任意 ...

  5. Android控件ActionBar浅析及适配2.x的方法介绍

    概述: 在Honeycomb版本系统中,Android引入了全新的操作栏.操作栏不仅取代了显示标题和应用图标的传统标题栏(title bar),还带来了更多其他的功能,例如,安置菜单选项.配置应用图标 ...

  6. notification自定义铃声

    做项目的时候要用到notification的自定义铃声,我是这么写的 messageNotification.sound = Uri.parse("android:resource://&q ...

  7. Android 8.0+通知栏(Notification)适配详解,判断通知权限是否打开,并跳转至通知管理页面

    前不久因为API26(Android 8.0)以上的设备无法显示通知栏,所以网上查阅了比较多了资料,得出结论,API26以后引入了通知渠道这么个东西,然后就写了一篇问题对应的博文:Android 8. ...

  8. android 8.0的imei简书,Android 8.0通知栏渠道,渠道组的适配和使用

    Android 8.0通知栏渠道,渠道组的适配和使用 推广一下 博客 android 8.0开始引入了渠道组的概念,app可以对通知类型进行细分,比如划分为:广告消息,私聊消息,群聊消息等. 但其实到 ...

  9. android 8.0 调系统拍照_Android通知栏微技巧,8.0系统中通知栏的适配

    为什么要进行通知栏适配? 不得不说,通知栏真是一个让人又爱又恨的东西. 通知栏是Android系统原创的一个功能,虽说乔布斯一直认为Android系统是彻彻底底抄袭iOS的一个产品,但是通知栏确实是A ...

最新文章

  1. OpenSessionInViewFilter原理以及为什么要用OpenSessionInViewF
  2. Jquery元素判断是否存在
  3. Sql2008R2 日志无法收缩解决方案
  4. [雪峰磁针石博客]2018最佳12个开源或免费web服务器和客户端性能测试工具
  5. 站在吃货的角度来解释那些和微服务有关的名词
  6. keras 香草编码器_完善纯香草javascript中的拖放
  7. 输出注册信息javabean
  8. 锁定计算机的mad命令,本次操作由于这台计算机的限制而被取消
  9. [转]Android开发,实现可多选的图片ListView,便于批量操作
  10. 超越“迁移”的思考:应用程序该如何被Kubernetes接管?
  11. 服务器winsxs文件夹怎么清理工具,winsxs,教您winsxs文件夹清理方法
  12. 重磅!AWS任命张文翊女士为全球副总裁及大中华区执行董事!
  13. three.js和php,前端图形学(二十二)一切绕过原生WebGl直接上ThreeJs的都是耍流氓
  14. 注解 java 原理_Java注解基本原理
  15. 2014,这些邮件设计好厉害!
  16. 如何区分电梯卡为id卡ic卡_门禁卡ID卡和IC卡从外表怎么区分?
  17. Word中设置不同页面的页眉不一样的方法(页脚、页码同理)
  18. SSIS学习(一) - SSIS入门
  19. 转:比谎言更可怕的,是对真相视而不见
  20. 【第73期】资深游戏执行策划,很厉害?惊天大忽悠!

热门文章

  1. ZZULIOJ Python题解1023: 大小写转换
  2. Ubuntu安装Redis6.2.6
  3. Flutter项目该如何选择状态管理?
  4. mysql和sql server类型_SQL MS Access、MySQL 和 SQL Server 数据类型 - SQL 教程 - 自强学堂...
  5. MATLAB代码:记及电转气协同的含碳捕集与垃圾焚烧虚拟电厂优化调度
  6. scala 查询ip归属地 测试
  7. 科学数据库Python——matplotlib画折线图
  8. 前端常用CSS样式,前端笔记
  9. 对于纪争光纪老师讲课的感想
  10. 日、周、月活跃用户数,用户流失率