Как захватить ключевые события от Bluetooth-гарнитуры с Android
Моим приложением можно управлять с помощью обычной гарнитуры. Он просто переопределяет "onKeyDown". Но ключевые события от bluetooth-гарнитуры не фиксируются - почему? Или как перехватить события bluetooth key?
"log cat" показывает следующее, если я нажимаю кнопку на гарнитуре:
Bluetooth AT recv(3043): AT+VGS=15
AudioPolicyManagerBase(13654): FM radio recording off
AudioService(2261): sendVolumeUpdate, isKeyguardLocked...Not to update Volume Panel.
VolumePanel(2261): change volume by MSG_VOLUME_CHANGED
VolumePanel(2261): onVolumeChanged(streamType: 6, flags: 0)
VolumePanel(2261): Call setChangeSeekbarColor(false)
Я также пытался обрабатывать действия с мультимедийными кнопками, но это не работает. моя идея - это свободно настраиваемое сопоставление клавиш: пользователь выбирает "установить ключ", которое мое приложение слышит на всех клавишах (аппаратные средства, мультимедийные кнопки, Bluetooth-гарнитура), затем пользователь нажимает клавишу, и код события / ключа сохраняется в конфигурации.
Подводя итогне работает Ответы: кнопки громкости должны быть захвачены "VOLUME_CHANGED_ACTION". Проблема в том, что эти намерения транслируются в другие приложения, а abortBroadcast() не работает (работает только для "заказанных" трансляций). Другая проблема заключается в том, что клавиши на кабельной гарнитуре и на телефоне дважды вызывают функцию onReceive() (почему?). Следующая проблема - 3-ий ключ на гарнитуре Bluetooth. Он запускает голосовую команду (s-voice запускается на s3), я пытался охватить много разных намерений, связанных с этим, но я не могу "получить" нажатие этой кнопки и не знаю почему. В конце я хочу захватить все виды кнопок и не хочу, чтобы они обрабатывались другими приложениями (например, используя onKeyDown и возвращая true).
3 ответа
Добавить слушателя трансляции в MEDIA_BUTTON
:
<intent-filter android:priority="<some number>">
<action android:name="android.intent.action.MEDIA_BUTTON" />
</intent-filter>
Вы должны зарегистрировать свой вещательный приемник внутри своего приложения (не в файле манифеста). В противном случае музыкальный проигрыватель Google поймает вашу трансляцию и отправится на нее.
Ваш IntentFilter
приоритет должен быть выше приоритетов других медиаплееров в вашем телефоне)
добавлять android.permission.BLUETOOTH
разрешение в манифесте для поддержки гарнитуры Bluetooth
Получив ключ, вы должны вручную прервать трансляцию, используя abortBroadcast()
,
Однако приоритеты и abortBroadcast()
работает нормально, пока каждое приложение отвечает только во время воспроизведения. Но некоторые пользователи также ожидают, что "проигрыватель по умолчанию" будет запущен (или начнется воспроизведение) после нажатия кнопки, как и проигрыватель по умолчанию, поэтому может случиться, что какое-то приложение с более высоким приоритетом не пропустит намерение в ваше приложение.
в onReceive
Вы можете получить событие кнопки с
KeyEvent key = (KeyEvent)
intent.getParcelableExtra(Intent.EXTRA_KEY_EVENT);
key.getKeyAction()
говорит вам, была ли кнопка отпущена или нажата, key.getKeyCode()
говорит, какая кнопка нажата.
Если вы хотите работать с однокнопочными кабельными гарнитурами, обратите внимание на код ключа. KEYCODE_HEADSETHOOK
Переопределить onKeyDown
метод в любой деятельности и проверьте KeyEvent.KEYCODE_MEDIA_KEYCODE_pressed_key
например
boolean onKeyDown(int keyCode, KeyEvent event) {
AudibleReadyPlayer abc;
switch (keyCode) {
case KeyEvent.KEYCODE_MEDIA_FAST_FORWARD:
// code for fast forward
return true;
case KeyEvent.KEYCODE_MEDIA_NEXT:
// code for next
return true;
case KeyEvent.KEYCODE_MEDIA_PLAY_PAUSE:
// code for play/pause
return true;
case KeyEvent.KEYCODE_MEDIA_PREVIOUS:
// code for previous
return true;
case KeyEvent.KEYCODE_MEDIA_REWIND:
// code for rewind
return true;
case KeyEvent.KEYCODE_MEDIA_STOP:
// code for stop
return true;
}
return false;
}
Пример интеграции ключа громкости Android - кнопки громкости, используемые в моем приложении
Этому может понадобиться разрешение
<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />
Или вы можете попробовать более тонкие реализации по следующей ссылке
Блог разработчиков Android: управление кнопками пульта дистанционного управления
Android Tales: добавьте поддержку кнопок гарнитуры в ваше приложение для Android
Проверьте эту статью. Он объясняет, как реализовать нечто подобное, используя действия мультимедийных кнопок.
Я знаю, вы упомянули, что вы шли по этому пути безуспешно, все же попробуйте. Обратите внимание на некоторые моменты, связанные с регистрацией приемника вещания, настройкой приоритетов фильтра намерений и добавлением разрешений (все объясняется в статье).
Надеюсь, это поможет.
Если вы пытаетесь услышать это от действия, используйте onKeyDown()
и поймать KEYCODE_MEDIA_PLAY_PAUSE
(KEYCODE_MEDIA_PLAY
а также KEYCODE_MEDIA_PAUSE
пост ICS) ключевых событий.
Также, чтобы решение для широковещательного приемника работало, убедитесь, что нет других приложений, установленных и работающих в фоновом режиме, которые перехватывают эти события, которые могут иметь приоритет над вашими.
Также посмотрите на это: Android - регистрация нажатия кнопки гарнитуры с BroadcastReceiver