Подключите Android USB аксессуар, когда экран выключен - PullRequest
0 голосов
/ 04 июня 2018

Информация о приложении

У меня есть приложение, которое может связываться с 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, если это поможет.

Сноски

  1. В сторону, это пишет в /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

  2. http://androidxref.com/7.0.0_r1/xref/frameworks/base/services/usb/java/com/android/server/usb/UsbSettingsManager.java#775

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

-

  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);
...