Начало работы с медиаплеером

В этом документе представлены основные понятия, с которыми вам следует ознакомиться перед началом работы с 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 — рекомендуемое решение для воспроизведения мультимедиа в вашем приложении. Узнайте больше об этом.

На этих страницах рассматриваются темы, связанные с записью, хранением и воспроизведением аудио и видео: