You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Delphi Android 8通知图标始终显示白色Accent问题求助

解决Delphi Android项目通知图标被强制加白色Accent的问题

在Android 8及以上系统里,Delphi默认的通知机制会把自定义图标改成白色Accent样式,哪怕你关掉项目里的Accent颜色选项也没用。下面是实打实的解决办法:

1. 先搞懂Android的规则

Android 8+对通知图标有硬性要求:默认只认透明+白色的图标,非白色部分会被替换成系统Accent色。但要保留原始彩色图标,得靠自定义通知渠道绕开这个限制。

2. 调整项目配置

  • 打开项目选项,进入Application > Version Info,确认android:icon指向你的自定义图标(比如@drawable/my_custom_icon)。
  • 关掉Appearance > Accent Color的复选框后,手动检查AndroidManifest.template.xml,把里面所有和android:colorAccent相关的通知配置删掉,避免Delphi自动生成带Accent的设置。

3. 代码里创建自定义通知渠道(核心步骤)

Delphi默认的通知渠道会继承系统Accent色,所以必须自己建一个渠道,指定图标并关闭颜色覆盖:

uses
  Androidapi.JNI.App, Androidapi.JNI.GraphicsContentViewText, Androidapi.Helpers;

procedure CreateCustomNotificationChannel;
var
  Channel: JNotificationChannel;
  NotificationManager: JNotificationManager;
begin
  if TJBuild_VERSION.JavaClass.SDK_INT >= TJBuild_VERSION_CODES.JavaClass.O then
  begin
    NotificationManager := TJNotificationManager.Wrap(
      TAndroidHelper.Context.getSystemService(TJContext.JavaClass.NOTIFICATION_SERVICE));
    // 自定义渠道ID,随便取个好记的
    Channel := TJNotificationChannel.JavaClass.init(
      StringToJString('MyCustomChannel'),
      StringToJString('我的通知渠道'),
      TJNotificationManager.JavaClass.IMPORTANCE_DEFAULT);
    // 关键:把渠道颜色设为0(透明),系统就不会覆盖图标颜色了
    Channel.setColor(0);
    Channel.setShowBadge(True);
    // 按需设置声音,不需要就留空
    Channel.setSound(nil, nil);
    NotificationManager.createNotificationChannel(Channel);
  end;
end;

然后在发通知前,先调用这个方法创建渠道,并且让通知用这个渠道:

var
  MyNotification: TNotification;
begin
  // 先创建自定义渠道
  CreateCustomNotificationChannel;
  
  MyNotification := NotificationCenter.CreateNotification;
  try
    MyNotification.Name := 'MyNotification';
    MyNotification.AlertBody := 'Delphi for your mobile device is here!';
    MyNotification.FireDate := Now + EncodeTime(0, 0, 10, 0); // 10秒后触发
    // 指定用刚才创建的渠道ID
    MyNotification.ChannelID := 'MyCustomChannel';
    // 手动指定图标文件名(不带扩展名,放在Android/res/drawable目录下)
    MyNotification.Icon := 'my_custom_icon';
    NotificationCenter.ScheduleNotification(MyNotification);
  finally
    MyNotification.DisposeOf;
  end;
end;

4. 图标文件要放对

  • 把你的彩色PNG图标放到Android\res\drawable-xxxhdpi(对应不同分辨率的目录都可以放,优先用高分辨率的)。
  • 图标要有透明背景,别用纯实心的,不然可能显示异常。
  • 别用Delphi自带的通知图标模板,那玩意儿本来就是为白色Accent设计的。

5. 最后测试

清理项目,重新编译装到Android 8+的设备上,发个通知看看。要是还不行,去系统设置的「通知管理」里看看自定义渠道有没有创建成功,或者检查AndroidManifest.xml里有没有残留的Accent配置。

内容的提问来源于stack exchange,提问作者Vegeto x

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 14:25:22