Добрый день, коллеги, в моей предыдущей статье "Внешнее событие" и мобильная платформа 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, но будет работать и на всех других.
Скажите, все так же требуется дорабатывать файлик
Androidprjandroid-arminpermissions.xml. Или уже можно не трогать его.
К сожалению пока все так же. Руки никак не дойдут еще раз все разобрать.
Здравствуйте. Попал в руки интересный ТСД по цене/характеристика Атол SMART.LITE на Андройд 7.
Для него сервис не писали?
Готов поучаствовать в тестировании данного сервиса. Документация и SDK производителя есть. Сервис, который Вы писали для Атол Дройд на Андройде 4 на нем работать не стал, событие не перехватывается.
(3) Добрый день. Странно, а сервис выдает какую-то ошибку при запуске или нет? И приложение собирали сборщиком?
(4) Добрый. На основе вашей первой публикации был написан драйвер для Смарт.Дройд Атол, событие отрабатывало из 1С. Потом привезли Смарт Лайт — там Андройд другой уже. Приложение под дройд ставится как служба, но событие не срабатывает. Вот по этой ссылке SDK на этот терминал сбора данныхhttps://yadi.sk/d/DOLFmXILYT2gyw
Не работает, служба ставится, включается. В 1С мобильное приложение код добавил, не реагирует.
версия мобильной платформы 8.3.14.53
(5)
(7)Добрый день, пути в разработке лучше использовать только с латинскими буквами. По поводу первого вопроса, я постараюсь посмотреть на этой неделе.
(6)Добрый день, не забыли поправить файл permissions? И собирали сборщиком?
Здравствуйте, менял несколько раз, ставил через отладку, так же пробовал удалять платформу и ставить ее через апк тоже результата ноль.
Там путь к файлу сейчас другой, такого вида — mobile_8_3_14_53Androidprjandroid-arm.zip
(10)Не так немного про путь, в самом prjandroid-arm.zip сейчас папки bin нет, и permissions находится в корне prjandroid-arm.zip не знаю насколько это критично. Сборщиком собирать обязательно?
(11)Да сборщиком собирать обязательно иначе в сам apk не добавляется строчка из permissions. Там идея такая, что в этом файле добавляем intent, который имеет доступ к 1С. дальше все запаковываем обратно и используем эту измененную платформу в сборщике.
(12) Прощу прощения, все работает. Спасибо большое.
Кто нибудь может сталкивался как сделать чтоб это оповещение отрабатывало только при открытой этой форме? сейчас работает в любой другой форме не только в той где код.
(14) ВводДоступен() ?
(15)Точно, спасибо. Туплю.
(8) Здравствуйте. Удалось посмотреть? Без работающего сканера сыпется вся логика приложения 1С в моем вопросе((((
(8)
Здравствуйте, удалось прикрутить ТСД с мобилке. Событие 1 эской перехватывается при сканировании, но когда приложение открыто( Не могли бы помочь — сделать чтобы приложение запускалось на ТСД как служба? исходники могу скинуть в любое место. Спасибо.
Подскажите, как Вы боритесь с тем что при нажатии клавиши вне 1с(например на рабочем столе андроид) постоянно выскакивает уведомление?
http://prntscr.com/pauz2t
Правильно ли я понимаю что собирать нужно в Андроид студио? Что то я попробовал, но не собралось ничего. Может есть у кого инструкция как собирать в Андроид студии?
(20) Сервис перехвата клавиш — да, собирается в андроид студии. В целом ничего сложного. Нужно сделать пустой проект без Activity, затем добавить новый java класс и скопировать в него код из статьи.
Насколько я понял, необходимо ещё поправить AndroidManifest.xml чтобы андроид понял что это приложение — AccessibilityService.
Всё, делаем билд, кидаем приложение на устройство и инсталлируем.
А сама 1С с изменённым permissions собирается в сборщике мобильных приложений, который поставляется в архиве вместе с мобильной платформой.
(9) Я прав? AndroidManifest.xml тоже надо править? А то на моём SmartDroid не приходят уведомления. Из оконного приложения удалось передать уведомление в 1С, а через AccessibilityService- пока никак не добьюсь.
У меня получилось следующее:
Показать
(19)
Попробуйте поставить эту прогрмму от RightScan. Она должна заблочить все уведомления и возможности пользователя полазить по телефону. Будет доступно только то что вы выведете на рабочий стол.
(21) Спасибо. Собрать получилось. Но в 1С пока не отлавливается.
(23) Вот такая же беда… Если получится отловить — отпишитесь, пожалуйста.
(24)В отладчике не поймал остановку в ожидаемом мне обработчике «ОбработкаВнешнегоСобытия».
Однако.
1. После того как в файле permission мобильной платформы 1С я убрал пробелы в «<action android:name=» ru.dewersia.barcodeDLL.TRUSTCONNECT » />» (которые случайно за копипастил из другой статьи).
Было:
Показать
Стало:
Показать
2. Помимо этого полностью удалил 1С с ТСД, пересобранную без пробелов поставил. И начали появляться номера клавиш в виде уведомлений для приложения 1С.
3. Собрал приложение из исходников за стартмани, а не из кода статьи.
Пока не знаю что сделать, чтобы отловить клавишу в «ОбработкаВнешнегоСобытия», если дойдете до того же места что и я, может у вас что то получится. Пишите, если получиться пожалуйста.
(24)Всё получилось
Добавил следующее:
Показать
Всё работает и ловится.
Добрый день. А есть уже готовый apk ? Поделитесь пожалуйста…
(3) Добрый день. Получилось у вас подключить Атол SMART.LITE на Андройд 7.?