允许用户设置通知灯颜色——自Oreo/API 26开始。

4
我正在开发一个应用程序,以前针对Nougat/API 25,并允许用户更改通知灯颜色。这一切都很好地工作,假设他们的设备支持提供的各种颜色,我的手机 - 三星Galaxy S8运行Oreo - 支持(因此这不是与设备相关的问题!)。
由于Oreo/API 26中通知有所改变,我正在努力找出使此功能再次工作的最佳方法。我已经添加了必要的代码来添加NotificationChannel并再次创建通知,并且已经使其使用用户设置的颜色,但仅适用于他们创建的第一条通知。之后,即使他们更改了通知灯颜色设置,并且我使用新颜色创建NotificationChannel,通知灯仍然使用旧颜色。
例如,如果我在安装应用程序后将灯设置为蓝色并收到通知,它将具有蓝色灯。如果我将灯设置为绿色并收到通知,它仍将是蓝色。
我发现如果我更改CHANNEL_ID的值(即创建一个全新的频道),那么这会产生重置效果,因此它将会使用新的用户指定颜色,但是它只会执行一次。我知道在创建NotificationChannel之后无法更改设置,所以我看到有类似答案建议您可以删除NotificationChannel然后重新创建它,但是这对我不起作用。我可以为每种可用的不同颜色单独设置一个通道,但如果用户想要管理通知设置,则这似乎有点过度,并且令人讨厌。
任何想法/建议吗?
如果相关的话,下面是相关代码:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {

    // Create the NotificationChannel
    CharSequence channelName = context.getString(R.string.channel_name);
    String channelDescription = context.getString(R.string.channel_description);
    int importance = NotificationManager.IMPORTANCE_HIGH;

    NotificationChannel channel = new NotificationChannel(CHANNEL_ID, channelName, importance);
    channel.setDescription(channelDescription);
    channel.enableLights(true);
    channel.setLightColor(Helpers.getNotificationLightColor(context));
    channel.enableVibration(true);

    // register the channel with the system
    mNotificationManager.createNotificationChannel(channel);
}

....

NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(context, CHANNEL_ID)
    .setSmallIcon(R.drawable.ic_stat_name)
    .setLargeIcon(bitmap)
    .setContentTitle(name)
    .setContentText(messageText)
    .setPriority(NotificationCompat.PRIORITY_HIGH)
    .setAutoCancel(true)
    .setDefaults(NotificationCompat.DEFAULT_VIBRATE | NotificationCompat.DEFAULT_SOUND)
    .setLights(Helpers.getNotificationLightColor(context),500,2000)
    .setColor(context.getResources().getColor(R.color.color_red))
    .extend(wearableExtender);

Helpers.getNotificationLightColor(context)会检索保存在SharedPreference中的相关颜色,这与之前的版本没有改变。


顺便问一句,如果您不介意的话,您在测试哪个设备? - CommonsWare
好问题:我正在Samsung Galaxy S8上测试运行Oreo-已更新问题以指定此。在应用程序通知> [我的频道]屏幕上没有任何内容可以控制灯光的颜色-具有重要性,声音和振动但没有颜色。 - alfredbulbasaur
好的,我刚刚启动了一台S8手机,但我并没有看到他们在哪里可以切换LED闪烁功能,更不用说调整颜色了。删除并重新创建通道的技巧不太可能奏效,因为Google希望开发人员尝试使用它来规避用户对通知的控制。不幸的是,除了放弃这个功能,我真的没有一个好的解决方案给你。 - CommonsWare
这也是我的想法,有点绕过了首次设置通知渠道的目的。我想我可能不得不放弃它 - 很遗憾,但这并不像是一个关键功能! - alfredbulbasaur
1
我相信那会起作用 - 我手动测试过,看起来没问题。但缺点是,如果用户更改了通知渠道的设置(例如,他们不想让它振动或忽略免打扰),那么这些设置将丢失,这会很烦人! - alfredbulbasaur
显示剩余2条评论
2个回答

3

我找不到任何方法来做到这一点,即使你调用deleteNotificationChannel。

这真的很烦人,因为在 Oreo 上发布任何通知之前,您必须创建通道。一旦您创建了它,您就无法更改setLightColor 设置,然而,在用户进入设置页面(从而声明他们的首选项)之前发布通知的几率相当高。更糟糕的是,即使您卸载应用程序(或清除其数据)并且在原始通道创建期间拒绝完全设置颜色,如果您为同一个应用程序使用相同的频道名称,则会保留该颜色,而且您无法在个别发布通知本身期间设置颜色(在构建器中设置它将被忽略)。

这已经超出荒谬了,但这就是 Google 所做的;我看到防止开发人员逃避用户关闭通知的愿望的原因,但是拒绝更改灯光颜色(特别是当您无法从应用程序的通知页面在系统设置中完成时)有些过分了。

我没有找到任何针对 Oreo 的解决方法....


0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接