如何使用audioplayers包实现手机锁屏时持续播放音乐?
解决audioplayers锁屏后音乐停止播放的问题
要实现锁屏后音乐持续播放,需要分别配置Android/iOS的系统权限,并在代码中开启前台通知服务,具体步骤如下:
Android 端配置
添加权限与服务声明
在android/app/src/main/AndroidManifest.xml中,添加前台服务权限并注册音频服务:<!-- 添加权限 --> <uses-permission android:name="android.permission.FOREGROUND_SERVICE"/> <uses-permission android:name="android.permission.WAKE_LOCK"/> <!-- 可选,防止设备深度休眠 --> <!-- 在application标签内添加服务 --> <application ...> <service android:name="xyz.luan.audioplayers.AudioService" android:foregroundServiceType="mediaPlayback"/> </application>创建通知渠道(Android 8.0+)
Android 8.0及以上要求必须创建通知渠道才能显示前台通知,否则后台播放会被系统终止。可以在App启动时初始化渠道:if (Platform.isAndroid) { const channel = AndroidNotificationChannel( 'music_playback_channel', // 唯一ID '音乐播放', // 渠道名称 description: '后台音乐播放通知渠道', // 渠道描述 importance: Importance.high, ); await FlutterLocalNotificationsPlugin() .resolvePlatformSpecificImplementation<AndroidFlutterLocalNotificationsPlugin>() ?.createNotificationChannel(channel); }(注:需要依赖
flutter_local_notifications包,或者直接通过audioplayers的通知配置自动创建,前者更可控)
iOS 端配置
在ios/Runner/Info.plist中添加后台音频模式权限:
<key>UIBackgroundModes</key> <array> <string>audio</string> </array>
这会告诉iOS系统,你的App需要在后台处理音频任务,不会被系统挂起。
代码层面设置
初始化AudioPlayer时,必须开启通知并配置通知详情,确保音乐以前台服务形式运行:
import 'package:audioplayers/audioplayers.dart'; import 'package:flutter/foundation.dart'; final player = AudioPlayer(); Future<void> initPlayer() async { // 设置播放模式,可选:loop、release、stop await player.setReleaseMode(ReleaseMode.loop); // 开启通知,这是后台播放的关键 await player.setNotificationEnabled(true); // 配置通知详情 await player.setNotificationDetails( NotificationDetails( android: AndroidNotificationDetails( 'music_playback_channel', // 与之前创建的渠道ID一致 '音乐播放', channelDescription: '后台播放音乐时显示的通知', importance: Importance.high, priority: Priority.high, ongoing: true, // 标记通知为持续型,无法手动清除 showProgress: true, ), iOS: IOSNotificationDetails( playPauseButton: true, stopButton: true, forwardSkipButton: false, backwardSkipButton: false, ), ), ); // 加载并播放音频 await player.play(UrlSource('your_audio_url_or_path')); }
关键注意事项
- Android上必须开启前台通知:系统会在App进入后台后回收资源,只有前台服务(带通知)才能保持音频播放。
- iOS上确保音频会话正确:audioplayers会自动配置音频会话为播放模式,但如果有冲突,可以手动调整(比如使用
audio_session包)。 - 避免使用
ReleaseMode.release:该模式会在音频播放完毕后释放资源,后台播放时建议用loop或stop。
内容的提问来源于stack exchange,提问作者Taoufik
相关产品推荐
相关产品推荐

