В этом руководстве мы будем использовать класс MediaPlayer для реализации базового аудиоплеера в нашем приложении Android. Мы добавим функцию Play / Stop, а также позволим пользователю изменять положение песни с помощью SeekBar ,
Класс MediaPlayer используется для воспроизведения аудио и видео файлов. Общие методы класса MediaPlayer, которые мы будем использовать:
- Начало()
- стоп()
- release () - для предотвращения утечек памяти.
- seekTo (position) - это будет использоваться с SeekBar
- isPlaying () - Дайте нам знать, воспроизводится ли песня или нет.
- getDuration () - используется для получения общей продолжительности. Используя это, мы узнаем верхний предел нашего SeekBar. Эта функция возвращает продолжительность в миллисекундах
- setDataSource (FileDescriptor fd) - используется для установки файла для воспроизведения.
- setVolume (float leftVolume, float rightVolume) - используется для установки уровня громкости. Значение находится в диапазоне от 0 до 1.
Мы будем воспроизводить mp3-файл, хранящийся в папке ресурсов нашего проекта Android Studio.
Извлечение файла звуковых ресурсов из папки «Ресурсы»
копия
AssetFileDescriptor descriptor = getAssets (). OpenFd ("имя файла"); mediaPlayer.setDataSource (descriptor.getFileDescriptor (), descriptor.getStartOffset (), descriptor.getLength ()); descriptor.close ();
Чтобы создать приложение, которое воспроизводит аудио и позволяет вам изменить положение текущей дорожки песни, нам нужно реализовать три вещи:
- Медиа плеер
- SeekBar With Text - для отображения текущего времени выполнения, кроме большого пальца.
- Runnable Thread - для обновления панели поиска.
Структура проекта
Добавьте следующую зависимость в ваш build.gradle:
копия
реализация 'com.android.support:design:28.0.0-alpha3'
Код
Код для activity_main.xml приведен ниже:
копия
<? xml version = "1.0" encoding = "utf-8"?> <LinearLayout xmlns: android = "http://schemas.android.com/apk/res/android" xmlns: app = "http: // schemas .android.com / apk / res-auto "xmlns: tools =" http://schemas.android.com/tools "android: layout_width =" match_parent "android: layout_height =" match_parent "android: layout_gravity =" center "android : gravity = "center" android: layout_margin = "16dp" android: ориентация = "вертикальные" инструменты: context = ". MainActivity"> <TextView android: layout_width = "wrap_content" android: layout_height = "wrap_content" android: gravity = " center "android: text =" PLAY / STOP SONG. \ nSCRUB WITH SEEKBAR "android: textStyle =" bold "/> <SeekBar android: id =" @ + id / seekbar "android: layout_margin =" 16dp "android: layout_width = "match_parent" android: layout_height = "wrap_content" android: layout_gravity = "center" /> <TextView android: id = "@ + id / textView" android: layout_width = "wrap_content" android: layout_height = "wrap_content" /> <android .support.design.widget.FloatingActionButton android: id = "@ + id / button" android: layout_widt h = "wrap_content" android: layout_height = "wrap_content" android: layout_margin = "16dp" android: src = "@ android: drawable / ic_media_play" android: text = "PLAY SOUND" /> </ LinearLayout>
Мы добавили FloatingActionButon, который будет воспроизводиться / останавливаться при нажатии.
Код для класса MainActivity.java приведен ниже:
копия
пакет com.journaldev.androidmediaplayersong; import android.content.res.AssetFileDescriptor; импорт android.media.MediaPlayer; import android.support.design.widget.FloatingActionButton; import android.support.v4.content.ContextCompat; import android.support.v7.app.AppCompatActivity; импорт android.os.Bundle; импорт android.view.View; import android.widget.SeekBar; import android.widget.TextView; открытый класс MainActivity расширяет AppCompatActivity реализует Runnable {MediaPlayer mediaPlayer = new MediaPlayer (); SeekBar seekBar; логическое значение wasPlaying = false; FloatingActionButton fab; @Override protected void onCreate (Bundle saveInstanceState) {super.onCreate (saveInstanceState); setContentView (R.layout.activity_main); fab = findViewById (R.id.button); fab.setOnClickListener (new View.OnClickListener () {@Override public void onClick (View view) {playSong ();}}); окончательный TextView seekBarHint = findViewById (R.id.textView); seekBar = findViewById (R.id.seekbar); seekBar.setOnSeekBarChangeListener (new SeekBar.OnSeekBarChangeListener () {@Override public void onStartTrackingTouch (SeekBar seekBar) {seekBarHint. (View.VISIBLE); int x = (int) Math.ceil (progress / 1000f); if (x 0 && mediaPlayer! = Null &&! MediaPlayer.isPlaying ()) {clearMediaPlayer (); fab.setImageDrawable (ContextCompat.getDrawable) (MainActivity.this, android.R.drawable.ic_media_play)); MainActivity.this.seekBar.setProgress (0);}} @Override public void onStopTrackingTouch (SeekBar seekBar) {if (mediaPlayer! = Null && mediaPlayer.isPlaying () ) {mediaPlayer.seekTo (seekBar.getProgress ());}}}); } public void playSong () {try {if (mediaPlayer! = null && mediaPlayer.isPlaying ()) {clearMediaPlayer (); seekBar.setProgress (0); wasPlaying = true; fab.setImageDrawable (ContextCompat.getDrawable (MainActivity.this, android.R.drawable.ic_media_play)); } if (! wasPlaying) {if (mediaPlayer == null) {mediaPlayer = new MediaPlayer (); } fab.setImageDrawable (ContextCompat.getDrawable (MainActivity.this, android.R.drawable.ic_media_pause)); AssetFileDescriptor descriptor = getAssets (). OpenFd ("suit.mp3"); mediaPlayer.setDataSource (descriptor.getFileDescriptor (), descriptor.getStartOffset (), descriptor.getLength ()); descriptor.close (); mediaPlayer.prepare (); mediaPlayer.setVolume (0,5f, 0,5f); mediaPlayer.setLooping (ложь); seekBar.setMax (mediaPlayer.getDuration ()); mediaPlayer.start (); новая тема (это) .start (); } wasPlaying = false; } catch (Exception e) {e.printStackTrace (); }} public void run () {int currentPosition = mediaPlayer.getCurrentPosition (); int total = mediaPlayer.getDuration (); while (mediaPlayer! = null && mediaPlayer.isPlaying () && currentPosition
В приведенном выше коде при нажатии на FloatingActionButton запускается функция playSong, в которой мы останавливаем песню и сбрасываем значок MediaPlayer и FloatingActionButton каждый раз.
После вызова mediaPlayer.prepare () подробности доступны для песни. Теперь мы можем получить продолжительность и установить ее на максимальную позицию SeekBar.
setLoooping в false предотвращает бесконечное воспроизведение песни до тех пор, пока пользователь не остановит ее.
Мы запускаем поток, который запускает метод run, который был частью интерфейса Runnable, который мы реализовали.
Внутри метода run мы обновляем каждую секунду прогресс, который вызывает метод onProgressChanged слушателя SeekBar.
Внутри слушателя мы установили смещение TextView ниже большого пальца SeekBar. Мы устанавливаем продолжительность, конвертируя миллисекунды в секунды.
Когда панель поиска перемещается, запускается тот же метод. Когда пользователь прекращает очистку SeekBar, запускается onStopTrackingTouch, в котором с помощью метода seekTo мы обновляем позицию песни в экземпляре MediaPlayer.
Как только песня закончена, мы обновляем позицию SeekBar до первоначального и очищаем экземпляр MediaPlayer.
Вывод приложения без звука приведен ниже:
Это положит конец этому уроку. Вы можете скачать проект по ссылке ниже и сыграть песню для себя.
О Анупам Чуг
Он любит изучать новые вещи в Android и iOS. Стреляй в него запросы.
Quot; encoding = "utf-8"?