Flutter本地通知Android端图标透明 如何配置显示原始图标
问题描述
使用PNG文件制作本地通知图标时,iOS端显示完全正常,Android端图标呈现透明状态,两端效果如下:
- iOS端通知图标效果

- Android端通知图标异常效果

当前通知功能实现代码:
import 'package:flutter_local_notifications/flutter_local_notifications.dart'; // import 'package:timezone/data/latest_all.dart' as tz; // import 'package:timezone/timezone.dart' as tz; final notifications = FlutterLocalNotificationsPlugin(); initNotification() async { var androidSetting = const AndroidInitializationSettings('ic_launcher'); var iosSetting = const IOSInitializationSettings( requestAlertPermission: true, requestBadgePermission: true, requestSoundPermission: true, ); var initializationSettings = InitializationSettings( android: androidSetting, iOS: iosSetting ); await notifications.initialize( initializationSettings, ); } showNotification() async { var androidDetails = const AndroidNotificationDetails( 'ID', 'notification', priority: Priority.high, importance: Importance.max, // color: Color.fromARGB(255, 255, 0, 0), ); var iosDetails = const IOSNotificationDetails( presentAlert: true, presentBadge: true, presentSound: true, ); notifications.show( 1, 'title1', 'content1', NotificationDetails(android: androidDetails, iOS: iosDetails) ); }
问题原因
Android 5.0(API 级别 21)及以上系统对通知小图标有强制规范:必须使用透明背景+白色单色剪影的素材,系统会自动对图标非透明区域叠加单色蒙版渲染。你当前直接复用彩色、非透明背景的应用启动图标ic_launcher作为通知图标,系统会将不符合规范的彩色区域识别为透明层,最终出现图标全透的显示异常。iOS无该强制限制,因此同一份彩色PNG可正常显示。
解决步骤
1. 生成符合规范的Android通知图标
不要直接复用应用启动图标,单独制作通知素材,最稳妥的方式是用Android Studio自带工具自动生成全分辨率适配的标准图标:
- 打开项目的Android模块,右键点击
android/app/src/main/res目录 - 依次选择
New→Image Asset - Icon Type选择
Notification Icons - 导入你的图标源文件,调整图形尺寸,确保背景完全透明、图形内容为纯白色
- 点击完成,工具会自动将不同分辨率的图标存入对应res目录,默认生成的图标资源名为
ic_notification
2. 修改代码配置
- 替换Android端初始化时的图标引用,将原来的
ic_launcher换成新生成的通知图标:
// 原有配置为ic_launcher,替换为新的通知图标资源 var androidSetting = const AndroidInitializationSettings('@mipmap/ic_notification');
- 如需自定义图标显示颜色,可放开
AndroidNotificationDetails中的color参数,设置为你的应用主题色即可,系统会将图标白色区域渲染为指定颜色:
var androidDetails = const AndroidNotificationDetails( 'ID', 'notification', priority: Priority.high, importance: Importance.max, // 替换为你需要的图标颜色 color: Color.fromARGB(255, 255, 0, 0), );
注意事项
- 配置完成后必须先卸载测试设备上的旧应用再重新安装,Android会缓存通知资源,热重载、覆盖安装都可能导致新图标不生效。
- 如果要实现和iOS完全一致的全彩色通知图标,只能通过自定义通知布局
RemoteViews实现,但该方式不符合Android官方设计规范,部分定制ROM可能出现布局错乱、图标被裁剪的问题,非特殊需求不推荐使用。
内容的提问来源于stack exchange,提问作者황희윤
相关产品推荐
相关产品推荐

