2

我正在使用名为audio_service的包在 Flutter 中开发 iOS 应用程序。我AudioServiceBackground.serQueue()用来将多个 MediaItem 设置为一个队列。

在 UI 部分,我试图用来AudioService.currentMediaItemStream显示当前正在播放的媒体项的信息。

当队列中的第一首歌曲播放完后,将播放第二首歌曲。但是,当前媒体项目的信息不会改变。

如何检测队列中播放的歌曲发生了变化?

class AudioServiceScreen extends StatefulWidget {
  @override
  _AudioServiceScreenState createState() => _AudioServiceScreenState();
}

class _AudioServiceScreenState extends State<AudioServiceScreen> {
  @override
  void initState() {
    super.initState();
    Future(() async {
      await AudioService.connect();
      await start();
    });
  }

  @override
  void dispose() {
    Future(() async {
      await AudioService.disconnect();
    });
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: ///,
      body: StreamBuilder<MediaItem?>(
        stream: AudioService.currentMediaItemStream,
        builder: (context, snapshot) {
          final mediaItem = snapshot.data;
        },
      ),
    );
  }

  Future<dynamic> start() async {
    final success = await AudioService.start(
      backgroundTaskEntrypoint: _backgroundTaskEntrypoint,
    );
    if (success) {
      await updateQueue();
    }
  }

  Future<void> updateQueue() async {
    final queue = await getMediaLibrary();  // get data from FireStore
    await AudioService.updateQueue(queue);
  }
}

void _backgroundTaskEntrypoint() {
  AudioServiceBackground.run(() => AudioPlayerTask());
}

class AudioPlayerTask extends BackgroundAudioTask {
  final AudioPlayer audioPlayer = AudioPlayer();

  @override
  Future<void> onStart(Map<String, dynamic>? params) async {
    final session = await AudioSession.instance;
    await session.configure(const AudioSessionConfiguration.speech());

    await AudioServiceBackground.setState(
      controls: [MediaControl.pause, MediaControl.stop],
      playing: false,
      processingState: AudioProcessingState.connecting,
    );
  }

  @override
  Future<void> onUpdateQueue(List<MediaItem> queue) async {
    await AudioServiceBackground.setQueue(queue);

    try {
      await audioPlayer.setAudioSource(ConcatenatingAudioSource(
        children:
            queue.map((item) => AudioSource.uri(Uri.parse(item.id))).toList(),
      ));
    } on Exception catch (e) {
      await onStop();
    }
  }
}
4

1 回答 1

0

尝试阅读文档并按照其中的一些示例进行操作。因为在“背景代码”部分,有“开始”代码。也许该代码可以帮助您。很抱歉我帮不了你那么多。我从不尝试那个包。

于 2021-05-17T09:26:55.850 回答