Укажите фильтр Intent filter
: INTENT_FILTER_DRIVER_MANAGER
.
Пример объявленного сервиса:
<service
android:name="ru.mycompany.drivers.MyDeviceService"
android:enabled="true"
android:exported="true"
android:icon="@drawable/logo"
android:label="@string/service_name">
<intent-filter>
<action android:name="ru.evotor.devices.drivers.DriverManager" />
</intent-filter>
<meta-data
android:name="vendor_name"
android:value="SHTRIH-M" />
<meta-data
android:name="model_name"
android:value="SHTRIH-T" />
<meta-data
android:name="usb_device"
android:value="VID_1659PID_8963" />
<meta-data
android:name="settings_activity"
android:value="" />
<meta-data
android:name="device_categories"
android:value="OTHER" />
</service>
Где:
vendor_name
– наименование производителя, которое будет отображаться при подключении устройства.
model_name
– наименование модели устройства.
INTENT_FILTER_DRIVER_MANAGER
– используется для драйверов, требующих подключения USB-оборудования. Помимо Intent filter
в meta-data
необходимо указать характеристики VendorID
и ProductID
целевого устройства:
<meta-data
android:name="usb_device"
android:value="VID_1659PID_8963" />
VendorID
и ProductID
необходимо указывать десятичными числами.Можно указать несколько устройств: VID_1659PID_8963|VID_123PID_456|VID_1659PID_8964
.
Экземпляр драйвера будет автоматически создан/удалён при подключении/отключении указанного оборудования к смарт-терминалу. При наличии нескольких подходящих драйверов, пользователю будет предложен выбор.
Если ваше устройство не относится к заданным категориям, используйте Intent filter
:
INTENT_FILTER_OTHER
Вместе с этим необходимо указать в meta-data категорию устройства:
<meta-data
android:name="device_categories"
android:value="OTHER" />
Только ваше приложение получит разрешение (permission
) для работы с подключённым оборудованием.
SCALES|PRICEPRINTER|CASHDRAWER|OTHER
(весы | принтер чеков | денежный ящик | другое оборудование).Укажите в манифесте приложения у сервиса:
android:icon
– картинка устройства, которая будет отображаться пользователю при инициализации устройства;
android:label
– имя драйвера, которое будет отображаться пользователю при инициализации устройства
Можно задать activity
настроек:
<meta-data
android:name="settings_activity"
android:value="ru.mycompany.drivers.MySettingsActivity" />
Указанная activity
должна находиться в текущем package
и будет вызвана при первом подключении устройства или при выборе устройства в меню настроек оборудования.
Версия драйвера (versionCode
и versionName
) берётся из build.gradle
:
defaultConfig {
applicationId "ru.mycompany.drivers.mydevice"
minSdkVersion 23
targetSdkVersion 24
versionCode 2
versionName "1.0.1"
}
В реализации метода подключения к сервису для всех action
, указанных в интент-фильтрах укажите соответствующие Binder’ы:
для INTENT_FILTER_DRIVER_MANAGER
- класс наследник ru.evotor.devices.drivers.IUsbDriverManagerService.Stub
;
Пример:
public class MyDeviceService extends Service {
private final Map<Integer, MyDevice> instances = new HashMap<>();
private volatile AtomicInteger newDeviceIndex = new AtomicInteger(0);
@Nullable
@Override
public IBinder onBind(Intent intent) {
String action = intent.getAction();
switch (action) {
case Constants.INTENT_FILTER_DRIVER_MANAGER:
return new MyDriverManagerStub(MyDeviceService.this);
default:
return null;
}
}
public int createNewDevice(UsbDevice usbDevice) {
int currentIndex = newDeviceIndex.getAndIncrement();
instances.put(currentIndex, new MyDevice(getApplicationContext(), usbDevice));
return currentIndex;
}
public MyDevice getMyDevice(int instanceId) {
return instances.get(instanceId);
}
public void destroy(int instanceId) {
getMyDevice(instanceId).destroy();
instances.remove(instanceId);
}
}
Если нельзя выполнить действие, используйте исключение (Exception
) одного из следующих типов:
BadParcelableException
;IllegalArgumentException
;IllegalStateException
;NullPointerException
;SecurityException
;NetworkOnMainThreadException
.Пример:
throw new IllegalStateException();
IUsbDriverManagerService.Stub
– класс для управления драйверами usb-устройств: подключение и отключение устройств происходят здесь. Требуется реализовать методы addUsbDevice
и destroy
.
import ru.evotor.devices.drivers.IUsbDriverManagerService;
public class MyDriverManagerStub extends IUsbDriverManagerService.Stub {
private MyDeviceService myDeviceService;
public MyDriverManagerStub(MyDeviceService myDeviceService) {
this.myDeviceService = myDeviceService;
}
@Override
public int addUsbDevice(UsbDevice usbDevice, String usbPortPath) throws RemoteException {
return myDeviceService.createNewDevice(usbDevice);
}
@Override
public void destroy(int instanceId) throws RemoteException {
myDeviceService.destroy(instanceId);
}
}
Метод addUsbDevice
в IUsbDriverManagerService
принимает на вход:
UsbDevice
, для которого он создан;
некоторый строковый идентификатор номера физического usb-порта для сохранения настроек оборудования и восстановления их после перезагрузки терминала. В этот момент у приложения-драйвера уже есть permission
для работы с этим устройством.
Метод addUsbDevice
возвращает номер экземпляра драйвера внутри приложения. По этому номеру будет происходить обращение к конкретному драйверу.
Метод destroy
в IUsbDriverManagerService
принимает на вход номер экземпляра драйвера. Вызов этого метода уведомляет об отключении от устройства. В этот момент у приложения-драйвера уже нет permission
для работы с этим устройством, само устройство уже может быть удалено из смарт-терминала.
Загрузите приложение на смарт-терминал, чтобы работать с драйвером.