- Кто сказал Мяу? — работаем со звуками Му, Мяу, Гав
- Android studio работа со звуком
- Программирование звука в Android — SoundPool и MediaPlayer
- Android управление звуком
- Как проиграть звук через SoundPool
- SoundPool и утечка памяти
- Воспроизведение фоновой музыки в Android с помощью MediaPlayer
- Воспроизведение звуковых эффектов в Android с помощью SoundPool
- View more Tutorials:
- 1- SoundPool & AudioManager
- 2- Пример с SoundPool
- View more Tutorials:
Кто сказал Мяу? — работаем со звуками Му, Мяу, Гав
Напишем программу, которая поможет определить, кто-же сказал Мяу? Меня всегда интересовал данный вопрос.
Подготовим заранее картинки различных животных и вставим их в папку res/drawable. Создадим макет приложения. Можно использовать ImageView или ImageButton. Я использовал оба варианта для Java и Kotlin.
Положим подготовленные аудио-файлы с голосами животных в директорию assets. По умолчанию в проекте такой папки нет. Выбираем File | New | Folder | Assets Folder. В диалоговом окне оставляем всё без изменений и нажимаем кнопку Finish. Файлы, лежащие в этой папке, считайте тоже ресурсами. Но они имеют свои особенности, в частности вы можете создавать свою структуру подпапок.
Переходим к программной части. Нам надо создать объект SoundPool, загрузить в него аудио-файлы из папки assets методом load().
Зададим максимальное количество одновременно проигрываемых потоков — 3.
При нажатии на кнопку (или картинку) будем проигрывать нужный звук. В варианте для Java остался устаревший код, в Kotlin-коде оставил только правильный вариант. Но не стал делать защиту от поворота, просто смотрите на Java-код и доработайте самостоятельно.
При загрузке файлов метод load() возвращает идентификатор soundID, который сохраняем для дальнейшего использования. Объявим для каждого звука отдельную переменную, если же звуков много лучше завести для этого ассоциативный массив.
Файловый дескриптор AssetFileDescriptor для файла из директории assets получаем с помощью метода openFd(), принимающего в качестве параметра имя файла. Если файл не найден или не может быть открыт, то выводим сообщение и в качестве soundID возвращаем -1.
По нажатию кнопки вызываем метод playSound(), передавая ему нужный идентификатор звука. В методе проверяем этот идентификатор. Если файл не был найден, то метод loadSound() возвращает -1, а если метод load() класса SoundPool не смог загрузить файл, то soundID будет равен 0, поэтому проверяем, что SoundID > 0, что означает, что файл был успешно загружен. Если же все хорошо, то вызываем метод play().
В версии Android 5.0 конструктор класса SoundPool является устаревшим. В коде использовано условие if с проверкой версии системы на устройстве, а также использованы аннотации, чтобы студия не ругалась на устаревший метод. Про аннотации мы поговорим в другой статье, пока воспринимайте их как подсказку-предупреждение при написании кода, чтобы выбрать правильный вариант.
Программа держит загруженные звуки в памяти. Если они вам не нужны, то нужно освободить ресурсы. Я сделал это в методе onPause(), соответственно загрузку пришлось перенести в onResume().
Запустим программу и выясним, так кто-же сказал Мяу?
Один из читателей захотел выводить звук не через щелчок, а нажатие на кнопку. А когда палец открывается от экрана, то звук должен прекращаться. Получился интересный эффект, который мы нашли сообща. Код для кнопки с коровой (предыдущий код лучше убрать):
При воспроизведении звука мы получаем его идентификатор, используемый для остановки воспроизведения.
Источник
Android studio работа со звуком
В этом уроке давайте научимся основам работы со звуком с помощью объекта SoundPool. В приложении будет одна кнопка, при нажатии на которую будет воспроизводится звук. Как видите, идея проста. Осталось научиться ее реализовывать.
Создаем новый проект, выбираем Blank Activity. Перед тем, как мы начнем работу с кодом программы, нужно подготовить необходимый звуковой файл и добавить его к файлам нашего приложение. Можете скачать свой звук или песенку, я предлагаю воспользоваться этим. Теперь нам нужно в файлах приложения создать папку, в которую мы поместим звуковой файл. Создайте в папке res папку по имени raw, она должна быть на одном уровне с такими папками как drawable,layout,menu. Сюда с помощью простого перетаскивания либо через файловую систему компьютера помещаем звуковой файл, присвойте ему имя sound.mp3:
На этом подготовительные работы закончены. Переходим к созданию задуманного приложения. Открываем файл activity_main.xml и добавляем туда всего одну кнопку:
Интерфейс нашей программы теперь выглядит так:
Как видите, мы создали для нашей кнопочки нажатие с помощью строки:
Чтобы добавить метод обработки этого нажатия в MainActivity.java, ставим курсор на слово «Play», жмем Alt+Enter и выбираем первую строку Create’Play(View)’in’MainActivity’.
Теперь переходим к работе в файле MainActivity.java. Нам нужно объявить использование SoundPool, две величины для установления связи с нашим звуковым файлом и воспроизведения звука с помощью стандартного AudioManager. Полный код MainActivity.java и объяснения важных кусков кода даны прямо в коде:
Запускаем приложение на эмуляторе либо устройстве и испытываем его работоспособность. И, о чудо, при нажатии на кнопочку играет звук! Вот и все, приложение готово.
Конечно, это далеко не предел возможностей работы со звуком в Android приложениях, скорее всего лишь мизерная их часть, но тем не менее, сегодня мы освоили один из приемов внедрение звуков в приложение и может уверенно его использовать для реализации своих идей. Одни из способов применения я показывал здесь:). Удачи!
Источник
Программирование звука в Android — SoundPool и MediaPlayer
Перед любым разработчиком, занимающимся созданием красивых интерактивных приложений, рано или поздно встает вопрос об использовании мультимедийных возможностей телефона. Для работы со звуком в Android программисты активно используют две библиотеки. Первая из них предоставляет класс SoundPool, вторая — MediaPlayer.
Класс SoundPool удобно использовать для проигрывания коротких аудиоклипов. С его помощью можно проигрывать несколько звуков одновременно, при этом размер звукового файла не должен превышать 1 Mb. Класс MediaPlayer лучше подходит для воспроизведения долгих аудио и видеороликов.
Android управление звуком
Android поддерживает различные аудиопотоки для разных целей. Регулятор расположенная на торце телефона качелька для регулирования громкости управляет только одним аудиопотоком. Для того, чтобы привязать эту кнопку к аудиопотоку необходимо указать его тип в приложении
Как проиграть звук через SoundPool
Напишем приложение, которое будет проигрывать звук при касании экрана. Создадим новый проект с именем CrazySong, пакет назовем
ru.mobilab.crazysong, в качестве главной Activity укажем CrazySongActivity.
Приведем main.xml к виду
Давайте рассмотрим последовательность действий, которую необходимо выполнить для того, чтобы воспроизвести звуковой файл. Прежде всего мы должны создать объект soundPool. Его конструктор имеет несколько параметров. Первый параметр задает максимальное число одновременно проигрываемых файлов. Второй параметр задает тип аудиопотока. В большинстве случаев здесь подойдет значение soundPool STREAM_MUSIC, хотя возможно использование и других аудиопотоков. Их назначение довольно очевидно. (STREAM_ALARM, STREAM_DTMF, STREAM_NOTIFICATION, STREAM_RING,STREAM_SYSTEM, STREAM_VOICE_CALL). Третий параметр задает sample-rate. В настоящее время он ни на что не влияет, поэтому здесь устанавливаем 0.
После того, как мы создали объект для SoundPool, с помощью setOnLoadCompleteListener добавим к нему OnLoadCompleteListener, который будет отслеживать завершение загрузки файлов. В качестве параметров метод onLoadComplete принимает объект SoundPool, номер загруженного сэмпла и статус завершения операции. В случае, если все прошло успешно, статус равен нулю.
Прежде чем проигрывать звуковые файлы их необходимо загрузить в SoundPool. Сделать это можно с помощью метода load. Метод имеет несколько реализаций, различающихся набором параметров и источником, поставляющим звуковые файлы. Можно загружать файлы из папки asset, можно из APK ресурсов, можно из файла, указав к нему путь, можно из FileDescriptor. Мы будем рассматривать ситуацию, когда звуковые сэмплы входят в состав APK пакета, то есть лежат в папке res/raw вашего проекта. Для загрузки нам понадобятся три параметра: ссылка на контекст из которого мы получаем доступ к ресурсам программы (в большинстве случаев подойдет this), ссылка на ресурс, полученная через объект R, и приоритет, который пока ни на что не влияет, и в документации рекомендуется устанавливать значение 1. Загруженные ресурсы можно выгрузить с помощью методов unload, если требуется удалить один сэмпл, и release — если нужно полностью очистить SoundPool.
Для проигрывания сэмпла используется метод play, имеющий следующие параметры:
- soundID переменная с номером сэмпла. Этот номер возвращается в результате выполнения метода load.
- leftVolume значение громкости левого канала (от 0.0 до 1.0)
- rightVolume значение громкости правого канала (от 0.0 до 1.0)
- priority приоритет потока (0 — самый низкий приоритет)
- loop сколько раз нужно повторить сэмпл (0 не повторять, -1 — зациклить)
- rate скорость воспроизведения (может изменяться от 0.5 до 2.0, 1 — нормальная скорость)
В результате выполнения метода play возвращается номер streamID (или 0 в случае ошибки), который можно использовать для управления воспроизведением. Например это значение используется при вызове методов pause и resume, stop, setVolume, setLoop. Если число максимально проигрываемых файлов превышено, то вызов очередного метода play приведет к завершению воспроизведения одного из проигрываемых в данный момент сэмплов.
Код нашего класса приведен ниже
package ru.mobilab.crazysong;
SoundPool и утечка памяти
На форумах встречаются сообщения о том, что использование SoundPool вызывает проблему утечки памяти. Какой-то внятной и проверенной информацию по этому поводу найти не удалось. Если вы не собираетесь больше проигрывать звуки, рекомендуется выполнить код
но похоже, что этот метод не решает проблему вAndroid 2.1. Если Вы располагаете информацией об этой проблеме и ее решении, просьба отписаться в комментариях.
Воспроизведение фоновой музыки в Android с помощью MediaPlayer
SoundPool отлично подходит для озвучивания различных игровых событий: выстрелов, взрывов, реплик. Однако для проигрывания фоновой музыки нужно использовать класс MediaPlayer. Метод create этого класса имеет два параметра: контекст и ссылку на ресурс или URI адрес музыкального файла. Для запуска/паузы/остановки воспроизведения служат методы start(), pause() и stop() соответственно. Все просто.
В случае, если Вы собираетесь подгружать файл из интернета, последовательность действий будет немного другая. Метод create использовать не нужно. Источник аудиоданных задается с помощью метода setDataSource, после которого нужно вызвать метод prepare(), блокирующий выполнение потока до тех пор, пока медиаплеер не будет готов к воспроизведению музыки. Метод prepareAsync() выполняет те же действия в асинхронном режиме, то есть не блокирует вызвавший его поток. В случае использования prepareAsync нужно использовать OnPreparedListener для определения момента, когда MediaPlayer готов к проигрыванию файла. Заметим, что при использовании метода create метод prepare вызывать не нужно, поскольку он вызывается внутри create.
Остался еще один актуальный вопрос: как определить, что воспроизведение файла закончилось? Для этой цели служит функция обратного вызова onCompletion. Чтобы привязать ее к нашему медиаплееру нужно выполнить следующий код:
Вот собственно и все. Воспроизведение звука не такая уж и сложная тема. Архив с проектом можетескачать здесь.
Источник
Воспроизведение звуковых эффектов в Android с помощью SoundPool
View more Tutorials:
1- SoundPool & AudioManager
Для начала, я создам ситуацию, вы создаете игру, игра проигрывает такие звуки как выстрелы, бомбы, это звуковые эффекты в игре. Android предоставляет вам класс SoundPool, похожий на хранилице звуков и готовый проигрывать их при запросе.
SoundPool содержит набор музыки, звуков из файла музыки в приложении или из файла в системе. SoundPool помогает проигрывать разные звуки одновременно.
SourcePool использует сервис MediaPlayer, чтобы сделать звуки.
Вид потока звуков | Описание |
AudioManager.STREAM_ALARM | Аудио звуков сирены |
AudioManager.STREAM DTMF | Аудио DTMF тонов |
AudioManager.STREAM_MUSIC | Аудио для перепроигрывания звуков |
AudioManager.STREAM_NOTIFICATION | Аудио звука уведомления |
AudioManager.STREAM_RING | Аудио звука звона телефона |
AudioManager.STREAM_SYSTEM | Аудио системных звуков |
AudioManager.STREAM_VOICE_CALL | Аудио телефонного вызова |
Другой вопрос это какое устройство производит звук.
Используя STREAM_MUSIC звук будет произведен через одно звуковое устройтсво (телефонный динамик, наушники, динамик bluetooth и др.) соединенные с телефоном.
Используя STREAM_RING звук будет произведен через все звуковые устройтсва соединенные с телефоном. Это поведение может отличаться на каждом устройстве.
Метод | Описание |
int play(int soundID, float leftVolume, float rightVolume, int priority, int loop, float rate) | Воспроизведение источника звука, с возвращением ID нового воспроизведенного потока (streamID). |
void pause(int streamID) | Пауза звукового потока с ID streamID. |
void stop(int streamID) | Остановка звукового потока с streamID. |
void setVolume(int streamID, float leftVolume, float rightVolume) | Установка громкости звукового потока с ID streamID |
void setLoop(int streamID, int loop) | Установка номер цикла для звукового потока с ID streamID. |
2- Пример с SoundPool
- Name: SoundPoolDemo
- Package name: org.o7planning.soundpooldemo
View more Tutorials:
Это онлайн курс вне вебсайта o7planning, который мы представляем, он включает бесплатные курсы или курсы со скидкой.
Источник