android - 自 Oreo/API 26 起允许用户设置通知灯颜色

标签 android android-notifications android-8.0-oreo

我正在开发一个以前针对 Nougat/API 25 并允许用户更改通知灯颜色的应用程序。这一切都很好,假设他们的设备支持提供的各种颜色,我的手机 - 运行 Oreo 的三星 Galaxy S8 - 支持(所以这不是与设备相关的问题!)。

由于 Oreo/API 26 中的通知发生了一些变化,我正在努力寻找让该功能再次发挥作用的最佳方法。我添加了所需的代码来添加 NotificationChannel 并再次创建通知,并让它使用用户设置的颜色,但仅限于他们创建的第一个通知。之后,即使他们更改了通知灯颜色设置,并且我使用新颜色创建了 NotificationChannel,通知灯仍然使用旧颜色。

因此,例如,如果我在安装应用程序后将灯设置为蓝色并收到通知,它将有蓝色灯。如果我将灯设置为绿色并收到通知,它仍然是蓝色的。

我发现如果我更改 CHANNEL_ID 的值(即创建一个全新的 channel ),那么这会产生重置的效果,所以它会选择新的用户指定的颜色,但它只会执行一次.我知道一旦创建 NotificationChannel 就无法更改它的设置,所以我看到了 similar answers建议您可以删除 NotificationChannel 然后重新创建它,但这似乎对我不起作用。我可以为每种可用的不同颜色设置一个单独的 channel ,但是如果用户想自己管理通知设置,这对用户来说似乎有点矫枉过正和烦人。

有什么想法/建议吗?

如果相关,相关代码如下:

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 的相关颜色 - 这与以前的版本没有变化。

最佳答案

即使您调用 deleteNotificationChannel,我也没有办法做到这一点。

这非常烦人,因为在您可以在 Oreo 上发布任何通知之前,您必须创建 channel 。创建它后,您将无法更改 setLightColor 设置,但是在用户进入设置页面(并因此声明他们的偏好)之前发布通知的几率相当高。更糟糕的是,即使您卸载应用程序 (或清除它的数据)并拒绝设置颜色完全 在原始 channel 创建期间,如果您对同一应用程序使用相同的 channel 名称,它将被保留,您不能在单独发布通知本身期间设置颜色(在构建器中设置它被忽略。)

这太荒谬了,但这是谷歌所做的;我看到了阻止开发人员逃避用户关闭通知但拒绝更改灯光的原因颜色 (尤其是当您无法从系统设置中的应用程序通知页面执行此操作时)有点过分了。

我在奥利奥上没有解决方法,我已经能够弄清楚....

关于android - 自 Oreo/API 26 起允许用户设置通知灯颜色,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51032697/

相关文章:

android - 在线程内添加和清除窗口标志

android - Flutter - InkWell 对 Flexible 内部的 onTap 没有反应

c# - 如何在我的资源文件夹中使用 json?

android - 我应该使用什么权限来接收 android 通知?

android - 在 Android 中使用自定义布局覆盖通知的整个高度

android - 无法使用 Oreo android 更改我的应用程序的语言

Android - 在特定日期和时间在 Firebase 作业调度程序中运行作业

android - 移动设备上的 StageVideo

android - 通知在 ICS 4.0 (API 14) 中不显示时间

android - Oreo - 前台服务不显示前台通知