flutter如何实现just_audio_back音频播放功能

在Flutter项目中集成just_audio_background插件时遇到问题:按照文档配置后,后台音频播放功能仍无法正常工作。具体表现为应用退到后台时音频停止,通知栏也未显示播放控件。已尝试设置AndroidManifest.xml的foregroundService权限和AudioService.init()初始化,但未生效。请问正确的后台音频实现流程是什么?是否需要额外处理iOS端的配置?能否提供完整的代码示例?

2 回复

使用just_audio_back插件实现音频播放,步骤如下:

  1. 添加依赖:在pubspec.yaml中添加just_audio_back
  2. 初始化播放器:AudioPlayer player = AudioPlayer();
  3. 加载音频:player.setUrl('音频URL')
  4. 控制播放:player.play()player.pause()player.stop()
  5. 释放资源:player.dispose()

注意:该插件适用于后台播放,需配置Android和iOS权限。

更多关于flutter如何实现just_audio_back音频播放功能的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


在 Flutter 中实现音频播放功能,推荐使用 just_audio 包。它支持本地和网络音频,并提供了丰富的控制功能。以下是实现步骤:

1. 添加依赖

pubspec.yaml 文件中添加依赖:

dependencies:
  just_audio: ^0.9.35
  audio_session: ^0.1.20  # 可选,用于配置音频会话

2. 基本实现代码

import 'package:flutter/material.dart';
import 'package:just_audio/just_audio.dart';

class AudioPlayerPage extends StatefulWidget {
  @override
  _AudioPlayerPageState createState() => _AudioPlayerPageState();
}

class _AudioPlayerPageState extends State<AudioPlayerPage> {
  final AudioPlayer _audioPlayer = AudioPlayer();

  @override
  void initState() {
    super.initState();
    _initAudio();
  }

  Future<void> _initAudio() async {
    try {
      // 播放网络音频
      await _audioPlayer.setUrl('https://example.com/audio.mp3');
      // 或播放本地音频
      // await _audioPlayer.setAsset('assets/audio.mp3');
    } catch (e) {
      print("Error loading audio: $e");
    }
  }

  @override
  void dispose() {
    _audioPlayer.dispose();
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Column(
        children: [
          // 播放/暂停按钮
          StreamBuilder<PlayerState>(
            stream: _audioPlayer.playerStateStream,
            builder: (context, snapshot) {
              final playerState = snapshot.data;
              final processingState = playerState?.processingState;
              final playing = playerState?.playing;
              if (processingState == ProcessingState.loading ||
                  processingState == ProcessingState.buffering) {
                return CircularProgressIndicator();
              } else if (playing != true) {
                return IconButton(
                  icon: Icon(Icons.play_arrow),
                  onPressed: _audioPlayer.play,
                );
              } else {
                return IconButton(
                  icon: Icon(Icons.pause),
                  onPressed: _audioPlayer.pause,
                );
              }
            },
          ),
          // 进度条
          StreamBuilder<Duration>(
            stream: _audioPlayer.positionStream,
            builder: (context, snapshot) {
              final position = snapshot.data ?? Duration.zero;
              return Slider(
                value: position.inSeconds.toDouble(),
                max: _audioPlayer.duration?.inSeconds.toDouble() ?? 1.0,
                onChanged: (value) {
                  _audioPlayer.seek(Duration(seconds: value.toInt()));
                },
              );
            },
          ),
        ],
      ),
    );
  }
}

3. 关键功能说明

  • 加载音频:使用 setUrl() 加载网络音频,或 setAsset() 加载本地资源。
  • 播放控制:通过 play()pause()stop() 控制播放。
  • 进度控制:使用 seek() 跳转位置,通过 positionStream 监听进度。
  • 状态监听playerStateStream 可监听播放状态(加载中/播放中/暂停等)。

4. 高级配置(可选)

使用 audio_session 包配置音频会话,优化后台播放和耳机控制:

import 'package:audio_session/audio_session.dart';

void configureAudioSession() async {
  final session = await AudioSession.instance;
  await session.configure(AudioSessionConfiguration.music());
}

注意事项

  • 需要在 AndroidManifest.xmlInfo.plist 中声明网络权限(网络音频)。
  • 后台播放需配置后台音频权限(Android 需后台服务,iOS 需后台模式)。

以上代码提供了基础播放功能,可根据需要扩展播放列表、循环模式等功能。

回到顶部