MediaPlayer setDataSource нужен совет передового опыта
После прочтения "Media Playback " а также "Медиа-плейер" Документация Android I 'Я все еще в замешательстве и нуждаюсь в опытном совете оsetDataSource перегруженный метод.
я используюMediaPlayer
вService
компонент в моем проекте, который будетforegroundService во время воспроизведения музыки. У меня есть музыкальный файл (.mp3) вres/raw
папка моего апк. Чтобы начать играть, я знаю, что должен подготовить объект MediaPlayer. Поскольку службы в приложениях для Android по умолчанию используют один процесс и основной поток, я нене хочу, чтобы мои пользователи получалиANR в то время как MediaPlayer готовится сам (подумайте, имеет ли медиа-файл в папке raw большой размер). Тогда я используюprepareAsync
вместоprepare
(Синхронизация). Поэтому я не могу использовать:
mp = MediaPlayer.create(context, R.raw.myfile);
Потому что это уже называетprepare()
внутренне, но неprepareAsync()
, Так что в основном у меня есть два варианта (два из четырех):
Uri myUri = Uri.parse("android.resource://" + context.getPackageName() + "/" + R.raw.myfile);
mp.setDataSource(context, myUri);
или же
AssetFileDescriptor afd = context.getResources().openRawResourceFd(R.raw.myfile);
mp.setDataSource(fd.getFileDescriptor());
afd.close();
после использования одного из них я могу просто использовать:
mp.prepareAsync();
И вот наконец у меня возникают вопросы:включая эти разные методы, какой из них является лучшим вариантом? Есть ли какие-то преимущества один над другим? Я что-то упустил? "