Как изменить текущий mediaItem при воспроизведении следующего mediaItem в очереди
Я разрабатываю приложение для iOS во Flutter, используя пакет audio_service. я использую
AudioServiceBackground.serQueue()
чтобы установить несколько MediaItem в очередь.
В части пользовательского интерфейса я пытаюсь использовать
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();
}
}
}
1 ответ
Попробуйте прочитать документацию и следовать некоторым из приведенных там примеров. Потому что в разделе «Фоновый код» есть код «при запуске». Может быть, этот код поможет вам. Мне очень жаль, что я не могу вам так сильно помочь. Я никогда не пробовал этот пакет.