Как захватить ключевые события из Bluetooth-гарнитуры с помощью android

Мое приложение может управляться обычной гарнитурой. Он просто переопределяет "onKeyDown". Но ключевые события от Bluetooth-гарнитуры не фиксируются - почему? Или как захватить события клавиш bluetooth?

"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-гарнитура), затем пользователь нажимает клавишу, а событие / key code сохраняется в config.

Летняя работа не работает Ответы: Кнопки громкости должны быть записаны с помощью "VOLUME_CHANGED_ACTION". Проблема в том, что это намерение транслируется в другие приложения, а abortBroadcast() не работает (он работает только для "упорядоченных" трансляций). Другая проблема заключается в том, что клавиши на кабельной гарнитуре и на телефоне триггера onReceive() дважды (почему?) Гарнитура bluetooth запускает его один раз. Следующая проблема - 3-й ключ в Bluetooth-гарнитуре. Он запускает голосовую команду (s-voice начинается с s3), я пытался захватить много разных намерений по этому поводу, но я не могу "получить" эту кнопку нажатием и не знаю почему. В конце я хочу захватить всевозможные кнопки и не хочу, чтобы они обрабатывались другими приложениями (например, с помощью onKeyDown и возвратом true).

Ответ 1

Добавьте прослушиватель вещания в MEDIA_BUTTON:

<intent-filter android:priority="<some number>"> 
   <action android:name="android.intent.action.MEDIA_BUTTON" /> 
</intent-filter> 

Вы должны зарегистрировать приемник вещания внутри своего приложения (не в файле манифеста). В противном случае проигрыватель Google Music поймает вашу трансляцию и отправит ее на борт.

Ваш приоритет IntentFilter должен быть выше, чем другие приоритеты медиаплееров на вашем телефоне)

Добавить android.permission.BLUETOOTH разрешение в манифест для поддержки Bluetooth-гарнитуры

После того, как вы получили ключ, вам необходимо вручную отключить трансляцию с помощью abortBroadcast().

Однако приоритеты и abortBroadcast() работают нормально, пока каждое приложение реагирует только тогда, когда например что-то играет. Но несколько пользователей также ожидают, что при нажатии кнопки, как проигрыватель по умолчанию, будет запущен (или начнется воспроизведение) проигрыватель по умолчанию, так что может случиться, что какое-то приложение с более высоким номером приоритета не позволит намерению проникнуть в ваше приложение

В onReceive вы можете получить событие кнопки с помощью

KeyEvent key = (KeyEvent) 
intent.getParcelableExtra(Intent.EXTRA_KEY_EVENT); 

key.getKeyAction() сообщает вам, была ли кнопка нажата, key.getKeyCode() сообщает, какая кнопка нажата.

Если вы хотите обрабатывать гарнитуры с одним кнопочным кабелем, также рассмотрите key code 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

Ответ 2

Отметьте эту статью. В нем объясняется, как реализовать что-то подобное с помощью действий кнопки мультимедиа.

Я знаю, что ты упомянул, что ты шел так без успеха, но все-таки попробуй. Обратите внимание на gotchas, связанные с регистрацией широковещательного приемника, установкой приоритетов фильтра настроек и добавлением разрешений (все объяснено в статье).

Надеюсь, это поможет.

Ответ 3

Если вы пытаетесь прослушивать это из активности, используйте onKeyDown() и перехватите события ключа KEYCODE_MEDIA_PLAY_PAUSE (KEYCODE_MEDIA_PLAY и KEYCODE_MEDIA_PAUSE post ICS).

Также, чтобы решение для широковещательного приемника работало, убедитесь, что в фоновом режиме установлены и запущены другие приложения, которые улавливают эти события, которые могут иметь приоритет над вашими.

Также посмотрите на это: Android - регистрация кнопки гарнитуры с помощью BroadcastReceiver