Предоставление разрешения работы с Usb устройством при обработке в сервисе Android
Есть необходимость обрабатывать данные USB устройства через сервис (foreground service). При первом запуске всплывает окно с разрешением использования этого USB устройства, нажимаем "ОК" и после этого, если закрыть приложение и оставить работать только сервис, все корректно отрабатывает. Но во время работы USB устройство должно периодически отключаться и через какое-то время опять выходить на связь. Сервис при этом не закрывается и ожидает появления USB устройства. Когда USB устройство появляется, то необходимо опять делать запрос на разрешение с работой USB устройства, то есть опять давать подтверждение через всплывающие окно. Вопрос в следующем, возможно ли как-то сохранить разрешение на работу с USB устройством, данное при первом запуске, чтобы не было необходимости при каждом подключении устройства давать разрешение ? В манифесте указан фильтр с устройствами
<service
android:name=".MainService"
android:enabled="true"
android:exported="true"
android:usesCleartextTraffic="true">
<intent-filter>
<action android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED" />
</intent-filter>
<meta-data
android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED"
android:resource="@xml/device_filter" />
</service>
device_filter
<?xml version="1.0" encoding="utf-8"?>
<resources>
<usb-device vendor-id="1027" product-id="24597"/>
</resources>
Инициализация USB устройства:
private val ACTION_USB_PERMISSION = "com.android.example.USB_PERMISSION"
...
val usbManager = context.getSystemService(Context.USB_SERVICE) as UsbManager
val usbDevice = usbManager.deviceList.values.iterator().next()
if (!usbManager.hasPermission(usbDevice)) {
val mPermissionIntent =
PendingIntent.getBroadcast(context, 0, Intent(ACTION_USB_PERMISSION), 0)
usbManager.requestPermission(usbDevice, mPermissionIntent)
}
val usbConnection = usbManager.openDevice(usbDevice)
serial = UsbSerialDevice.createUsbSerialDevice(usbDevice, usbConnection)
checkInitUSB = true
Встречал на форуме так же предположение, что разрешение не сохраняется в связи с разными идентификаторами при подключении. Действительно ли из-за этого, непонятно.
Ответы (1 шт):
Всё правильно, только в манифесте должно быть указано так:
<manifest ...>
<uses-feature android:name="android.hardware.usb.accessory" />
<uses-sdk android:minSdkVersion="<version>" />
...
<application>
<uses-library android:name="com.android.future.usb.accessory" />
<activity ...>
...
<intent-filter>
<action android:name="android.hardware.usb.action.USB_ACCESSORY_ATTACHED" />
</intent-filter>
<meta-data android:name="android.hardware.usb.action.USB_ACCESSORY_ATTACHED"
android:resource="@xml/accessory_filter" />
</activity>
</application>
источник https://developer.android.com/guide/topics/connectivity/usb/accessory#manifest-example