Вопрос или проблема
Я завершил приложение, используя Just Audio. Я построил его, следуя приведенному примеру. Я хочу добавить фоновую музыку. Я думал, что следовал примеру Райана Хайза для простого плеера. Должно быть, я что-то упустил. Я получаю следующее исключение:
Произошло исключение.
_TypeError (тип ‘Null’ не является подтипом типа ‘MediaItem’ при приведении типа)
на этой строке:
await musicPlayer.setAudioSource(AudioSource.uri(Uri.parse(url)));
Вот функция, которая завершилась неудачно на этой строке:
Future<void> playBackgroundMusic() async {
int rng = Random().nextInt(7);
// Сообщаем операционной системе о наших аудио атрибутах и т.д.
// Мы выбираем разумное значение по умолчанию для приложения, которое воспроизводит речь.
final session = await AudioSession.instance;
await session.configure(const AudioSessionConfiguration.speech());
String musicFilename = filenameList[rng];
String url =
"MY_SERVER/music/$musicFilename";
final musicPlayer = AudioPlayer();
try {
await musicPlayer.setAudioSource(AudioSource.uri(Uri.parse(url)));
} on PlayerException catch (e) {
print("Ошибка при загрузке аудио источника: $e");
}
musicPlayer.play();
}
Эта функция вызывается в первом initState приложения:
@override
void initState() {
super.initState();
playBackgroundMusic();
}
Похожий вопрос 78571039 был задан, и ответом было импортировать Audio Service и добавить этот код:
AudioSource.uri( Uri.parse(item.music), tag: MediaItem( id: "${item.id}", album: "${musicImage}", title: "${item.name}", artUri: Uri.parse('${musicImage}'), ), ),
Это решило мою проблему – но я бы никогда не узнал об этом из документации Just Audio. Я думаю, что это указывает на то, что что-то (документация) или код нуждается в изменении в Just Audio. Эта проблема не была решена на GitHub в сентябре 2023 года из-за недостатка конкретики. https://github.com/ryanheise/just_audio/issues/991.
Поэтому я прошу либо указать на существующую документацию, которая говорит о том, что этот импорт и строка кода обязательны, либо обновить документацию. Это слишком хороший плагин, чтобы что-то мешало людям его использовать.
Ответ или решение
Уважаемый пользователь,
Спасибо за ваш вопрос и за то, что поделились вашим кодом и возникшей ошибкой. Давайте разберемся с возникшей проблемой и найдем решение.
Ошибка, которую вы получаете:
_TypeError (type 'Null' is not a subtype of type 'MediaItem' in type cast)
указывает на то, что вы пытаетесь установить аудиоресурс без необходимого элемента MediaItem
. В библиотеке Just Audio для установки источника аудио требуется создать MediaItem
, чтобы библиотека могла правильно обработать ваш запрос.
Как вы уже заметили, необходимо добавить MediaItem
к вашему аудиоресурсу. Приведем исправленную версию вашей функции playBackgroundMusic()
:
Future<void> playBackgroundMusic() async {
int rng = Random().nextInt(7);
// Настраиваем аудиосессию
final session = await AudioSession.instance;
await session.configure(const AudioSessionConfiguration.speech());
String musicFilename = filenameList[rng];
String url = "MY_SERVER/music/$musicFilename";
final musicPlayer = AudioPlayer();
try {
// Создаем MediaItem с необходимыми параметрами
final mediaItem = MediaItem(
id: "$rng", // Уникальный идентификатор медиа элемента
album: "Название альбома", // Укажите название альбома
title: musicFilename, // Укажите название песни
artUri: Uri.parse('YOUR_IMAGE_URL'), // Укажите URL обложки
);
// Устанавливаем аудиоресурс, включая MediaItem
await musicPlayer.setAudioSource(
AudioSource.uri(
Uri.parse(url),
tag: mediaItem, // Передаем MediaItem здесь
),
);
// Запускаем воспроизведение
musicPlayer.play();
} on PlayerException catch (e) {
print("Ошибка при загрузке аудиоресурса: $e");
}
}
Обратите внимание на ключевые моменты:
- Мы создаем
MediaItem
перед установкой источника аудио. - Убедитесь, что все параметры, такие как
id
,album
,title
, иartUri
, указаны правильно. Это важно для корректной работы плеера.
Что касается документации, вы правы в том, что поддержка в таких вопросах крайне важна. Я рекомендую вам обратиться к репозиторию Just Audio на GitHub с вашим предложением о внесении изменений в документацию, чтобы другие разработчики могли избежать этой проблемы в будущем.
Если у вас есть дополнительные вопросы или потребуется дальнейшая помощь, не стесняйтесь обращаться.
С уважением,
[Ваше Имя]