Информация о приложении
У меня есть приложение, которое может связываться с USB-аксессуаром, когда экран включен.
Первое, что я делаю после установки приложения, этовключите экран, а затем подключите USB-аксессуар.Я получаю сообщение «Открыть, когда подключен этот USB-аксессуар?».Кроме того, есть флажок «Использовать по умолчанию для этого USB-аксессуара».Я нажимаю флажок и нажимаю OK. [1]
Теперь, когда я подключаю USB-аксессуар, мое приложение выскакивает на передний план.Причина этого заключается в том, что в моем AndroidManifest.xml есть следующее:
<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" />
После этого я затем вызываю enable (), который определен здесь:
public boolean enable() {
UsbManager deviceManager = null;
UsbAccessory[] accessories = null;
UsbAccessory accessory = null;
deviceManager = (UsbManager) context
.getSystemService(Context.USB_SERVICE);
accessories = deviceManager.getAccessoryList();
accessory = accessories[0];
if (accessory == null) {
return false;
}
logDRemote("Accessory is " + accessory);
// If we have permission to access the accessory,
if (deviceManager.hasPermission(accessory)) {
parcelFileDescriptor = deviceManager
.openAccessory(accessory);
if (parcelFileDescriptor != null) {
logDRemote("descriptor is not null");
if(parcelFileDescriptor == null) {
logDRemote("parcelFileDescriptor == null");
return false;
}
outputStream = new FileOutputStream(
parcelFileDescriptor.getFileDescriptor());
if(outputStream == null) {
logDRemote( "outputStream == null");
return false;
}
logDRemote("outputStream open");
byte[] data = new byte[2];
data[0] = (byte) APP_CONNECT;
data[1] = 0;
try {
outputStream.write(data);
} catch (IOException e) {
logDRemote("Could not open accessory");
closeAccessory();
return RETURN_CODES.FILE_DESCRIPTOR_WOULD_NOT_OPEN;
}
return true;
} else {
return false;
}
} else {
return false;
}
}
КогдаЯ вызываю это после того, как активность появляется на переднем плане, я вызываю эту функцию, и она возвращает true
, показывая, что USB-устройство правильно связывается.
Сбой с пролистыванием экрана
Проблемаесли у меня выключен экран без PIN-кода, но мне нужно провести пальцем вверх, чтобы разблокировать телефон, происходит следующее:
- Когда я подключаю USB-аксессуар, экран включается и говорит "swipe up "
- Моя активность не появляется до тех пор, пока я не проведу вверх по экрану
- Если я никогда не проведу по экрану и не попытаюсь вызвать enable (), я получу ошибку" "Не удалось открыть аксессуар "
- То есть устройство может правильно открыться, и разрешения существуют.Но он просто не может написать на аксессуар, когда пытается.
Исправление сбоя экрана смахивания вверх
Я нашел способ исправить это первымвопрос.То, что я смог сделать, это открыть активность, когда я обнаружу, что USB-зарядное устройство присутствует [3].Теперь происходит следующее:
- Я начинаю с установки приложения с отключенным USB
- Я выключаю экран
- Я подключаю USB-устройство
- Активность всплывает
- Второе действие всплывает.Я полагаю, что второе действие всплывает, когда система Android открывает всплывающее окно в результате события USB-подключения [2]
- Я вызываю enable (), и запись завершается успешно.
Ошибка с блокировкой пин-кода
Однако это исправление не работает, если на телефоне установлен пин-код.Теперь происходит следующее:
- Я начинаю с установки приложения с отключенным USB.
- Я выключаю экран
- Я подключаю USB-устройство
- Всплывающее действие
- Второе действие не всплывающее
- Я пытаюсь вызвать enable (), и запись не удалась.
Последний вопрос
Как подключиться к USB-устройству, когда мой телефон Android выключен и установлен пин-код?У меня есть root, если это поможет.
Сноски
В сторону, это пишет в /data/system/users/0/usb_device_manager.xml
, как видно из источника здесь: http://androidxref.com/7.0.0_r1/xref/frameworks/base/services/usb/java/com/android/server/usb/UsbSettingsManager.java#mSettingsFile
http://androidxref.com/7.0.0_r1/xref/frameworks/base/services/usb/java/com/android/server/usb/UsbSettingsManager.java#775
Я добавляю следующее в Создание действия, чтобы оно могло отображаться при выключенном экране:
-
final Window win= getWindow();
win.addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED | WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD);
win.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON | WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON);