Как захватить ключевые события от 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

Другие вопросы по тегам