Кнопка PTT и другие кнопки рации
Чтобы рация работала с DMRConnect из коробки, её кнопка PTT должна дойти до приложения одним из способов ниже. Если вы делаете прошивку или выбираете железо, проще всего начать с раздела «Что сделать в прошивке».
- Кому
- производителям и продавцам POC-раций, защищённых телефонов, магнитол, авторам прошивок
- Пакет приложения
ru.stackworks.dmr- В приложении
- «Настройки», «Назначение кнопок»: PTT, группа вперёд и назад, скан, переключение группа или приват
Как нажатие доходит до приложения
| Путь | Когда работает | Что нужно от рации |
|---|---|---|
| Клавиша в окно приложения | DMRConnect на экране | кнопка отдаёт обычный KeyEvent с честным нажатием и отпусканием |
| Служба специальных возможностей | приложение свёрнуто, экран погашен или заблокирован | то же, плюс человек один раз включает службу DMRConnect в настройках Android |
| Широковещательный сигнал | пока работает служба связи DMRConnect, в любом состоянии экрана | прошивка шлёт один из сигналов из таблицы ниже |
| Сигнал Sonim | в любом состоянии экрана, приёмник объявлен в манифесте | DMRConnect выбран в «Программируемых клавишах» рации |
| Медиакнопка гарнитуры | в любом режиме, кроме режима автомагнитолы | гарнитура или Bluetooth-пульт с кнопкой воспроизведения |
Клавиши
Любую кнопку, которая приходит в Android обычным KeyEvent, человек назначает сам: «Настройки», «Назначение кнопок», «Назначить» и нажать кнопку на рации. Приложение показывает, какая кнопка поймана, в том числе если это был сигнал рации, а не клавиша. Кроме PTT так же назначаются шаг группы вперёд и назад, скан и переключение «группа / приват».
Там же выбирается, как работает PTT: «Удержание» (зажал - говоришь) или «Переключатель» (клик - передача, ещё клик - приём). Выбор действует и на клавиши, и на сигналы рации. Для Bluetooth-пультов, которые шлют кнопки громкости, есть пункт «Кнопки громкости = PTT», он работает, пока приложение на экране.
Для PTT в режиме удержания важно, чтобы рация присылала нажатие и отпускание как есть: ACTION_DOWN в момент нажатия, повторы при удержании и ACTION_UP при отпускании. Бывает, что кнопка в зажатом виде шлёт частые пары «нажата-отпущена», так делают некоторые магнитолы. Приложение это выдерживает: отпускание засчитывается только если за 380 мс не пришло нового нажатия.
Если прошивка отдаёт приложению только долгое нажатие с флагом FLAG_CANCELED при отпускании, как Sonim на Motorola LEX F10, клавишей PTT работать не будет. Тогда нужен сигнал из следующего раздела.
Служба специальных возможностей DMRConnect нужна только для кнопок в фоне. Она не читает экран и ничего не нажимает: смотрит лишь на клавиши, которые человек сам назначил, остальные пропускает дальше. Когда приложение на экране, клавишу ловит само окно, служба её не трогает, иначе нажатие сработало бы дважды.
Широковещательные сигналы
Многие POC-рации забирают PTT себе и рассылают сигнал, а обычный KeyEvent стороннему приложению не доходит. DMRConnect слушает такие сигналы без всякого назначения в настройках, пока работает его служба связи. Набор сверен с приложениями, у которых кнопка на этих рациях работает.
| Сигнал (action) | Что внутри | Чьи рации |
|---|---|---|
android.intent.action.PTT.downandroid.intent.action.PTT.up | ничего, само действие говорит «нажата» или «отпущена» | многие китайские POC |
android.intent.action.PTT_DOWNandroid.intent.action.PTT_UP | то же, вариант написания | многие китайские POC |
com.zello.ptt.downcom.zello.ptt.up | ничего | рации, которые поддерживают Zello: HIROYASU HI-B8, smartship и другие |
com.mcx.intent.action.CRITICAL_COMMUNICATION_CONTROL_KEY | android.intent.extra.KEY_EVENT с обычным KeyEvent; учитываются ACTION_DOWN без повторов и ACTION_UP | MCX, стандарт 3GPP для служебной связи: Hytera P60 и другие |
com.meigsmart.meigkeyaccessibility.onkeyevent | keycode (int) 142 - PTT, action (int) 0 нажата, 1 отпущена. keycode 292 и 293 - крутилка вперёд и назад | рации на модулях MeiG |
com.sonim.intent.action.PTT_KEY_DOWNcom.sonim.intent.action.PTT_KEY_UP | android.intent.extra.KEY_EVENT | Sonim и Motorola LEX F10 |
Сигнал Sonim устроен иначе остальных. Прошивка Sonim отдаёт PTT одному приложению, выбранному в настройках «Программируемые клавиши», а в этот список попадают только приложения с приёмником в манифесте. Поэтому у DMRConnect этот приёмник объявлен в манифесте, и сигнал доходит в любом состоянии экрана, в том числе на заблокированной рации. Человеку нужно один раз выбрать DMRConnect в этих настройках.
Проверить без рации
Сигналы можно послать с компьютера через adb на любой телефон с DMRConnect. Подключитесь к серверу с попугаем в приложении и отправьте нажатие, через пару секунд отпускание.
adb shell am broadcast -p ru.stackworks.dmr -a android.intent.action.PTT.down
adb shell am broadcast -p ru.stackworks.dmr -a android.intent.action.PTT.up
adb shell am broadcast -p ru.stackworks.dmr -a com.zello.ptt.down
adb shell am broadcast -p ru.stackworks.dmr -a com.zello.ptt.up
# MeiG: PTT нажата, отпущена, крутилка вперёд
adb shell am broadcast -p ru.stackworks.dmr -a com.meigsmart.meigkeyaccessibility.onkeyevent --ei keycode 142 --ei action 0
adb shell am broadcast -p ru.stackworks.dmr -a com.meigsmart.meigkeyaccessibility.onkeyevent --ei keycode 142 --ei action 1
adb shell am broadcast -p ru.stackworks.dmr -a com.meigsmart.meigkeyaccessibility.onkeyevent --ei keycode 292
# Sonim
adb shell am broadcast -p ru.stackworks.dmr -a com.sonim.intent.action.PTT_KEY_DOWN
adb shell am broadcast -p ru.stackworks.dmr -a com.sonim.intent.action.PTT_KEY_UP
Ключ -p адресует сигнал именно DMRConnect: на Android 8 и новее неадресованные сигналы приёмникам из манифеста не доставляются. Сигнал MCX несёт внутри объект KeyEvent, его из командной строки не собрать, проверяйте на рации.
Гарнитуры и Bluetooth
Кнопки гарнитуры и Bluetooth-пультов приходят как медиакнопки: HEADSETHOOK, MEDIA_PLAY_PAUSE, MEDIA_PLAY, MEDIA_PAUSE, MEDIA_STOP, MEDIA_NEXT, MEDIA_PREVIOUS, перемотка. Удерживать их честно почти никогда нельзя, гарнитура шлёт короткий клик. Поэтому для них PTT работает переключателем: клик - передача пошла, ещё клик - закончилась. Чтобы кнопка работала и в фоне, приложение держит медиасессию, пока такая кнопка назначена. В режиме автомагнитолы медиасессия не включается: она перехватывала штатную громкость магнитолы.
Что сделать в прошивке
Если вы производитель или собираете прошивку, вот варианты в порядке нашего предпочтения.
- Отдавать кнопку PTT обычным
KeyEventс честным нажатием и отпусканием, со своим кодом в.kl. Это работает в любом приложении, человек назначает кнопку за секунду. - Если PTT забирает ваше приложение, дополнительно рассылать
android.intent.action.PTT.downи.up. Сигнал без параметров понимают DMRConnect и многие другие клиенты. - Если рассылка адресная, как у Sonim, дайте пользователю выбрать приложение в настройках и шлите сигнал с указанием пакета.
Пришлите нам модель и код кнопки, и мы добавим рацию в профили: тогда PTT заработает сразу после установки, без назначения. Как снять коды кнопок без adb, рассказано в статье «Новая рация».
Рации, которые приложение знает по модели
Для этих моделей DMRConnect сам выбирает интерфейс и назначает кнопки по Build.MODEL. Сохранённое человеком назначение всегда главнее умолчания.
Build.MODEL | Рация | PTT | Что ещё |
|---|---|---|---|
HYT-P50, HYT-P50 Pro | Hytera P50, P50 Pro | клавиша 132 (F2) | без сенсора, кнопочный интерфейс |
HYT-P60 | Hytera P60 | клавиша 634 | сигнал MCX тоже принимается |
UNIWA_F400 | UNIWA F400 | клавиша 132 (F2) | - |
HI-B8, m3_h | HIROYASU HI-B8, smartship | сигнал Zello | крутилка: клавиши 133 и 134, компактный режим POC |
LEX F10 | Motorola LEX F10 | сигнал Sonim | нужна сборка для Android 5.1-6 |
У HI-B8 клавиша 261 тоже приходит, но её мы специально не назначаем: рация шлёт и клавишу, и сигнал Zello, и одно нажатие сработало бы дважды.
Нашли неточность или не хватает функции? Напишите в группу DMRConnect, поправим справочник.