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
相关产品推荐
相关产品推荐

