Обработка нажатия аппаратных кнопок на ТСД в мобильной платформе



Обработка и передача события нажатия аппаратных клавиш на Android в мобильную платформу 1С.

Добрый день, коллеги, в моей предыдущей статье "Внешнее событие" и мобильная платформа 1С" я описывал метод, с помощью которого можно передать данные из внешнего сервиса в мобильную платформу 1С. И в комментариях появились вопросы, а как обработать нажатие аппаратных клавиш. Так вот в этой статье я решил поделится своим рецептом. 

Сама передача данных осуществляется по тому же способу, который я описал в предыдущей статье, поэтому здесь я его описывать не буду и расскажу только про то, как написать сам сервис для android.

Все как всегда до безобразия просто, чтобы перехватить нажатие клавиш, мы будем использовать сервис специальных возможностей android "AccessibilityService". А именно обрабатывать событие "onKeyEvent".

Код класса выглядит следующим образом:

package ru.dewersia.getkeyboard;

import android.content.Intent;
import android.os.Handler;
import android.accessibilityservice.AccessibilityService;
import android.view.KeyCharacterMap;
import android.view.KeyEvent;
import android.view.accessibility.AccessibilityEvent;

import static android.view.KeyEvent.ACTION_UP;


public class MyAccessibilityService extends AccessibilityService {

final String LOG_TAG = "mLog";
//Имя события, которое будет передаваться в 1С
public static final String SEND_BARCODE = "ru.dewersia.barcodeDLL.TRUSTCONNECT";
public Handler mHandler;
public KeyCharacterMap chMap;

@Override
public void onCreate() {

}

@Override
public void onServiceConnected() {

}

@Override
public void onAccessibilityEvent(AccessibilityEvent event) {

}

@Override
public void onInterrupt() {

}

@Override
protected boolean onKeyEvent(KeyEvent event) {
//Обработка события нажатия клавиши
int keyCode = event.getKeyCode();
int keyAct = event.getAction();

//Здесь я исключаю коды кнопок, которые не требуется передавать в 1С
if (keyCode==233 || keyCode==25 || keyCode==24 || keyCode==3){
return super.onKeyEvent(event);
}

//Обработка события KeyUp
if (keyAct==ACTION_UP){
Intent intent = new Intent();
intent.setAction(SEND_BARCODE);
intent.putExtra("text", ""+keyCode); //Передаем код нажатой кнопки
intent.putExtra("base", "");
intent.putExtra("title", "keyboard"); //Передаем имя события
sendBroadcast(intent);
}

return super.onKeyEvent(event);
}

}

Собственно, этот код и решает всю задачу. Исходники всего сервиса прикрепил к публикации.

Сам сервис после установки появится в Настройки — Специальные возможности — НазваниеПриложения. Включаем сервис и все начинает работать. Вот собственно и все. Надеюсь эта информация поможет людям в разработке удобных мобильных приложений на базе мобильной платформы 1С.

 

Тестировалось на мобильной платформе 8.3.9.74, но будет работать и на всех других.

