Android Studio: уроки на Kotlin. Звуки по кнопке - MediaPlayer

Звук делает приложение живым: музыка в игре, щелчок при нажатии кнопки или голосовое сообщение. Чтобы работать с аудио, в арсенале Android есть простой инструмент — MediaPlayer. Сегодня в Android Studio мы подключим его и напишем небольшое приложение с тремя кнопками, которое умеет запускать, приостанавливать и останавливать мелодию. Занятие на Kotlin построено так, чтобы каждый, кто впервые пробует звук, сразу получил работающий результат.


Готовим аудиофайл

Для начала нам понадобится сам звук. Подойдёт любой короткий MP3-файл. Положите его в папку res/raw. Если такой папки ещё нет, создайте её: щёлкните правой кнопкой по res, выберите New → Android Resource Directory и в поле Resource type укажите raw. Скопируйте туда ваш файл, назвав его, например, sample_audio.mp3. Система будет обращаться к нему через идентификатор R.raw.sample_audio.


Собираем интерфейс

В файле activity_main.xml разместите три кнопки горизонтально: Play, Pause и Stop. Для этого удобно взять LinearLayout с горизонтальной ориентацией и равномерно распределить в нём кнопки через вес. Каждой задайте свой id.

<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="horizontal">
    <Button
        android:id="@+id/btnPlay"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:text="Play" />
    <Button
        android:id="@+id/btnPause"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:text="Pause" />
    <Button
        android:id="@+id/btnStop"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:text="Stop" />
</LinearLayout>

Создаём MediaPlayer в коде

В MainActivity.kt объявим переменную mediaPlayer и инициализируем её в onCreate. Для создания плеера используется статический метод MediaPlayer.create, который принимает контекст и ссылку на аудиофайл. Затем сразу готовим плеер к воспроизведению.

private var mediaPlayer: MediaPlayer? = null

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)

    mediaPlayer = MediaPlayer.create(this, R.raw.sample_audio)
}

Кнопка Play

Находим кнопку Play и вешаем на неё простой вызов start(). Если плеер уже играет, повторный вызов не навредит — он просто продолжит. Дополнительно можно проверять, не проигрывается ли уже трек, с помощью isPlaying, но для простоты опустим эту проверку.

btnPlay.setOnClickListener {
    mediaPlayer?.start()
}

Кнопка Pause

Метод pause() ставит воспроизведение на паузу. При повторном нажатии Play оно продолжится с того же места. Это удобно для длинных аудиозаписей.

btnPause.setOnClickListener {
    mediaPlayer?.pause()
}

Кнопка Stop

Остановка плеера выполняется через stop(). После остановки нужно заново подготовить плеер к следующему запуску, иначе Play не сработает. Для этого вызываем prepare() сразу после stop().

btnStop.setOnClickListener {
    mediaPlayer?.stop()
    mediaPlayer?.prepare()
}

Освобождаем ресурсы

Когда Activity уничтожается, плеер должен быть освобождён, чтобы не занимать системные ресурсы. Переопределим метод onDestroy и вызовем release().

override fun onDestroy() {
    super.onDestroy()
    mediaPlayer?.release()
    mediaPlayer = null
}

Весь код MainActivity

class MainActivity : AppCompatActivity() {
    private var mediaPlayer: MediaPlayer? = null

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        mediaPlayer = MediaPlayer.create(this, R.raw.sample_audio)

        val btnPlay = findViewById<Button>(R.id.btnPlay)
        val btnPause = findViewById<Button>(R.id.btnPause)
        val btnStop = findViewById<Button>(R.id.btnStop)

        btnPlay.setOnClickListener { mediaPlayer?.start() }
        btnPause.setOnClickListener { mediaPlayer?.pause() }
        btnStop.setOnClickListener {
            mediaPlayer?.stop()
            mediaPlayer?.prepare()
        }
    }

    override fun onDestroy() {
        super.onDestroy()
        mediaPlayer?.release()
        mediaPlayer = null
    }
}

Несколько подсказок начинающим

  • Не кладите тяжёлые файлы в raw. Папка res/raw хранит файлы без сжатия, и они увеличивают размер APK. Для больших аудиозаписей лучше загружать их из интернета или с SD-карты.
  • Обрабатывайте ошибки. Если файл не найден или повреждён, MediaPlayer.create вернёт null. Добавьте проверку перед вызовом методов.
  • Учитывайте фокус аудио. Если приложение должно уступать звук звонкам, используйте AudioManager и запрашивайте аудиофокус. Но для простого урока это избыточно.

Чему мы научились

Сегодняшний практический урок показал, как в Android Studio с помощью языка Kotlin легко управлять воспроизведением звука. Вы создали плеер из локального файла, запрограммировали кнопки Play, Pause и Stop и не забыли освободить ресурсы при закрытии экрана. Теперь в вашем распоряжении есть готовый шаблон для добавления фоновой музыки, звуковых эффектов или даже простого диктофона. Попробуйте загрузить другой аудиофайл или добавить кнопку перемотки — это сразу даст более глубокое понимание работы MediaPlayer.