- MnogoBlog
- как создать сайт на wordpress, настроить и оптимизировать wordpress
- Android Studio: Создаем простой аудиоплеер (AudioPlayer)
- Похожие записи:
- Android Studio: Создаем простой аудиоплеер (AudioPlayer) : 3 комментария
- Добавить комментарий Отменить ответ
- Разработка видеоплеера для Android
- Как удобно сделать плейлист в Android
- Android и звук: как делать правильно
MnogoBlog
как создать сайт на wordpress, настроить и оптимизировать wordpress
Android Studio: Создаем простой аудиоплеер (AudioPlayer)
Здравствуйте, давайте создадим Аудиоплеер для Android устройств на бесплатной программе – Android Studio.
Скачать исходники для статьи можно ниже
Для начала создадим простой Аудиоплеер, а потом будем постепенно его усложнять, но более сложные буду описывать в следующих статьях!
Создадим вот такой простой Аудиоплеер:
Простой двухкнопочный аудиоплеер!
1. Создаем новый проект в Android Studio:
Я выбрал платформу Android 4.0 – для того чтобы наше будущее приложение запускалось на версиях Андроида – Android 4.0+
Выбираем шаблон Empty Activity (Пустое Активити):
Далее оставляем все по умолчанию:
И жмем на кнопку Finish.
2. Редактируем файл activity_main.xml
Переходим в папку res, в ней в подпапку layout и жмем на файл – activity_main.xml, далее открываем вкладку Text (Текст):
И здесь добавляем две кнопки и текст “Аудиоплеер”, вот такой код файла activity_main.xml у меня получился:
Если перейти на вкладку “Design” (Дизайн) увидим как будет выглядеть наше будущее приложение:
3. Редактируем файл MainActivity
Далее переходим в файл MainActivity:
Заменяем код на следующий:
Здесь в 21 строчке мы указали на имя аудиофайла, в данном примере – это mymusic.
4. Загружаем аудиофайл.
Осталось загрузить аудиофайл, для этого нужно создать папку raw и загрузить в неё какой-нибудь mp3 файл с именем mymusic.
Для этого наводим курсор мыши на папку res и кликаем правой кнопкой мыши, открывается менюшка – выбираем в ней пункт New, и подпункт Directory – и создаем новую папочку с именем raw:
И у нас появилась новая папочка raw – наводим на неё курсор мышки и кликаем правой кнопкой, открывается меню – выбираем в ней пункт Show in Explorer:
после чего у нас откроется папочка, в которой заходим в папку raw и закачиваем туда mp3 с названием mymusic – можете скачать данный файл с моего сайта!
5. Создаем apk файл.
Теперь нам нужно создать apk файл для загрузки на Android устройства – для этого выбираем в верхнем меню пункт “Build”, подпункт “Build Apk”
Через некоторое время появится вот такое сообщение справа вверху:
Жмем на ссылку и у нас открывается папочка с apk файлом по имени
app-debug.apk
Можете переименовать файл, например в mypleer.apk и загрузить к себе на смартфон, установить и запустить приложение.
На этом все классных вам Android приложений!
Похожие записи:
Android Studio: Создаем простой аудиоплеер (AudioPlayer) : 3 комментария
Здравствуйте, сегодня пробовал создать приложение в AndroidStudia mp3 проигрователь
Сделал всё по инструкции и выдало много ошибок. Если у вас есть возможность помочь решить возникшие ошибки буду премного Благодарен!
Добавил PS в конце статьи – может поможет.
у меня все работает но хотелось более обстоятельную статью по всему функционалу класса MediaPlayer и MediaRecords.
Добавить комментарий Отменить ответ
Для отправки комментария вам необходимо авторизоваться.
Источник
Разработка видеоплеера для Android
This post is also available in: Английский
Одна из задач, с которой вы можете столкнуться http://kakielekarstva.ru/ при разработке приложения для Android — это встраивание видео плеера в приложение, для воспроизведения видео контента. Стандартный SDK предоставляет два пути решения этой проблемы: использовать низкоуровневый класс MediaPlayer или готовый визуальный компонент VideoView совместно со стандартной панелью управления воспроизведением MediaController. Оба эти подхода обладают своими недостатками, поэтому мы решили разработать собственный видеокомпонент AVideo. В этой статье мы расскажем о том как его использовать в своем приложении и какие преимущества он дает.
Сначала немного о недостатках стандартных классов. Класс MediaPlayer в силу своей низкоуровневости обладает максимальными возможностями, но весьма сложен в использовании, поэтому его не рекомендуется использовать напрямую. Специально для того, чтобы спрятать от разработчика всю сложность MediaPlayer, в SDK входит класс VideoView. Простейшая программа, использующая VideoView и MediaController выглядит примерно так:
Но класс VideoView подходит только для простейших применений. Если вы захотите добавить в него какую-либо новую функциональность или даже просто сменить оформление элементов панели управления, то сделать это будет не просто, поскольку в SDK не предусмотрено такой возможности. Разработчику остается только реализовать собственный компонент на основе MediaPlayer с нуля или вырезать из находящихся в открытом доступе исходных кодов Android нужные компоненты и внести в них необходимые изменения. Именно так мы и решили поступить при разработке собственного плеера AVideo. В результате получился набор видео классов, совместимых по интерфейсу со стандартными, но реализующий дополнительно следующую функциональность:
- Измененное оформление элементов панели управления воспроизведением видео.
- Управление уровнем звука и кнопка выключения звука.
- Управление уровнем яркости подсветки экрана.
- Корректная работа компонента и контролов при встраивании в сложный layout, когда видео занимает только часть экрана.
- Переключение между обычным режимом отображения в layout-е и полноэкранным режимом по двойному нажатию на плеер с изменением размера элементов панели управления.
- Остановка воспроизведения и восстановление воспроизведения с запомненной позиции при отключении экрана устройства и при выходе из приложения.
Использовать наши видео компоненты в собственном приложении очень просто. Загрузите архив, содержащий код компонентов и пример использования, с сайта github.com. Импортируйте проекты из архива в рабочую область Eclipse и подключите их к своему приложению как библиотеки (Свойства проекта, Android, Library, Add…). Код простейшего видеоплеера с использованием этих компонентов получится абсолютно такой же, как если бы вы использовали стандартные компоненты, единственное, что изменится — это строки импорта соответствующих классов и к названию компонента VideoView в файле layout-а добавится наш package
. Пример простейшего layout-а будет выглядеть так:
Кроме того, для корректного восстановления позиции воспроизведения при выходе из приложения или при повороте экрана, рекомендуется также добавить свойство
к вашей activity и следующий Java-код:
Результат работы тестового приложения в обычном и в полноэкранном режиме вы можете видеть на скриншотах:
Мы надеемся, что наш видеокомпонент пригодится вам в работе, и ждем багрепорты, предложения и пожелания по реализации новой функциональности, а также патчи.
Источник
Как удобно сделать плейлист в Android
Одному мне кажется, что организация плейлиста в Android OS, устроена, мягко говоря, не удобно? Надеюсь нет.
Относительно недавно я обнаружил, что помимо всего прочего WinAmp для андроид (как и стандартный плеер) поддерживает плейлисты в формате *.m3u.
Чем же это удобно? Можно перемешать треки как угодно, этого не позволяет сделать не и один из опробованных мной плееров. Да и делать это на ПК, на мой взгляд, гораздо удобнее.
У меня возникли не большие проблемы, но их достаточно легко удалось решить. Под катом подробная инструкция.
Для начала подключите телефон к ПК как флеш-накопитель.
Теперь просто создайте плейлист, в вашем любимом плеере, главное чтобы была возможность его сохранения в *.m3u.
Я люблю *.m3u, потому что ему не нужен точный путь до файла.
Например если поместить плейлист в одну папку с треком, то в нём не обязательно должен быть прописан путь, типа:
D:\Music\Песня.mp3
Но я полюбил за это *.m3u, только после того как плеер отказался проигрывать треки. Видимо как раз из-за того что диска «D» в моём телефоне попросту нет.
Так как же это побороть?
Для этого нужно открыть его в блокноте, чтобы убрать не нужные пути.
Допустим моя музыка лежит по такому пути:
F:\Music\
Значит, открыв плейлист в блокноте, напротив каждого трека нужно убрать F:\Music\.
Можно делать это вручную, но если в вашем плейлисте много треков, это будет очень долго и не приятно. По этому можно воспользоваться стандартными «средствами автоматизации».
Жмём Правка -> Заменить. В поле Что вставляем не нужный путь. В моём случае это F:\Music\, в вашем наверняка будет другой.
Поле Чем оставляем пустым и жмём на Заменить всё.
После чего можно сохранить плейлист, скопировать в папку с музыкой на телефоне и наслаждаться результатом. Но этим можно ограничиться, если в именах и тегах вашей музыки присутствуют только латинские символы (все наверно знают про проблемы плеера с кирилицей).
Для того чтобы плеер увидил треки с кирилицей в названии и тегах, нужно сохранить плейлист в коодировке UTF-8.
Для это в болкноте нужно нажать на Файл -> Сохранить как. , после чего в открывшемся окне в поле Кодировка нужно выбрать необходимый нам UTF-8, после чего в имени нужно прописать следующее:
желаемое_название_плейлиста.m3u
Иначе файл сохранится как обычный текстовый документ.
Теперь таки можно скопировать плейлист на телефон, запустить плеер и в закладке Плейлисты стандартного плеере (или в соответсвующей, стороннего) выбрать наш.
Если плейлист там не появился, значит система ещё его не увидела, попробуйте убить процесс плеера через настройки или перезагрузить аппарат.
Источник
Android и звук: как делать правильно
В статье рассматривается архитектура и API для создания приложений, воспроизводящих музыку. Мы напишем простое приложение, которое будет проигрывать небольшой заранее заданный плейлист, но «по-взрослому» — с использованием официально рекомендуемых практик. Мы применим MediaSession и MediaController для организации единой точки доступа к медиаплееру, и MediaBrowserService для поддержки Android Auto. А также оговорим ряд шагов, которые обязательны, если мы не хотим вызвать ненависти пользователя.
В первом приближении задача выглядит просто: в activity создаем MediaPlayer, при нажатии кнопки Play начинаем воспроизведение, а Stop — останавливаем. Все прекрасно работает ровно до тех пор, пока пользователь не выйдет из activity. Очевидным решением будет перенос MediaPlayer в сервис. Однако теперь у нас встают вопросы организации доступа к плееру из UI. Нам придется реализовать binded-сервис, придумать для него API, который позволил бы управлять плеером и получать от него события. Но это только половина дела: никто, кроме нас, не знает API сервиса, соответственно, наша activity будет единственным средством управления. Пользователю придется зайти в приложение и нажать Pause, если он хочет позвонить. В идеале нам нужен унифицированный способ сообщить Android, что наше приложение является плеером, им можно управлять и что в настоящий момент мы играем такой-то трек из такого-то альбома. Чтобы система со своей стороны подсобила нам с UI. В Lollipop (API 21) был представлен такой механизм в виде классов MediaSession и MediaController. Немногим позже в support library появились их близнецы MediaSessionCompat и MediaControllerCompat.
Следует сразу отметить, что MediaSession не имеет отношения к воспроизведению звука, он только об управлении плеером и его метаданными.
MediaSession
Итак, мы создаем экземпляр MediaSession в сервисе, заполняем его сведениями о нашем плеере, его состоянии и отдаем MediaSession.Callback, в котором определены методы onPlay, onPause, onStop, onSkipToNext и прочие. В эти методы мы помещаем код управления MediaPlayer (в примере воспользуемся ExoPlayer). Наша цель, чтобы события и от аппаратных кнопок, и из окна блокировки, и с часов под Android Wear вызывали эти методы.
Полностью рабочий код доступен на GitHub (ветка master). В статьи приводятся только переработанные выдержки из него.
Для доступа извне к MediaSession требуется токен. Для этого научим сервис его отдавать
и пропишем в манифест
MediaController
Теперь реализуем activity с кнопками управления. Создаем экземпляр MediaController и передаем в конструктор полученный из сервиса токен.
MediaController предоставляет как методы управления плеером play, pause, stop, так и коллбэки onPlaybackStateChanged(PlaybackState state) и onMetadataChanged(MediaMetadata metadata). К одному MediaSession могут подключиться несколько MediaController, таким образом можно легко обеспечить консистентность состояний кнопок во всех окнах.
Наша activity работает, но ведь идея исходно была, чтобы из окна блокировки тоже можно было управлять. И тут мы приходим к важному моменту: в API 21 полностью переделали окно блокировки, теперь там отображаются уведомления и кнопки управления плеером надо делать через уведомления. К этому мы вернемся позже, давайте пока рассмотрим старое окно блокировки.
Как только мы вызываем mediaSession.setActive(true), система магическим образом присоединяется без всяких токенов к MediaSession и показывает кнопки управления на фоне картинки из метаданных.
Однако в силу исторических причин события о нажатии кнопок приходят не напрямую в MediaSession, а в виде бродкастов. Соответственно, нам надо еще подписаться на эти бродкасты и перебросить их в MediaSession.
MediaButtonReceiver
Для этого разработчики Android любезно предлагают нам воспользоваться готовым ресивером MediaButtonReceiver.
Добавим его в манифест
MediaButtonReceiver при получении события ищет в приложении сервис, который также принимает «android.intent.action.MEDIA_BUTTON» и перенаправляет его туда. Поэтому добавим аналогичный интент-фильтр в сервис
Если подходящий сервис не найден или их несколько, будет выброшен IllegalStateException.
Теперь в сервис добавим
Метод handleIntent анализирует коды кнопок из intent и вызывает соответствующие коллбэки в mediaSession. Получилось немного плясок с бубном, но зато почти без написания кода.
На системах с API >= 21 система не использует бродкасты для отправки событий нажатия на кнопки и вместо этого напрямую обращается в MediaSession. Однако, если наш MediaSession неактивен (setActive(false)), его пробудят бродкастом. И для того, чтобы этот механизм работал, надо сообщить MediaSession, в какой ресивер отправлять бродкасты.
Добавим в onCreate сервиса
На системах с API Так это выглядит
Android 4.4
MIUI 8 (базируется на Android 6, то есть теоретически окно блокировки не должно отображать наш трек, но здесь уже сказывается кастомизация MIUI).
Уведомления
Однако, как ранее упоминалось, начиная с API 21 окно блокировки научилось отображать уведомления. И по этому радостному поводу, вышеописанный механизм был выпилен. Так что теперь давайте еще формировать уведомления. Это не только требование современных систем, но и просто удобно, поскольку пользователю не придется выключать и включать экран, чтобы просто нажать паузу. Заодно применим это уведомление для перевода сервиса в foreground-режим.
Нам не придется рисовать кастомное уведомление, поскольку Android предоставляет специальный стиль для плееров — Notification.MediaStyle.
Добавим в сервис два метода
И добавим вызов refreshNotificationAndForegroundStatus(int playbackState) во все коллбэки MediaSession.
Android 4.4
Android 7.1.1
Android Wear
Started service
В принципе у нас уже все работает, но есть засада: наша activity запускает сервис через binding. Соответственно, после того, как activity отцепится от сервиса, он будет уничтожен и музыка остановится. Поэтому нам надо в onPlay добавить
Никакой обработки в onStartCommand не надо, наша цель не дать системе убить сервис после onUnbind.
А в onStop добавить
В случае, если к сервису привязаны клиенты, stopSelf ничего не делает, только взводит флаг, что после onUnbind сервис можно уничтожить. Так что это вполне безопасно.
ACTION_AUDIO_BECOMING_NOISY
Продолжаем полировать сервис. Допустим пользователь слушает музыку в наушниках и выдергивает их. Если эту ситуацию специально не обработать, звук переключится на динамик телефона и его услышат все окружающие. Было бы хорошо в этом случае встать на паузу.
Для этого в Android есть специальный бродкаст AudioManager.ACTION_AUDIO_BECOMING_NOISY.
Добавим в onPlay
В onPause и onStop
И по факту события встаем на паузу
Android Auto
Начиная с API 21 появилась возможность интегрировать телефон с экраном в автомобиле. Для этого необходимо поставить приложение Android Auto и подключить телефон к совместимому автомобилю. На экран автомобиля будет выведены крупные контролы для управления навигацией, сообщениями и музыкой. Давайте предложим Android Auto наше приложение в качестве поставщика музыки.
Если у вас под рукой нет совместимого автомобиля, что, согласитесь, иногда бывает, можно просто запустить приложение и экран самого телефона будет работать в качестве автомобильного.
Исходный код выложен на GitHub (ветка MediaBrowserService).
Прежде всего надо указать в манифесте, что наше приложение совместимо с Android Auto.
Добавим в манифест
Здесь automotive_app_desc — это ссылка на файл automotive_app_desc.xml, который надо создать в папке xml
Преобразуем наш сервис в MediaBrowserService. Его задача, помимо всего ранее сделанного, отдавать токен в Android Auto и предоставлять плейлисты.
Поправим декларацию сервиса в манифесте
Во-первых, теперь наш сервис экспортируется, поскольку к нему будут подсоединяться снаружи.
И, во-вторых, добавлен интент-фильтр android.media.browse.MediaBrowserService.
Меняем родительский класс на MediaBrowserServiceCompat.
Поскольку теперь сервис должен отдавать разные IBinder в зависимости от интента, поправим onBind
Имплементируем два абстрактных метода, возвращающие плейлисты
И, наконец, имплементируем новый коллбэк MediaSession
Здесь mediaId — это тот, который мы отдали в setMediaId в onLoadChildren.
Плейлист
Трек
UPDATE от 27.10.2017: Пример на GitHub переведен на targetSdkVersion=26. Из релевантных теме статьи изменений необходимо отметить следующее:
- android.support.v7.app.NotificationCompat.MediaStyle теперь deprecated. Вместо него следует использовать android.support.v4.media.app.NotificationCompat.MediaStyle. Соответственно, больше нет необходимости использовать android.support.v7.app.NotificationCompat, теперь можно использовать android.support.v4.app.NotificationCompat
- Метод AudioManager.requestAudioFocus(OnAudioFocusChangeListener l, int streamType, int durationHint) теперь тоже deprecated. Вместо него надо использовать AudioManager.requestAudioFocus(AudioFocusRequest focusRequest). AudioFocusRequest — новый класс, добавленный с API 26, поэтому не забывайте проверять на API level.
Создание AudioFocusRequest выглядит следующим образом
Теперь запрашиваем фокус
Разумеется, все вышеописанные изменения вносить необязательно, старые методы работать не перестали.
Вот мы и добрались до конца. В целом тема эта довольно запутанная. Плюс отличия реализаций на разных API level и у разных производителей. Очень надеюсь, что я ничего не упустил. Но если у вас есть, что исправить и добавить, с удовольствием внесу изменения в статью.
Еще очень рекомендую к просмотру доклад Ian Lake. Доклад от 2015 года, но вполне актуален.
Источник