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

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

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

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

Все это прекрасно работает.

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

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

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

Спасибо


person Alberto Deidda    schedule 25.08.2016    source источник
comment
В Android нет кнопки PTT. Вам нужно будет спросить производителя вашего устройства, как это реализовать. С точки зрения onKeyDown() кажется, что они используют KEYCODE_CAMERA, так что возможно ACTION_CAMERA_BUTTON будет работать.   -  person CommonsWare    schedule 25.08.2016
comment
спасибо, я представлял и пробовал всячески безуспешно. Попробую связаться с производителем устройства.   -  person Alberto Deidda    schedule 25.08.2016


Ответы (1)


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

Например, телефоны от Kyocera, Sonim и Casio имеют такие доступные намерения, и вам просто нужно поместить объявление получателя в ваш 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;
    }
}

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

Шон

person Shawn Bertrand    schedule 08.11.2016