Flutter实现应用销毁后后台播放音乐的技术咨询
Flutter实现应用杀死后后台播放音乐的完整方案
你当前的代码仅完成了后台音频通知的初始化配置,要实现应用被杀死或从最近列表移除后仍能播放音乐,还需要完成以下平台配置和播放逻辑优化:
一、完善依赖配置
在pubspec.yaml中确保添加所需依赖:
dependencies: flutter: sdk: flutter just_audio: ^0.9.36 just_audio_background: ^0.0.1-beta.11 permission_handler: ^10.2.0 # Android 13+ 通知权限请求用
执行flutter pub get安装依赖。
二、Android平台配置
1. 权限与服务声明
修改android/app/src/main/AndroidManifest.xml:
- 在
<manifest>标签内添加权限:<uses-permission android:name="android.permission.FOREGROUND_SERVICE" /> <uses-permission android:name="android.permission.POST_NOTIFICATIONS" /> <!-- Android 13+ 必需 --> - 在
<application>标签内添加后台音频服务声明:<service android:name="com.ryanheise.justaudio.BackgroundAudioService" android:foregroundServiceType="mediaPlayback" />
2. 权限请求逻辑
Android 13及以上版本需要主动请求通知权限,否则前台通知无法显示,后台播放会被系统终止,在播放逻辑中添加权限请求:
import 'package:permission_handler/permission_handler.dart'; Future<void> _requestPermissions() async { if (await Permission.notification.isDenied) { await Permission.notification.request(); } }
三、iOS平台配置
修改ios/Runner/Info.plist,添加后台音频模式:
<key>UIBackgroundModes</key> <array> <string>audio</string> </array> <!-- 播放网络音频时需添加,允许HTTP请求 --> <key>NSAppTransportSecurity</key> <dict> <key>NSAllowsArbitraryLoads</key> <true/> </dict>
四、完整音频播放逻辑实现
在Home.dart中正确初始化AudioPlayer并关联后台播放元数据:
import 'package:just_audio/just_audio.dart'; import 'package:flutter/material.dart'; import 'package:permission_handler/permission_handler.dart'; class Home extends StatefulWidget { @override State<Home> createState() => _HomeState(); } class _HomeState extends State<Home> { late AudioPlayer _player; @override void initState() { super.initState(); _initPlayer(); } Future<void> _initPlayer() async { await _requestPermissions(); _player = AudioPlayer(); // 配置音频源及后台播放元数据 await _player.setAudioSource( AudioSource.uri( Uri.parse("https://example.com/your-audio.mp3"), tag: MediaItem( id: 'audio_1', title: '音频标题', artist: '艺术家', album: '专辑', artUri: Uri.parse("https://example.com/cover.jpg"), // 可选:通知封面图 ), ), ); await _player.play(); } Future<void> _requestPermissions() async { if (await Permission.notification.isDenied) { await Permission.notification.request(); } } @override void dispose() { _player.dispose(); super.dispose(); } @override Widget build(BuildContext context) { return MaterialApp( home: Scaffold( appBar: AppBar(title: const Text("后台音频播放")), body: Center( child: IconButton( iconSize: 60, icon: Icon(_player.playing ? Icons.pause_circle : Icons.play_circle), onPressed: () async { _player.playing ? await _player.pause() : await _player.play(); setState(() {}); }, ), ), ), ); } }
关键注意事项
- 你当前
main.dart中androidNotificationOngoing: true的设置很关键,它让播放通知不可清除,降低系统杀死服务的概率。 - 部分国产Android系统(如小米、华为)有严格后台管控,即使配置正确,应用被杀死后仍可能停止播放,需引导用户将应用加入系统白名单或“后台保护”列表。
- iOS系统中后台播放时长受系统限制,若音频中断可通过监听
playerStateStream重新恢复播放。
内容的提问来源于stack exchange,提问作者Rana sharjeel Ali
相关产品推荐
相关产品推荐

