IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 移动开发 -> [Android Notification] Failed to post notification on channel & No Channel found for 原因是channelId不一致 -> 正文阅读

[移动开发][Android Notification] Failed to post notification on channel & No Channel found for 原因是channelId不一致

问题:

使用 Notification 时,

1. Log 报错如下:

Line 5223: 03-07 11:49:20.121 ?1122 ?9346 E NotificationService: No Channel found for pkg=priv.xxx.demo, channelId=test, id=99, tag=null, opPkg=priv.xxx.demo, callingUid=10233, userId=0, incomingUserId=0, notificationUid=10233, notification=Notification(channel=test shortcut=null contentView=null vibrate=null sound=null defaults=0x0 flags=0x0 color=0x00000000 vis=PRIVATE)
?? ?

2. 对应的 UI 提示:

Failed to post notification on channel "test". See log for more details.

分析

从Log和toast上看,应该是 channelId 一致性出了问题。

问题代码

public static void sendNotice(Context context) {
        Log.i(TAG, "[sendNotice] ENTER, context = " + context);
        NotificationManager notificationManager =
                (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);

        // Android O  (8.0)新增的 API about channel。
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            // 使用NotificationChannel 类构建一个通知渠道
            NotificationChannel notificationChannel = new NotificationChannel("99", "TEMP",
                    NotificationManager.IMPORTANCE_DEFAULT);

            //通知的一些行为样式配置。
            notificationChannel.enableLights(true); //是否在launcher icon右上角展示提示点
            notificationChannel.setLightColor(Color.GREEN); //提示点颜色

            notificationManager.createNotificationChannel(notificationChannel);
        }
        Notification.Builder builder = new Notification.Builder(context,"test");
        builder.setContentTitle(context.getString(R.string.test_notification_title))
                .setContentText(context.getString(R.string.test_notification_content))
                .setWhen(System.currentTimeMillis())
                .setSmallIcon(R.mipmap.ic_launcher);
        Notification notification = builder.build();
        notificationManager.notify(99, notification);
}

问题解决

将channelId的内容统一,即问题代码中的“99”和“text”,取其一即可。

// channelId 要统一。
// channelId可以随便定义,只要保证全局唯一性就可以。
// 渠道名称是给用户看的,需要可以清楚地表达这个渠道的用途。
new NotificationChannel("99", "TEMP",
                    NotificationManager.IMPORTANCE_DEFAULT);
new Notification.Builder builder = new Notification.Builder(context,"99");

Nofitication 的用法

参考:通知概览 ?|? Android 开发者 ?|? Android Developers (google.cn)

  1. 获取 NotificationManager 对通知进行管理
  2. 构建一个通知渠道 NotificationChannel?
  3. 通过 Builder 创建 Notification ,配置其内容。
  4. 通过 manager 的notify() 显示通知

Note:关注 channelId 参数的统一

 public static void sendNotice(Context context, String channelId) {
        Log.i(TAG, "[sendNotice] ENTER, context = " + context);
        //1.获取 NotificationManager 对通知进行管理。
        NotificationManager notificationManager =
                (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
        //2.构建一个通知渠道 NotificationChannel。
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O && channelId != null) {
            NotificationChannel notificationChannel = new NotificationChannel(channelId, "TEMP",
                    NotificationManager.IMPORTANCE_DEFAULT);
            notificationManager.createNotificationChannel(notificationChannel);
        }
        //3.通过 Builder 创建 Notification ,配置其内容。
        Notification.Builder builder = new Notification.Builder(context, channelId);
        builder.setContentTitle(context.getString(R.string.test_notification_title))
                .setContentText(context.getString(R.string.test_notification_content))
                .setWhen(System.currentTimeMillis())
                .setSmallIcon(R.mipmap.ic_launcher);
        Notification notification = builder.build();
        //4.通过 manager 的notify() 显示通知。
        notificationManager.notify(1, notification);
    }

相关源码

NotificationChannel &?Notification 的内部类 Builder

//android-30\android\app\NotificationChannel.java
    /**
     * Creates a notification channel.
     *
     * @param id The id of the channel. Must be unique per package. The value may be truncated if
     *           it is too long.
     * @param name The user visible name of the channel. You can rename this channel when the system
     *             locale changes by listening for the {@link Intent#ACTION_LOCALE_CHANGED}
     *             broadcast. The recommended maximum length is 40 characters; the value may be
     *             truncated if it is too long.
     * @param importance The importance of the channel. This controls how interruptive notifications
     *                   posted to this channel are.
     */
    public NotificationChannel(String id, CharSequence name, @Importance int importance) {
        this.mId = getTrimmedString(id);
        this.mName = name != null ? getTrimmedString(name.toString()) : null;
        this.mImportance = importance;
    }
// android-30\android\app\Notification.java
       /**
         * Constructs a new Builder with the defaults:
         *
         * @param context
         *            A {@link Context} that will be used by the Builder to construct the
         *            RemoteViews. The Context will not be held past the lifetime of this Builder
         *            object.
         * @param channelId
         *            The constructed Notification will be posted on this
         *            {@link NotificationChannel}. To use a NotificationChannel, it must first be
         *            created using {@link NotificationManager#createNotificationChannel}.
         */
        public Builder(Context context, String channelId) {
            this(context, (Notification) null);
            mN.mChannelId = channelId;
        }

Other

很多教程指导都是罗列方法和代码使用案例,缺少一些关键注意点的指引。

我这样的小白有点按部就班的不解,有些坑就是新手才会碰到的。

  移动开发 最新文章
Vue3装载axios和element-ui
android adb cmd
【xcode】Xcode常用快捷键与技巧
Android开发中的线程池使用
Java 和 Android 的 Base64
Android 测试文字编码格式
微信小程序支付
安卓权限记录
知乎之自动养号
【Android Jetpack】DataStore
上一篇文章      下一篇文章      查看所有文章
加:2022-03-10 22:41:17  更:2022-03-10 22:44:50 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 18:33:38-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码