You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 16:15:52