28 Comments

  1. MarryJane

    Скажите, все так же требуется дорабатывать файлик

    Androidprjandroid-arminpermissions.xml. Или уже можно не трогать его.

    Reply
  2. dewersia

    К сожалению пока все так же. Руки никак не дойдут еще раз все разобрать.

    Reply
  3. plutonii

    Здравствуйте. Попал в руки интересный ТСД по цене/характеристика Атол SMART.LITE на Андройд 7.

    Для него сервис не писали?

    Готов поучаствовать в тестировании данного сервиса. Документация и SDK производителя есть. Сервис, который Вы писали для Атол Дройд на Андройде 4 на нем работать не стал, событие не перехватывается.

    Reply
  4. dewersia

    (3) Добрый день. Странно, а сервис выдает какую-то ошибку при запуске или нет? И приложение собирали сборщиком?

    Reply
  5. plutonii

    (4) Добрый. На основе вашей первой публикации был написан драйвер для Смарт.Дройд Атол, событие отрабатывало из 1С. Потом привезли Смарт Лайт — там Андройд другой уже. Приложение под дройд ставится как служба, но событие не срабатывает. Вот по этой ссылке SDK на этот терминал сбора данных https://yadi.sk/d/DOLFmXILYT2gyw

    Reply
  6. MORT32Ram

    Не работает, служба ставится, включается. В 1С мобильное приложение код добавил, не реагирует.

    версия мобильной платформы 8.3.14.53

    Reply
  7. plutonii

    (5)

    Reply
  8. dewersia

    (7)Добрый день, пути в разработке лучше использовать только с латинскими буквами. По поводу первого вопроса, я постараюсь посмотреть на этой неделе.

    Reply
  9. dewersia

    (6)Добрый день, не забыли поправить файл permissions? И собирали сборщиком?

    Reply
  10. MORT32Ram

    Здравствуйте, менял несколько раз, ставил через отладку, так же пробовал удалять платформу и ставить ее через апк тоже результата ноль.

    Там путь к файлу сейчас другой, такого вида — mobile_8_3_14_53Androidprjandroid-arm.zip

    Reply
  11. MORT32Ram

    (10)Не так немного про путь, в самом prjandroid-arm.zip сейчас папки bin нет, и permissions находится в корне prjandroid-arm.zip не знаю насколько это критично. Сборщиком собирать обязательно?

    Reply
  12. dewersia

    (11)Да сборщиком собирать обязательно иначе в сам apk не добавляется строчка из permissions. Там идея такая, что в этом файле добавляем intent, который имеет доступ к 1С. дальше все запаковываем обратно и используем эту измененную платформу в сборщике.

    Reply
  13. MORT32Ram

    (12) Прощу прощения, все работает. Спасибо большое.

    Reply
  14. MORT32Ram

    Кто нибудь может сталкивался как сделать чтоб это оповещение отрабатывало только при открытой этой форме? сейчас работает в любой другой форме не только в той где код.

    Reply
  15. minimajack

    (14) ВводДоступен() ?

    Reply
  16. MORT32Ram

    (15)Точно, спасибо. Туплю.

    Reply
  17. plutonii

    (8) Здравствуйте. Удалось посмотреть? Без работающего сканера сыпется вся логика приложения 1С в моем вопросе((((

    Reply
  18. plutonii

    (8)

    Здравствуйте, удалось прикрутить ТСД с мобилке. Событие 1 эской перехватывается при сканировании, но когда приложение открыто( Не могли бы помочь — сделать чтобы приложение запускалось на ТСД как служба? исходники могу скинуть в любое место. Спасибо.

    Reply
  19. Rokstedi

    Подскажите, как Вы боритесь с тем что при нажатии клавиши вне 1с(например на рабочем столе андроид) постоянно выскакивает уведомление?

    http://prntscr.com/pauz2t

    Reply
  20. RFP

    Правильно ли я понимаю что собирать нужно в Андроид студио? Что то я попробовал, но не собралось ничего. Может есть у кого инструкция как собирать в Андроид студии?

    Reply
  21. poteh

    (20) Сервис перехвата клавиш — да, собирается в андроид студии. В целом ничего сложного. Нужно сделать пустой проект без Activity, затем добавить новый java класс и скопировать в него код из статьи.

    Насколько я понял, необходимо ещё поправить AndroidManifest.xml чтобы андроид понял что это приложение — AccessibilityService.

    Всё, делаем билд, кидаем приложение на устройство и инсталлируем.

    А сама 1С с изменённым permissions собирается в сборщике мобильных приложений, который поставляется в архиве вместе с мобильной платформой.

    (9) Я прав? AndroidManifest.xml тоже надо править? А то на моём SmartDroid не приходят уведомления. Из оконного приложения удалось передать уведомление в 1С, а через AccessibilityService- пока никак не добьюсь.

    У меня получилось следующее:

        <application
    android:allowBackup=»true»
    android:icon=»@mipmap/ic_launcher»
    android:label=»@string/app_name»
    android:roundIcon=»@mipmap/ic_launcher_round»
    android:supportsRtl=»true»
    android:theme=»@style/AppTheme»>
    
    <service android:name=».MyAccessibilityService»
    android:permission=»android.permission.BIND_ACCESSIBILITY_SERVICE»
    android:label=»@string/accessibility_service_label»>
    <intent-filter>
    <action android:name=»android.accessibilityservice.AccessibilityService» />
    </intent-filter>
    </service>
    
    </application>
    

    Показать

    Reply
  22. RFP

    (19)

    Попробуйте поставить эту прогрмму от RightScan. Она должна заблочить все уведомления и возможности пользователя полазить по телефону. Будет доступно только то что вы выведете на рабочий стол.

    Reply
  23. RFP

    (21) Спасибо. Собрать получилось. Но в 1С пока не отлавливается.

    Reply
  24. poteh

    (23) Вот такая же беда… Если получится отловить — отпишитесь, пожалуйста.

    Reply
  25. RFP

    (24)В отладчике не поймал остановку в ожидаемом мне обработчике «ОбработкаВнешнегоСобытия».

    Однако.

    1. После того как в файле permission мобильной платформы 1С я убрал пробелы в «<action android:name=» ru.dewersia.barcodeDLL.TRUSTCONNECT » />» (которые случайно за копипастил из другой статьи).

    Было:

    <LocalNotification>
    
    <uses-permission android:name=»android.permission.VIBRATE»/>
    
    <target xpath=»/manifest/application» >
    
    <receiver
    android:name=»com.e1c.mobile.LocalNotificationReceiver»
    android:enabled=»true»>
    
    <intent-filter>
    <action android:name=» ru.dewersia.barcodeDLL.TRUSTCONNECT  » />
    </intent-filter>
    </receiver>
    </target>
    
    </LocalNotification>

    Показать

    Стало:

    <LocalNotification>
    
    <uses-permission android:name=»android.permission.VIBRATE»/>
    
    <target xpath=»/manifest/application» >
    
    <receiver
    android:name=»com.e1c.mobile.LocalNotificationReceiver»
    android:enabled=»true»>
    
    <intent-filter>
    <action android:name=»ru.dewersia.barcodeDLL.TRUSTCONNECT» />
    </intent-filter>
    </receiver>
    </target>
    
    </LocalNotification>

    Показать

    2. Помимо этого полностью удалил 1С с ТСД, пересобранную без пробелов поставил. И начали появляться номера клавиш в виде уведомлений для приложения 1С.

    3. Собрал приложение из исходников за стартмани, а не из кода статьи.

    Пока не знаю что сделать, чтобы отловить клавишу в «ОбработкаВнешнегоСобытия», если дойдете до того же места что и я, может у вас что то получится. Пишите, если получиться пожалуйста.

    Reply
  26. RFP

    (24)Всё получилось

    Добавил следующее:

    Процедура ПриНачалеРаботыСистемы()
    
    
    
    #Если МобильноеПриложениеКлиент Или МобильноеПриложениеСервер  Тогда
    ДоставляемыеУведомления.ПодключитьОбработчикУведомлений(«ПриПолученииУведомления»);
    #КонецЕсли
    
    
    КонецПроцедуры
    
    Процедура ПриПолученииУведомления(Уведомление, Локальное, Показано) Экспорт
    
    Если Локальное Тогда
    Сообщить(«Прибыло уведомление с текстом: » + Уведомление.Текст);
    Иначе
    Сообщить(«Прибыло push-уведомление с текстом: » + Уведомление.Текст);
    КонецЕсли;
    
    КонецПроцедуры
    
    

    Показать

    Всё работает и ловится.

    Reply
  27. olejnikov_m

    Добрый день. А есть уже готовый apk ? Поделитесь пожалуйста…

    Reply
  28. olejnikov_m

    (3) Добрый день. Получилось у вас подключить Атол SMART.LITE на Андройд 7.?

    Reply

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *