屏幕关闭时连接Android USB附件

时间:2018-06-04 14:24:06

标签: android usb accessory

申请信息

我有一个能够在屏幕打开时与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配件时,屏幕会亮起并显示“向上滑动”
  • 直到我在屏幕上向上滑动后才会弹出我的活动
  • 如果我从未在屏幕上滑动并尝试调用enable(),我会在“无法打开配件”时出现故障
    • 即,设备能够正常打开,并且存在权限。但它在尝试时实际上无法写入配件。

修复了向上滑动屏幕失败

我找到了解决第一个问题的方法。我能够做的是每当我检测到USB充电器存在时就打开活动[3]。现在发生以下情况:

  • 我首先安装带有USB插头的应用程序
  • 我关闭了屏幕
  • 我插入USB设备
  • 弹出活动
  • 弹出第二个活动。我相信弹出的第二个活动是Android系统因USB连接事件打开弹出窗口[2]
  • 我调用enable(),写入成功。

引脚锁定失败

但是,当我在手机上设置了针脚时,此修复程序无效。现在发生以下情况:

  • 我首先安装USB拔下的应用程序。
  • 我关闭了屏幕
  • 我插入USB设备
  • 弹出活动
  • 第二个活动弹出
  • 我尝试调用enable(),写入失败。

最终问题

当我的Android手机关机并设置了针脚时,如何连接USB设备?如果有帮助的话,我有根。

脚注

  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. 我在活动的onCreate中放入以下内容,以便在屏幕关闭时显示:

  4. -

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

0 个答案:

没有答案