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;
}
}
Надеюсь это поможет,
Шон