В этом документе представлены основные понятия, с которыми вам следует ознакомиться перед началом работы с Media Player.
Звуковые и видеоклассы
Следующие классы воспроизводят звук и видео в платформе Android:
-
MediaPlayer
: этот класс является основным API для воспроизведения звука и видео. -
AudioManager
: этот класс управляет источниками звука и выводом звука на устройстве.
Манифестные декларации
Прежде чем приступить к разработке приложения с помощью MediaPlayer, убедитесь, что в вашем манифесте есть соответствующие объявления, позволяющие использовать связанные функции.
Разрешение Интернета. Если вы используете MediaPlayer для потоковой передачи сетевого контента, ваше приложение должно запросить доступ к сети.
<uses-permission android:name="android.permission.INTERNET" />
Разрешение на блокировку пробуждения: если вашему приложению проигрывателя необходимо предотвратить затемнение экрана или переход процессора в спящий режим или использовать методы
MediaPlayer.setScreenOnWhilePlaying(boolean)
илиMediaPlayer.setWakeMode(android.content.Context, int)
, вы должны запросить это разрешение. .<uses-permission android:name="android.permission.WAKE_LOCK" />
Используйте класс MediaPlayer
Класс MediaPlayer
является важным компонентом медиа-фреймворка. Объект этого класса может извлекать, декодировать и воспроизводить как аудио, так и видео с минимальной настройкой. MediaPlayer
поддерживает несколько источников мультимедиа, в том числе:
- Местные ресурсы
- Внутренние URI, например те, которые вы можете получить от Content Resolver.
- Внешние URL-адреса (потоковая передача)
Список медиаформатов, которые поддерживает Android, см. на странице «Поддерживаемые медиаформаты» .
Примеры работы с источниками звука
Вот пример того, как воспроизводить аудио, доступное как локальный необработанный ресурс (сохраненный в каталоге res/raw/
вашего приложения):
Котлин
var mediaPlayer = MediaPlayer.create(context, R.raw.sound_file_1)
mediaPlayer.start() // no need to call prepare(); create() does that for you
Ява
MediaPlayer mediaPlayer = MediaPlayer.create(context, R.raw.sound_file_1);
mediaPlayer.start(); // no need to call prepare(); create() does that for you
В данном случае «сырой» ресурс — это файл, который система не пытается проанализировать каким-либо конкретным способом. Однако содержимое этого ресурса не должно быть необработанным аудио. Это должен быть правильно закодированный и отформатированный медиафайл в одном из поддерживаемых форматов.
А вот как вы можете играть, используя URI, доступный локально в системе (например, полученный с помощью Content Resolver):
Котлин
val myUri: Uri = .... // initialize Uri here
val mediaPlayer = MediaPlayer().apply {
setAudioAttributes(
AudioAttributes.Builder()
.setContentType(AudioAttributes.CONTENT_TYPE_MUSIC)
.setUsage(AudioAttributes.USAGE_MEDIA)
.build()
)
setDataSource(applicationContext, myUri)
prepare()
start()
}
Ява
Uri myUri = ....; // initialize Uri here
MediaPlayer mediaPlayer = new MediaPlayer();
mediaPlayer.setAudioAttributes(
new AudioAttributes.Builder()
.setContentType(AudioAttributes.CONTENT_TYPE_MUSIC)
.setUsage(AudioAttributes.USAGE_MEDIA)
.build()
);
mediaPlayer.setDataSource(getApplicationContext(), myUri);
mediaPlayer.prepare();
mediaPlayer.start();
Воспроизведение с удаленного URL-адреса с использованием потоковой передачи HTTP выглядит следующим образом:
Котлин
val url = "http://........" // your URL here
val mediaPlayer = MediaPlayer().apply {
setAudioAttributes(
AudioAttributes.Builder()
.setContentType(AudioAttributes.CONTENT_TYPE_MUSIC)
.setUsage(AudioAttributes.USAGE_MEDIA)
.build()
)
setDataSource(url)
prepare() // might take long! (for buffering, etc)
start()
}
Ява
String url = "http://........"; // your URL here
MediaPlayer mediaPlayer = new MediaPlayer();
mediaPlayer.setAudioAttributes(
new AudioAttributes.Builder()
.setContentType(AudioAttributes.CONTENT_TYPE_MUSIC)
.setUsage(AudioAttributes.USAGE_MEDIA)
.build()
);
mediaPlayer.setDataSource(url);
mediaPlayer.prepare(); // might take long! (for buffering, etc)
mediaPlayer.start();
Используйте асинхронную подготовку для повышения производительности.
Помните о производительности при использовании MediaPlayer
. Например, выполнение вызова prepare()
может занять много времени, поскольку может включать выборку и декодирование мультимедийных данных. Поэтому, как и любой метод, выполнение которого может занять много времени, никогда не вызывайте его из потока пользовательского интерфейса вашего приложения . В противном случае пользовательский интерфейс перестанет отвечать до тех пор, пока метод не вернет ответ, что является плохим взаимодействием с пользователем и может привести к ошибке ANR (приложение не отвечает).
Чтобы избежать зависания потока пользовательского интерфейса, создайте другой поток для подготовки MediaPlayer
и уведомите основной поток о завершении. Платформа предоставляет удобный способ выполнения этой задачи с помощью метода prepareAsync()
. Этот метод запускает подготовку носителя в фоновом режиме и немедленно завершает работу. Когда носитель не готовится, вызывается метод onPrepared()
MediaPlayer.OnPreparedListener
, настроенный с помощью setOnPreparedListener()
.
Узнать больше
Jetpack Media3 — рекомендуемое решение для воспроизведения мультимедиа в вашем приложении. Узнайте больше об этом.
На этих страницах рассматриваются темы, связанные с записью, хранением и воспроизведением аудио и видео: