Android studio mediaplayer oncompletionlistener

Полный список

MediaPlayer – класс, который позволит вам проигрывать аудио/видео файлы с возможностью сделать паузу и перемотать в нужную позицию. MediaPlayer умеет работать с различными источниками, это может быть: путь к файлу (на SD или в инете), адрес потока, Uri или файл из папки res/raw.

Напишем небольшое приложение аудио-плеер и используем в нем все эти возможности.

Project name: P1261_MediaPlayer
Build Target: Android 2.3.3
Application name: MediaPlayer
Package name: ru.startandroid.develop.p1261mediaplayer
Create Activity: MainActivity

Добавляем строки в strings.xml:

Так это выглядит на экране

Кнопки верхнего ряда запускают проигрывание треков из различных источников. Кнопки среднего ряда – это пауза, возобновление, стоп и чекбокс повторения трека. А в нижнем ряду кнопки перемотки назад/вперед и вывод в лог текущей информации.

Создайте папку res/raw и положите в нее какой-нить звуковой файл с именем explosion.mp3. Например, его можно скачать здесь — http://dl.dropboxusercontent.com/u/6197740/explosion.mp3.

Разбираемся. Сначала создаем константы-пути, которые будет использовать проигрыватель. Это файл в инете (DATA_HTTP), поток в инете (DATA_STREAM), файл на флэшке (DATA_SD) и Uri на мелодию из системы (DATA_URI). Для SD и Uri укажите ваши значения, чтобы такие файлы существовали. (По получению Uri в конце урока есть вспомогательный код)

В onCreate получаем AudioManager, находим на экране чекбокс и настраиваем так, чтобы он включал/выключал режим повтора для плеера.

onClickStart – метод для обработки нажатий на кнопки верхнего ряда. Сначала мы освобождаем ресурсы текущего проигрывателя. Затем в зависимости от нажатой кнопки стартуем проигрывание. Какие методы для этого используются?

setDataSource – задает источник данных для проигрывания

setAudioStreamType – задает аудио-поток, который будет использован для проигрывания. Их существует несколько: STREAM_MUSIC, STREAM_NOTIFICATION и п. Подробнее их можно посмотреть в доках по AudioManager. Предполагаю, что созданы они для того, чтобы можно было задавать разные уровни громкости, например, играм, звонкам и уведомлениям. Этот метод можно и пропустить, если вам не надо явно указывать какой-то поток. Насколько я понял, по умолчанию используется STREAM_MUSIC.

Далее используется метод prepare или prepareAsync (в паре с OnPreparedListener). Эти методы подготавливают плеер к проигрыванию. И, как понятно из названия, prepareAsync делает это асинхронно, и, когда все сделает, сообщит об этом слушателю из метода setOnPreparedListener. А метод prepare работает синхронно. Соотвественно, если хотим прослушать файл из инета, то используем prepareAsync, иначе наше приложение повесится, т.к. заблокируется основной поток, который обслуживает UI.

Ну и метод start запускает проигрывание.

В случае с raw-файлом мы используем метод create. В нем уже будет выполнен метод prepare и нам остается только выполнить start.

Далее мы для плеера включаем/выключаем повтор (setLooping) в зависимости от текущего значения чекбокса. И вешаем слушателя (setOnCompletionListener), который получит уведомление, когда проигрывание закончится.

В методе releaseMP мы выполняем метод release. Он освобождает используемые проигрывателем ресурсы, его рекомендуется вызывать когда вы закончили работу с плеером. Более того, хелп рекомендует вызывать этот метод и при onPause/onStop, если нет острой необходимости держать объект.

В методе onClick мы обрабатываем нажатия на кнопки управления проигрывателем. Какие здесь используются методы?

start – возобновляет проигрывание

seekTo – переход к определенной позиции трека (в милисекундах)

getCurrentPosition – получить текущую позицию (в милисекундах)

getDuration – общая продолжительность трека

isLooping – включен ли режим повтора

getStreamVolume – получить уровень громкости указанного потока

Далее идут методы

onPrepared – метод слушателя OnPreparedListener. Вызывается, когда плеер готов к проигрыванию.

onCompletion – метод слушателя OnCompletionListener. Вызывается, когда достигнут конец проигрываемого содержимого.

Читайте также:  Андроид сравнить с айфонами

В методе onDestroy обязательно освобождаем ресурсы проигрывателя.

В манифесте добавляем права на интернет — android.permission.INTERNET.

Все сохраняем, запускаем приложение. Дизайн получившегося плеера, конечно, не ахти какой :), но нас сейчас интересует функционал.

Еще раз перечислю возможные действия. Нажимая верхние кнопки, мы запускаем проигрывание из различных источников. Кнопки среднего ряда позволят нам поставить паузу, возобновить/остановить проигрывание и включить режим повтора. Кнопки нижнего ряда перематывают назад/вперед на 3 сек (3000 мсек) и выводят инфу в лог.

Я включу проигрывание файла с SD и выведу инфу в лог (кнопка Info).

start SD
Playing true
Time 4702 / 170588
Looping false
Volume 10

