Flutter后台通知为何播放默认音效?自定义音效失效求助
Flutter后台通知自定义音效不生效的解决方法
问题根源:前台通知是通过flutter_local_notifications主动显示的,所以自定义音效能正常生效;但后台/应用被杀死状态下,Firebase会直接通过系统通知栏展示通知,使用的是你在Manifest中配置的默认通知频道,而这个频道默认没有绑定你的自定义音效。
以下是具体修复步骤:
1. 确认音效文件位置正确
将自定义音效文件(比如newservice.mp3)放到android/app/src/main/res/raw/目录下,没有raw文件夹就手动创建一个,注意文件名不要包含特殊字符或空格。
2. 创建并配置默认通知频道
在initMessaging方法中,初始化flutter_local_notifications后,主动创建和Manifest中一致的默认通知频道,并绑定自定义音效:
修改后的initMessaging代码片段:
void initMessaging() async { final token = await FirebaseMessaging.instance.getToken(); log(DateTime.now().toString() + ' ' + ' ------------ FIREBASE TOKEN -----> $token '); firebaseToken = token.toString(); FirebaseMessaging messaging = FirebaseMessaging.instance; late FlutterLocalNotificationsPlugin fltNotification; var androiInit = AndroidInitializationSettings("@mipmap/ic_launcher"); var iosInit = DarwinInitializationSettings(); var initSetting = InitializationSettings(android: androiInit, iOS: iosInit); fltNotification = FlutterLocalNotificationsPlugin(); await fltNotification.initialize(initSetting); // 关键:创建默认通知频道,和Manifest中的ID一致 const defaultChannelId = 'default_notification_channel_id'; await fltNotification.resolvePlatformSpecificImplementation<AndroidFlutterLocalNotificationsPlugin>() ?.createNotificationChannel(AndroidNotificationChannel( defaultChannelId, '默认通知频道', description: '接收Firebase后台通知的频道', importance: Importance.max, priority: Priority.high, playSound: true, sound: RawResourceAndroidNotificationSound('newservice'), )); var androidDetails = AndroidNotificationDetails( defaultChannelId, // 这里也改成默认频道ID,保持统一 '默认通知频道', channelDescription: '接收Firebase前台通知的频道', importance: Importance.max, priority: Priority.high, playSound: true, ticker: 'ticker', icon: ('@mipmap/ic_launcher'), sound: RawResourceAndroidNotificationSound('newservice'), ); var iosDetails = DarwinNotificationDetails(); var generalNotificationDetails = NotificationDetails(android: androidDetails, iOS: iosDetails); FirebaseMessaging.onMessage.listen((RemoteMessage message) { RemoteNotification? notification = message.notification; AndroidNotification? android = message.notification?.android; if (notification != null && android != null) { fltNotification.show(notification.hashCode, notification.title, notification.body, generalNotificationDetails); } }); }
3. 确保Manifest配置和代码一致
检查Android Manifest中,默认通知频道ID和代码里的defaultChannelId完全一致:
<meta-data android:name="com.google.firebase.messaging.default_notification_channel_id" android:value="default_notification_channel_id" />
4. 测试注意事项
- Android 8.0+的通知频道一旦创建,就无法通过代码修改音效等配置,所以测试前必须卸载旧版本APP,再重新安装测试。
- 如果发送的是Firebase的
notification类型消息,后台会直接用默认频道展示;如果是data类型消息,你可以在FirebaseMessaging.onMessageOpenedApp回调中手动调用flutter_local_notifications显示通知,完全控制音效。
内容的提问来源于stack exchange,提问作者Henrique Guimarães
相关产品推荐
相关产品推荐

