MediaPlayer setDataSource нужен совет передового опыта
После прочтения "Медиа Воспроизведение" а также "Проигрыватель медиаДокументация Android Я все еще смущен и нуждаюсь в опытном совете о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();
И, наконец, у меня возникают вопросы: «Включая эти различные методы, какой из них является лучшим вариантом? Есть ли какие-то преимущества перед другим?