Проигрывание идет, текущая позиция – 4-я секунда из 170, режим повтора выключен, громкость — 10.

Уменьшу громкость (кнопками устройства или эмулятора), включу режим повтора (чекбокс Loop), поставлю паузу (кнопка Pause) и снова выведу инфу в лог:

Playing false
Time 46237 / 170588
Looping true
Volume 6

Видим, что проигрывание остановилось, текущая позиция уже 46 секунд, режим повтора включен, а громкость уменьшилась до 6.

Теперь включу проигрывание потока (кнопка Stream). Смотрим лог:

08:49:13.799: D/myLogs(18805): start Stream
08:49:13.809: D/myLogs(18805): prepareAsync
08:49:27.589: D/myLogs(18805): onPrepared

Обратите внимание, сколько прошло времени с начала (prepareAsync) до завершения (onPrepared) подготовки проигрывателя – 14 секунд. Если бы мы использовали метод prepare, а не prepareAsync, то наше приложение было бы недоступно все это время.

Расскажу еще про несколько методов, которые я не использовал в примере, но о которых стоит знать.

Метод reset – сбрасывает плеер в начальное состояние, после него необходимо снова вызвать setDataSource и prepare. Похож на onRelease, но позволяет продолжить работу с этим же объектом. А вот после onRelease надо создавать новый объект MediaPlayer.

Метод setOnBufferingUpdateListener устанавливает слушателя буферизации проигрываемого потока. По идее слушатель будет получать процент буферизации, но у меня оно как-то странно работает — показывает или 0 или 100.

Метод setOnErrorListener устанавливает слушателя для получения ошибок. Особенно это полезно при методe prepareAsync. Если в ходе этого метода возникнут ошибки, то их можно поймать только так.

Метод setWakeMode позволяет ставить стандартную (PowerManager.WakeLock) блокировку на время проигрывания, указав тип блокировки. Не забудьте в манифесте добавить права на WAKE_LOCK.

По поводу видео. Метод setDisplay позволяет указать плееру, куда выводить изображение. Размещаете на экране компонент SurfaceView (вкладка Advanced), вызываете его метод getHolder и полученный объект передаете в setDisplay. Плеер выведет изображение на этот компонент.

Чтобы узнать размер проигрываемого изображения можно использовать методы getVideoHeight и getVideoWidth.

В хелпе класса MediaPlayer есть хорошая схема состояний плеера. Она кажется запутанной, но если посидеть и поразбираться, то вполне можно все понять. Схема полезная, советую вникнуть.

А здесь можно посмотреть какие форматы поддерживаются системой.

Также хелп любезно предоставляет нам код, который позволит просмотреть существующие медиа-файлы в системе:

На следующем уроке:

— работаем с SoundPool

Присоединяйтесь к нам в Telegram:

— в канале StartAndroid публикуются ссылки на новые статьи с сайта startandroid.ru и интересные материалы с хабра, medium.com и т.п.

— в чатах решаем возникающие вопросы и проблемы по различным темам: Android, Kotlin, RxJava, Dagger, Тестирование

— ну и если просто хочется поговорить с коллегами по разработке, то есть чат Флудильня

— новый чат Performance для обсуждения проблем производительности и для ваших пожеланий по содержанию курса по этой теме

Источник

Media Player. IOn Completion Listener Interface

Definition

Some information relates to prerelease product that may be substantially modified before it’s released. Microsoft makes no warranties, express or implied, with respect to the information provided here.

Interface definition for a callback to be invoked when playback of a media source has completed.

Читайте также:  Как снять скриншот с экрана андроид самсунг galaxy

Remarks

Portions of this page are modifications based on work created and shared by the Android Open Source Project and used according to terms described in the Creative Commons 2.5 Attribution License.

Properties

Gets the JNI value of the underlying Android object.

(Inherited from IJavaObject) JniIdentityHashCode (Inherited from IJavaPeerable) JniManagedPeerState (Inherited from IJavaPeerable) JniPeerMembers (Inherited from IJavaPeerable) PeerReference (Inherited from IJavaPeerable)

Methods

Called when the end of a media source is reached during playback.

Disposed() (Inherited from IJavaPeerable)
DisposeUnlessReferenced() (Inherited from IJavaPeerable)
Finalized() (Inherited from IJavaPeerable)
OnCompletion(MediaPlayer)
SetJniIdentityHashCode(Int32) (Inherited from IJavaPeerable)
SetJniManagedPeerState(JniManagedPeerStates) (Inherited from IJavaPeerable)
SetPeerReference(JniObjectReference) (Inherited from IJavaPeerable)
UnregisterFromRuntime() (Inherited from IJavaPeerable)

Extension Methods

Performs an Android runtime-checked type conversion.

Источник

Android Studio: запуск и остановка звука с помощью mediaPlayer

Как start и stop воспроизводить музыку, используя одну и ту же кнопку. Приведенный ниже код будет воспроизводить песню несколько раз (с перекрытием), если я нажму на нее несколько раз.

И еще одна проблема — куда вставить функции starTimer и StopTimer , чтобы starTimer был активен, если звук не воспроизводится, и stopTimer будет активен, если звук воспроизводится.

И для функции startTimer stopTimer

4 ответа

Пожалуйста, укажите ниже код в Global:

Теперь в onCreate методе:

Кнопка паузы воспроизведения:

Когда аудио готово к воспроизведению:

Аудио завершено, затем автоматическая остановка:

Не забудьте добавить эту строку:

Чтобы остановить музыку / звук с помощью медиаплеера, создайте логическое значение isPlaying . сделать это правдой, когда музыка играет

Объявите isPlaying как глобальную переменную как

Теперь вы можете создать метод, который будет проверять значение isPlaying и воспроизводить или приостанавливать музыку, вызывая этот метод onClick() кнопки

Надеюсь, это поможет!

Приведенный ниже код будет воспроизводить песню несколько раз (с перекрытием), если я нажму на нее несколько раз.

Поскольку каждый раз, когда вы нажимаете кнопку, вы создаете экземпляр объекта медиаплеера, чтобы решить эту проблему, сделайте свой объект проигрывателя medica полем класса, а не локальным полем метода, и сначала проверьте, не является ли объект нулевым, прежде чем создавать его.

И не нужно иметь переменную, чтобы проверить, воспроизводится ли медиа, так как вы можете проверить это непосредственно из объекта медиаплеера.

Так что измени свой код на

Что касается вопроса с таймером, не очень понятно, как вы используете свой таймер?

Лучше сделать одно логическое значение при нажатии кнопки, а затем легко обрабатывать

IsClick имеет значение false, означает, что если будет выполнено другое действие. В противном случае вы делаете остановку медиаплеера и функцию остановки таймера.

Источник

Deep Dive: MediaPlayer Best Practices

MediaPlayer seems to be deceptively simple to use, but complexity lives just below the surface. For example, it can be tempting to write something like this:

This works fine the first and probably the second, third, or even more times. However, each new MediaPlayer consumes system resources, such as memory and, codecs. This can degrade the performance of your app, and possibly the entire device.

Fortunately, it’s possible to use MediaPlayer in a way that is both simple and safe by following a few simple rules.

The Simple Case

The most basic case is that we have a sound file, perhaps a raw resource, that we just want to play. In this case we’ll create a single player reuse it each time we need to play a sound. The player should be created with something like this:

The player is created with two listeners:

  • OnPreparedListener, which will automatically start playback after the player has been prepared.
  • OnCompletionListener which automatically cleans up resources when playback has finished.
Читайте также:  Маски инстаграм не работают андроид почему

With the player created, the next step is to make a function that takes a resource ID and uses that MediaPlayer to play it:

There’s quite a bit happening in this short method:

  • The resource ID must be converted to an AssetFileDescriptor because this is what MediaPlayer uses to play raw resources. The null check ensures the resource exists.
  • Calling reset() ensures the player is in the Initialized state. This works no matter what state the player is in.
  • Set the data source for the player.
  • prepareAsync prepares the player to play and returns immediately, keeping the UI responsive. This works because attached OnPreparedListener starts playing after the source has been prepared.

It’s important to note we don’t call release() on our player or set it to null. We want to reuse it! So instead we call reset(), which frees the memory and codecs it was using.

Playing a sound is as simple as calling:

More Cowbells

Playing one sound at a time is easy, but what if you want to start another sound while the first one is still playing? Calling playSound() multiple times like this won’t work:

In this case, R.raw.big_cowbell starts to get prepared, but the second call resets the player before anything can happen, so only you only hear R.raw.small_cowbell .

And what if we wanted to play multiple sounds together at the same time? We’d need to create a MediaPlayer for each one. The simplest way to do this is to have a list of active players. Perhaps something like this:

Now that every sound has its own player it’s possible to play both R.raw.big_cowbell and R.raw.small_cowbell together! Perfect!

… Well, almost perfect. There’s not anything in our code that limits the number of sounds that can play at once, and MediaPlayer still needs to have memory and codecs to work with. When they run out, MediaPlayer fails silently, only noting “ E/MediaPlayer: Error (1,-19) ” in logcat.

Enter MediaPlayerPool

We want to support playing multiple sounds at once, but we don’t want to run out of memory or codecs. The best way to manage these things is to have a pool of players and then pick one to use when we want to play a sound. We could update our code to be like this:

Now multiple sounds can play at once, and we can control the maximum number of simultaneous players to avoid using too much memory or too many codecs. And, since we’re recycling the instances, the garbage collector won’t have to run to clean up all of the old instances that have finished playing.

There are a few downsides to this approach:

  • After maxStreams sounds are playing, any additional calls to playSound are ignored until a player is freed up. You could work around this by “stealing” a player that’s already in use to play a new sound.
  • There can be significant lag between calling playSound and actually playing the sound. Even though the MediaPlayer is being reused, it’s actually a thin wrapper that controls an underlying C++ native object via JNI. The native player is destroyed each time you call MediaPlayer.reset() , and it must be recreated whenever the MediaPlayer is prepared.

Improving latency while maintaining the ability to reuse players is harder to do. Fortunately, for certain types of sounds and apps where low latency is required, there’s another option that we’ll look into next time: SoundPool.

Источник

Оцените статью