flutter如何通过audioservice更新播放状态

在Flutter中使用audio_service时,如何正确更新播放状态?我已经实现了基本的播放功能,但状态更新不实时,比如播放/暂停按钮的状态不能及时同步。具体应该如何处理回调或通知UI更新?需要监听哪些事件或调用哪些方法?

2 回复

使用AudioService.updateMediaItem更新播放状态。在AudioServiceBackground.setState中设置playing状态,通过AudioServiceBackground.setState通知前台更新UI。

更多关于flutter如何通过audioservice更新播放状态的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


在 Flutter 中,使用 audio_service 包更新播放状态(如播放、暂停、停止)可以通过 AudioHandler 实现。以下是步骤和示例代码:

步骤

  1. 定义 AudioHandler:继承 BaseAudioHandler,并实现播放控制方法。
  2. 更新播放状态:在方法中调用 playbackState.add(...) 更新状态。
  3. 通知 UI:状态变更后,UI 可通过 StreamBuilder 监听并刷新。

示例代码

  1. 自定义 AudioHandler
class MyAudioHandler extends BaseAudioHandler {
  final _player = AudioPlayer(); // 例如使用 just_audio

  MyAudioHandler() {
    // 监听播放器状态并同步到 audio_service
    _player.playbackEventStream.map(_transformEvent).listen(playbackState.add);
  }

  @override
  Future<void> play() async {
    await _player.play();
    // 状态会自动通过 playbackEventStream 更新
  }

  @override
  Future<void> pause() async {
    await _player.pause();
  }

  @override
  Future<void> stop() async {
    await _player.stop();
  }

  // 转换播放器事件为 audio_service 的 PlaybackState
  PlaybackState _transformEvent(PlaybackEvent event) {
    return PlaybackState(
      controls: [
        MediaControl.play,
        MediaControl.pause,
        MediaControl.stop,
      ],
      systemActions: {MediaAction.seek},
      processingState: _getProcessingState(event.processingState),
      playing: _player.playing,
      updatePosition: event.position,
      bufferedPosition: event.bufferedPosition,
      speed: _player.speed,
    );
  }

  AudioProcessingState _getProcessingState(ProcessingState state) {
    switch (state) {
      case ProcessingState.idle:
        return AudioProcessingState.idle;
      case ProcessingState.loading:
        return AudioProcessingState.loading;
      case ProcessingState.buffering:
        return AudioProcessingState.buffering;
      case ProcessingState.ready:
        return AudioProcessingState.ready;
      case ProcessingState.completed:
        return AudioProcessingState.completed;
      default:
        return AudioProcessingState.idle;
    }
  }
}
  1. 初始化 AudioService(在 main 中):
void main() {
  AudioService.init(
    builder: () => MyAudioHandler(),
    config: AudioServiceConfig(
      androidNotificationChannelId: 'com.example.audio',
      androidNotificationChannelName: 'Audio Playback',
    ),
  );
  runApp(MyApp());
}
  1. 在 UI 中监听状态
StreamBuilder<PlaybackState>(
  stream: AudioService.playbackState,
  builder: (context, snapshot) {
    final state = snapshot.data;
    final playing = state?.playing ?? false;
    return IconButton(
      icon: Icon(playing ? Icons.pause : Icons.play_arrow),
      onPressed: () {
        if (playing) {
          AudioService.pause();
        } else {
          AudioService.play();
        }
      },
    );
  },
);

说明

  • 播放状态更新:通过 playbackState.add() 推送新的 PlaybackState,通常由播放器事件(如 just_audioplaybackEventStream)自动触发。
  • 关键属性
    • playing:是否正在播放。
    • processingState:当前处理状态(如加载中、缓冲、播放完成)。
  • 依赖:确保在 pubspec.yaml 中添加 audio_service 和播放器库(如 just_audio)。

通过以上代码,即可实现播放状态的管理和 UI 同步。

回到顶部