Android Studio: запуск и остановка звука с помощью mediaPlayer
Как start и stop воспроизводить музыку, используя одну и ту же кнопку. Приведенный ниже код будет воспроизводить песню несколько раз (с перекрытием), если я нажму на нее несколько раз.
И еще одна проблема — куда вставить функции starTimer и StopTimer , чтобы starTimer был активен, если звук не воспроизводится, и stopTimer будет активен, если звук воспроизводится.
И для функции startTimer stopTimer
4 ответа
Пожалуйста, укажите ниже код в Global:
Теперь в onCreate методе:
Кнопка паузы воспроизведения:
Когда аудио готово к воспроизведению:
Аудио завершено, затем автоматическая остановка:
Не забудьте добавить эту строку:
Чтобы остановить музыку / звук с помощью медиаплеера, создайте логическое значение isPlaying . сделать это правдой, когда музыка играет
Объявите isPlaying как глобальную переменную как
Теперь вы можете создать метод, который будет проверять значение isPlaying и воспроизводить или приостанавливать музыку, вызывая этот метод onClick() кнопки
Надеюсь, это поможет!
Приведенный ниже код будет воспроизводить песню несколько раз (с перекрытием), если я нажму на нее несколько раз.
Поскольку каждый раз, когда вы нажимаете кнопку, вы создаете экземпляр объекта медиаплеера, чтобы решить эту проблему, сделайте свой объект проигрывателя medica полем класса, а не локальным полем метода, и сначала проверьте, не является ли объект нулевым, прежде чем создавать его.
И не нужно иметь переменную, чтобы проверить, воспроизводится ли медиа, так как вы можете проверить это непосредственно из объекта медиаплеера.
Так что измени свой код на
Что касается вопроса с таймером, не очень понятно, как вы используете свой таймер?
Лучше сделать одно логическое значение при нажатии кнопки, а затем легко обрабатывать
IsClick имеет значение false, означает, что если будет выполнено другое действие. В противном случае вы делаете остановку медиаплеера и функцию остановки таймера.
Источник
Сервис MediaPlayer не работает в Android Studio
Я использую следующий код для MediaPlayer сервисов. Но следующая служба не работает. Звучат тосты, но плеер не играет ни одной песни. Метод ‘ onStart() ‘ устарел, так как я его переопределяю.
Android файл манифеста:
Может ли кто-нибудь помочь мне решить эту проблему?
2 ответа
Я новичок в android studio, и когда я пытаюсь запустить команду для импорта проигрывателя media, она не распознается, и при установке оптимизации она будет удаляться каждый раз, когда я ввожу команду для импорта mediaplayer на кодовой странице java. Это похоже на то, что у меня нет проигрывателя.
Моя цель-создать VideoView , который может воспроизводить видео в списке воспроизведения pre-defined . Я пытаюсь использовать MediaPlayer.setNextMediaPlayer(. ) , чтобы обеспечить плавный переход между двумя видео. Однако, когда первое видео завершит воспроизведение, 2-е видео не запустится.
Попробуйте этот код и определите в своем коде следующие вещи..
добавьте нижеприведенную строку в файл манифеста android .. между тегом приложения..
Вы должны переопределить метод onStartCommand() и вернуть START_STICKY , посмотрите это!
обратитесь к этой ссылке для лучшего понимания приведенного выше метода и START_STICKY . Надеюсь, это вам поможет!
Похожие вопросы:
У меня проблема в Android Studio. Я делаю звуковую доску и хочу сделать свой MediaPlayer null, когда он закончит играть. Я создал on complete listener, но внутри listener, когда я делаю свой.
Я использую класс android MediaPlayer, и одно из действий этого приложения имеет кнопки play, pause и select mp3. Приложение имеет в общей сложности 4 вида деятельности. Я могу заставить его.
Несколько лет назад я написал приложение Android (используя Eclipse и ADT). Недавно мне пришлось вернуться к нему с помощью Android Studio , потому что он таинственным образом перестал работать. Я.
Я новичок в android studio, и когда я пытаюсь запустить команду для импорта проигрывателя media, она не распознается, и при установке оптимизации она будет удаляться каждый раз, когда я ввожу.
Моя цель-создать VideoView , который может воспроизводить видео в списке воспроизведения pre-defined . Я пытаюсь использовать MediaPlayer.setNextMediaPlayer(. ) , чтобы обеспечить плавный переход.
я пытаюсь воспроизвести 1 из 2 звуков , correct.mp3 или incorrect.mp3, которые хранятся в моей папке активов. Это код для моей службы: public class MinesweeperSound extends Service < MediaPlayer.
Я использую android studio 3.1 для некоторого развития. Но он не показывает опцию android в меню Tools . В то время как Android studio 3.0 не имеет этой проблемы. Вот скриншот меню инструментов.
Из документов: Чтобы запустить AVD Manager, выполните одно из следующих действий: В Android Studio выберите сервис > Android > AVD Manager . Нажмите кнопку AVD Manager на панели инструментов. Ни.
Я новичок в android studio. Я пытался сделать плеер media, но получил сообщение об ошибке: java.lang.NullPointerException: Attempt to invoke virtual method ‘void android.media.MediaPlayer.start()’.
У меня есть простая программа в android studio с одной кнопкой для воспроизведения аудиофайла. Однако звук не работает, когда я нажимаю кнопку. PS. Я использую эмулятор public class MainActivity.
Источник
Android studio mediaplayer stop не работает
Не работает MediaPlayer.stop();
al_mt | Дата: Суббота, 31 Октября 2015, 14:10 | Сообщение # 1 | |
| Начал учить яву. Написал простенькую рисовалку для планшета, пару классов для 2D-анимированных спрайтов, оптимистично кинулся портировать игрушки с javaScript Аха. ЩЩаз 🙂 Внезапно обнаружил, что если я создаю поток — наследник Thread то из него не получается управлять объектами класса MediaPlayer ! Ничего не работает, даже если я пытаюсь всё делать методами основного потока, вызывая их из другого. Может быть кто подскажет? Добавлено (31 октября 2015, 14:10) Может я чего перемудрявываю? | |
|
monk05 | Дата: Понедельник, 02 Ноября 2015, 18:53 | Сообщение # 2 | |
| Пару вопросов: 1. Где создаешь объект класса MediaPlayer — в главном потоке или в каком-то дочернем? 2. Работают ли эти методы, если они будут вызваны из главного потока? | |
|
al_mt | Дата: Среда, 04 Ноября 2015, 22:40 | Сообщение # 3 | |
| Если создаю в главном и вызываю из главного работает Если создаю в дочернем и вызываю из дочернего — работает Если создаю в главном, вызываю из дочернего — не работает Если создаю в дочернем, вызываю из главного — не работает Причём не важно, обращаюсь я напрямую к public экземпляру или через метод класса — всё равно не работает. В данный момент приспособился, вызываю только из метода run() того потока в котором создавал, тогда всё работает. Добавлено (04 ноября 2015, 22:40) | |
|
monk05 | Дата: Четверг, 05 Ноября 2015, 14:49 | Сообщение # 4 |
| Я не силен в разработке Java приложений (больше как-то с Java EE работаю), но помню, когда еще на 2-ом курсе писали приложения на C#, там такая же штука была — нельзя было вызывать методы объектов из других процессов. Для решения этого момента была какая-то ужасная конструкция, уже не помню, что она собой представляла. Но факт остается фактом — нельзя вызывать некоторые методы объектов, относящихся к интерфейсу из другого потока. На StackOverflow (ссылка) есть решение. Из него следует, что нужно иметь поток (либо создать его, либо использовать родительский), который будет создавать нужные тебе объекты (вдруг у тебя больше одного объекта MediaPlayer), и ждать от других потоков обработчики событий, чтобы исполнить их в контексте своего потока. Чтобы адаптировать это решение к твоей задаче, можно сделать примерно так: 1. Сначала определить обработчик события Источник Проблемы с MediaPlayer, исходные ресурсы, остановка и запускЯ новичок в разработке Android, и у меня есть вопрос / проблема. Я играю с классом MediaPlayer для воспроизведения некоторых звуков / музыки. Я играю в сырые ресурсы ( res/raw ), и это выглядит легко. Чтобы воспроизвести необработанный ресурс, MediaPlayer должен быть инициализирован следующим образом: Пока здесь нет проблем. Звук воспроизводится, и все работает нормально. Моя проблема возникает, когда я хочу добавить дополнительные параметры в свое приложение. В частности, когда я добавляю кнопку «Остановить» / параметр. В принципе, я хочу, чтобы … когда я нажимаю «Стоп», музыка останавливается. И когда я нажимаю «Старт», песня / звук начинается. (Довольно простой!) Чтобы остановить медиаплеер, вам нужно только вызвать stop() . Но для повторного воспроизведения звука медиаплеер должен быть сброшен и подготовлен. Проблема заключается в том, что метод setDataSource() принимает только в качестве параметров путь к файлу, Content Provider URI, путь к потоковому медиа URL или файловый дескриптор. Таким образом, поскольку этот метод не принимает идентификатор ресурса, я не знаю, как установить источник данных, чтобы вызвать prepare() . Кроме того, я не понимаю, почему вы не можете использовать идентификатор Resouce для установки источника данных, но при инициализации MediaPlayer вы можете использовать идентификатор ресурса. Наверное, я что-то упускаю. Интересно, смешиваю ли я понятия, а метод stop() не нужно вызывать в кнопке «Стоп». Любая помощь? Вот что я сделал, чтобы загрузить несколько ресурсов с помощью одного MediaPlayer: MediaPlay – это переменная-член, которая создается и освобождается в других точках класса. Это может быть не лучшим образом (я новичок в Android самостоятельно), но, похоже, это работает. Просто отметьте, что код, вероятно, попадет в нижнюю часть метода до того, как будет воспроизведен медиаплеер. Если вам нужно воспроизвести ряд ресурсов, вам все равно придется обрабатывать этот случай. Так работает метод MediaPlayer.create для открытия необработанного файла: Или вы можете получить доступ к ресурсу таким образом: Где com.package.name – это имя вашего пакета приложений Вы можете использовать Для остановки музыкального проигрывателя. Наконец, как это работает для меня: МИСТЕР. Rectangle, это сообщение, возможно, слишком поздно для него, но я с гордостью напишу эти коды к вашей идее: у меня есть mp для mediaplayer а sescal9 – button . Источник Полный списокMediaPlayer – класс, который позволит вам проигрывать аудио/видео файлы с возможностью сделать паузу и перемотать в нужную позицию. MediaPlayer умеет работать с различными источниками, это может быть: путь к файлу (на SD или в инете), адрес потока, Uri или файл из папки res/raw. Напишем небольшое приложение аудио-плеер и используем в нем все эти возможности. Project name: P1261_MediaPlayer Добавляем строки в 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 Проигрывание идет, текущая позиция – 4-я секунда из 170, режим повтора выключен, громкость — 10. Уменьшу громкость (кнопками устройства или эмулятора), включу режим повтора (чекбокс Loop), поставлю паузу (кнопка Pause) и снова выведу инфу в лог: Playing false Видим, что проигрывание остановилось, текущая позиция уже 46 секунд, режим повтора включен, а громкость уменьшилась до 6. Теперь включу проигрывание потока (кнопка Stream). Смотрим лог: 08:49:13.799: D/myLogs(18805): start Stream Обратите внимание, сколько прошло времени с начала (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 для обсуждения проблем производительности и для ваших пожеланий по содержанию курса по этой теме Источник |