【问题标题】:chrome.usb.openDevice null handle returnedchrome.usb.openDevice 空句柄返回
【发布时间】:2015-09-09 12:26:47
【问题描述】:

我正在使用 cordova-plugin-chrome-apps-usb 访问 USB 设备(指纹打印机阅读器)。

chrome.usb.getDevices() 正确返回连接到 Andriod 主机的 USB 设备(我得到了正确的 VendorId 和 ProductId)。

chrome.usb.openDevice() 返回 USB 设备的空设备句柄。

我追踪到 openDevice() 代码,发现这一步返回 msgs = "62 F09 ChromeUsb595160930 sPermission request not yet implemented"。这表明存在权限问题?

function androidExec(success, fail, service, action, args) {
if (bridgeSecret < 0) {
    // If we ever catch this firing, we'll need to queue up exec()s
    // and fire them once we get a secret. For now, I don't think
    // it's possible for exec() to be called since plugins are parsed but
    // not run until until after onNativeReady.
    throw new Error('exec() called without bridgeSecret');
}
// Set default bridge modes if they have not already been set.
// By default, we use the failsafe, since addJavascriptInterface breaks too often
if (jsToNativeBridgeMode === undefined) {
    androidExec.setJsToNativeBridgeMode(jsToNativeModes.JS_OBJECT);
}

// Process any ArrayBuffers in the args into a string.
for (var i = 0; i < args.length; i++) {
    if (utils.typeName(args[i]) == 'ArrayBuffer') {
        args[i] = base64.fromArrayBuffer(args[i]);
    }
}

var callbackId = service + cordova.callbackId++,
    argsJson = JSON.stringify(args);

if (success || fail) {
    cordova.callbacks[callbackId] = {success:success, fail:fail};
}

var msgs = nativeApiProvider.get().exec(bridgeSecret, service, action, callbackId, argsJson);
// If argsJson was received by Java as null, try again with the PROMPT bridge mode.
// This happens in rare circumstances, such as when certain Unicode characters are passed over the bridge on a Galaxy S2.  See CB-2666.
if (jsToNativeBridgeMode == jsToNativeModes.JS_OBJECT && msgs === "@Null arguments.") {
    androidExec.setJsToNativeBridgeMode(jsToNativeModes.PROMPT);
    androidExec(success, fail, service, action, args);
    androidExec.setJsToNativeBridgeMode(jsToNativeModes.JS_OBJECT);
} else if (msgs) {
    messagesFromNative.push(msgs);
    // Always process async to avoid exceptions messing up stack.
    nextTick(processMessages);
}

AndroidManifest.xml 包含以下权限:-

<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
<uses-feature android:name="android.hardware.usb.host"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.USE_FINGERPRINT"/>
<uses-permission android:name="android.permission.MANAGE_USB"/>

我错过了一个相关的吗?

【问题讨论】:

    标签: android cordova google-chrome


    【解决方案1】:

    您使用的是哪个版本的 Android? Cordova 还不支持 Android M 的新权限模型,所以这是一个可能的问题。

    【讨论】:

    • 我使用的是 4.4 KitKat。我尝试使用权限 USE_FINGERPRINT 和 MANAGE_USB(如我的示例所示) - 但这只是一个猜测,因为似乎没有其他合适的东西。我应该使用什么?
    【解决方案2】:

    你正在点击这个 TODO:

    if (!mUsbManager.hasPermission(usbDev)) {
      // TODO: Implement dynamic permission request.
      throw new UsbError("Permission request not yet implemented");
    }
    

    在实现之前,您需要按照Android SDK,在 APK 清单中为您要打开的设备的特定 VID/PID 静态分配权限。

    即在 AndroidManifest.xml 中放这样的东西

    <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/usb_device_filter" />
    

    并添加相应的res/xml/usb_device_filter.xml

    <?xml version="1.0" encoding="utf-8"?>
    <resources>
      <usb-device vendor-id="6353" product-id="1234" />
    </resources>
    

    显然将 6353 和 1234 替换为您的 VID 和 PID 的十进制编码,与普通 Chrome 应用程序 manifest.json 中的“usbDevices”字段中使用的相同。 (理想情况下,清单 xml 行将由 CCA 工具链根据提供的 manifest.json 自动生成。)

    【讨论】:

    • 谢谢 - 成功了!
    猜你喜欢
    • 1970-01-01
    • 2011-12-20
    • 1970-01-01
    • 2017-06-19
    • 1970-01-01
    • 2018-09-01
    • 2013-04-24
    • 2010-12-10
    • 1970-01-01
    相关资源
    最近更新 更多