Android - перехват аппаратного нажатия клавиш (кнопка PTT), когда приложение находится в фоновом режиме

Я разрабатываю приложение для Android, которое перехватывает нажатия аппаратных кнопок и делает вызовы REST под их давлением. Кнопка, которую я должен перехватить - это кнопка PTT, поэтому она не является обычной кнопкой, такой как кнопка питания или кнопка регулировки громкости.

Когда приложение запускается на переднем плане, я использую метод onKeyDown (int keyCode, событие KeyEvent). Кнопка PTT в качестве идентификатора имеет номер 27, а затем внутри метода я написал следующие строки кода:

if (keyCode == 27) {// Я нажал кнопку PTT}

Все это работает отлично.

Но теперь я отправляю приложение в фоновом режиме (с функцией moveTaskToBack(true);), и когда я нажимаю кнопку PTT, я перехватываю его.

Мне известны BroadcastReceiver, IntentFilter и Service, однако они позволяют вам перехватывать действия с ограниченным намерением (такие как intent.action.SCREEN_OFF или другие обычные действия), среди которых нет возможности обнаружить нажатие кнопки PTT.

Есть ли способ перехватить кнопку PTT, когда приложение находится в фоновом режиме?

Спасибо

1 ответ

Решение

Решение вашего вопроса во многом зависит от используемого вами устройства. Если у вас есть телефон с выделенной кнопкой PTT, производитель телефона почти наверняка предоставил разработчикам приложений, таким как вы, намерение перехватывать события PTT "вниз" и "вверх", но вам нужно связаться с производителем для получения дополнительной информации.

Например, на телефонах Kyocera, Sonim и Casio доступны такие Intents, и вам просто нужно поместить объявление получателя в свой AndroidManifest.xml, например, для телефона Kyocera:

    <receiver android:exported="true" android:name="com.myapp.receiver.KeyReceiverKyocera">
        <intent-filter android:priority="9999999">
            <action android:name="com.kodiak.intent.action.PTT_BUTTON" />
            <action android:name="com.kyocera.android.intent.action.PTT_BUTTON" />
        </intent-filter>
    </receiver>

Затем простой класс BroadcastReceiver, который получает намерения вверх и вниз:

public class KeyReceiverKyocera extends BroadcastReceiver
{
    private static boolean keyDown = false;

    @Override
    public void onReceive(Context context, Intent intent)
    {
        String action = intent.getAction();

        if (keyDown)
            processPTTDown();
        else
            processPTTUp();

        keyDown = !keyDown;
    }
}

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

Шон

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