Android звук при нажатии кнопок

Воспроизведение звука при нажатии кнопки Android

Как мне получить кнопку для воспроизведения звука из raw при нажатии? Я только что создал кнопку с идентификатором button1 , но какой бы код я ни писал, все не так.

11 ответов

Это самая важная часть кода, представленного в исходном посте.

Чтобы объяснить это шаг за шагом:

Во-первых, это инициализация кнопки, которая будет использоваться для воспроизведения звука. Мы используем findViewById действия Activity, передача идентификатора, который мы присвоили ему (в этом примере: R.id.button1 ), чтобы получить нужную кнопку. Мы приводим его как Button , чтобы его было легко присвоить переменной one , которую мы инициализируем. Более подробное объяснение того, как это работает, выходит за рамки этого ответа. Это дает краткое представление о том, как это работает.

Вот как инициализировать MediaPlayer . MediaPlayer следует шаблону разработки статического фабричного метода. Чтобы получить экземпляр, мы вызываем его create() и передайте ему контекст и идентификатор ресурса звука, который мы хотим воспроизвести, в данном случае R.raw.soho . Мы объявляем это как final . Джон Скит подробно объяснил, почему мы это делаем здесь.

Наконец, мы устанавливаем, что будет делать наша ранее инициализированная кнопка. Воспроизвести звук при нажатии кнопки! Для этого мы устанавливаем OnClickListener из наша кнопка one . Внутри есть только один метод, onClick() , который содержит инструкции, которые должна выполнять кнопка при нажатии .

Теперь вы можете воспроизводить звук при нажатии кнопки в Android!

Как указано в комментарии ниже Спасибо, Лангустен Густель! , и как рекомендуется в Справочнике разработчика Android, важно вызвать release() , чтобы освободить ресурсы, которые больше не будут использоваться. Обычно это делается после того, как воспроизводимый звук завершил воспроизведение. Для этого мы добавляем OnCompletionListener в наш mp вот так:

Внутри метода onCompletion мы выпускаем его следующим образом:

Очевидно, что есть более эффективные способы реализации этого. Например, вы можете сделать MediaPlayer переменной класса и обрабатывать ее жизненный цикл вместе с жизненным циклом Fragment или Activity , которые его используют. Однако это тема для другого вопроса. Чтобы ограничить объем этого ответа, я написал его только для того, чтобы проиллюстрировать , как воспроизводить звук при нажатии кнопки в Android .

Исходный пост

Первый. Вы должны поместить свои операторы в блок, и в этом случае метод onCreate.

Второй. Вы инициализировали кнопку как переменную один , затем использовали переменную ноль и установили для нее onClickListener неполное значение onClickListener. Используйте переменную one для setOnClickListener.

В-третьих, поместите логику для воспроизведения звука внутри onClick.

Источник

Звук и вибрация экрана и клавиатуры в Андроид

Автор: LifeDroid
Дата записи

Всем привет!
Эта статья для тех, кто на своем Андроид устройстве хочет включить, или наоборот, выключить звук и вибрацию при нажатии на экран и клавиатуру.

Действительно, для кого-то это очень удобно, получать обратную связь от своего гаджета. А для многих все это только лишний шум и жужжание 🙂
Приступим.
Начнем со звуков и вибрации при нажатии на экран.
Заходим в настройки, выбираем пункт “Звуки и уведомления”. У вас он может называться как-то по-другому, в зависимости от модели и версии Android.

Звуки и уведомления

В разделе “Система” вы можете отрегулировать громкость или выключить звук вообще.

Регулируем громкость

Далее идем в меню “Интенсивность вибрации”. В моем телефоне нижний ползунок “Тактильная обратная связь” дает возможность настроить или совсем убрать вибрацию экрана.

Читайте также:  Android studio progressbar style

Интенсивность вибрации

Идем дальше — отключаем (или наоборот, включаем) звук и вибрацию клавиш.
Снова идем в настройки и находим тут меню “Язык и ввод”. Входим в него. Выбираем ту клавиатуру, которая у вас установлена по умолчанию в данный момент. В моем случае это клавиатура Google.

Клавиатура Google

Заходим в ее настройки. Как вы видите, здесь есть возможность включить или отключить виброотклик и звук клавиш. Выбирайте то, что вам нужно и пользуйтесь дальше так, как вам удобно 🙂

Виброотклик и звук клавиатуры

Кстати, более подробно о возможностях настройки клавиатуры от Гугл вы можете прочитать в отдельной моей статье, этому вопросу посвященной.
Ваш ЛайфДроид

Источник

Звук по нажатию на button

Привет.
Я повесил OnTouch на button, но теперь по клику нет звука, как вернуть?

Добавлено через 6 часов 56 минут
Почему view.playSoundEffect(SoundEffectConstants.CLICK) не работает?

Меню по нажатию button
Как сделать что бы по нажатию на button появлялся список или меню? Пример на скрине. Искал, но.

Отобразить label по нажатию button
В общем в свойствах label стоит Visible=false (скрыть на форме) При нажатии на button, должно.

Создание Form по нажатию на Button
Есть окно MainWindow и кнопка. public partial class MainWindow : Form < public.

Выполнение действия по нажатию button
всем привет! столкнулся с проблемой! мне необходимо при нажатии на кнопку выполнение РНР скрипта.

Решение

в настройках сенсорные звуки отключены значит

Добавлено через 9 минут
p.s.

работает, я в коде тупанул, условие if не выполнялось.

а как правильнее или лучше всетаки?

Вроде как ‘этот код не должен воспроизводить звук если в настройках звука отключен «Звук нажатия на экран»

p.s. у меня не работает, лучше мой вариант т.к. точно сработает

Закрытие формы по нажатию button’a
Как закрыть форму по нажатию button’a в DataGridView? Есть Форма1 в которой отображается таблица и.

Экспорт datagridview в Word по нажатию Button
Ребят, как сделать экспорт datagridview в word по нажатию button? Посмотрел несколько примеров.

Изменить надписи у label по нажатию на button
есть 3 шт. label с надписями для label1 — привет для label2 — старт для label3 — коровка при.

Открытие другой формы по нажатию на button
День добрый, только начал учить PyQt5. Потыкал пару примеров в интернетах, создал MainWindow.

Источник

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.

Читайте также:  Connecting mac and android

Следует сразу отметить, что 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-режим.

Читайте также:  Андроид для вольво s60 2004 2009

Нам не придется рисовать кастомное уведомление, поскольку 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 года, но вполне актуален.

Источник

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