gpt4 book ai didi

java - 尝试访问USB设备时libusb_open_device_with_vid_pid失败

转载 作者:IT老高 更新时间:2023-10-28 21:01:55 33 4
gpt4 key购买 nike

我正在尝试使USB设备连接到Android 5.1.1设备。以前,我一直使用KitKat的常规libusb,但Lollipop增强了安全性,因此不再有效。

这是有据可查的,需要root设置SELinux级别。我不需要root设备来使USB设备连接到它。

环顾四周后,我遇到了this answer并尝试了this libusb fork,但是现在我遇到了一个新错误

libusb_open_device_with_vid_pid (29c2) failed.
Failed to setup USB
usb_setup: -1

我没有更改任何代码,只有库。

这仍然是权限问题,还是我缺少某些东西可以使这项工作正常进行?

最佳答案

以下步骤可用于解决您提到的问题。

将设备安装为USB大容量存储的过程不一致
跨设备和特定于制造商的产品。当您通过USB电缆将设备连接到台式机时,某些设备(例如Nexus S)会提供“打开USB存储设备”功能。其他设备(例如Galaxy S3)现在需要一个应用程序才能将设备作为大容量存储启动。无论哪种方式,Android设备通常都提供这种功能,并且您必须创建一个与设备制造商规范相匹配的文件。

在使用USB主机API之前,您需要添加到应用程序的 list 文件中:

  • 因为并非保证所有支持Android的设备都支持USB主机API,所以请包含一个元素,该元素声明您的应用程序使用android.hardware.usb.host功能。
  • 如果希望通知您的应用程序已连接的USB设备,请在主要 Activity 中为android.hardware.usb.action.USB_DEVICE_ATTACHED意图指定一个and元素对。

  • 将USB_DEVICE_ATTACHED添加到 list 文件中:
    <manifest ...>
    <uses-feature android:name="android.hardware.usb.host" />
    <uses-sdk android:minSdkVersion="12" />
    ...
    <application>
    <activity ...>
    ...
    <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" />
    </activity>
    </application>
    </manifest>

    为了帮助您的APP发现特定的USB设备,您可以使用意图过滤器:
    <activity ...>
    ...
    <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" />
    </activity>

    您还必须指定设备和供应商ID:
    <?xml version="1.0" encoding="utf-8"?>

    <resources>
    <usb-device vendor-id="1234" product-id="5678" />
    </resources>

    这应该足以处理您的 USB host连接。现在拨打USB:
    int LIBUSB_CALL libusb_open2(libusb_device *dev, libusb_device_handle **handle, int fd);

    使用描述符打开与 usb device的连接-例如:
    UsbManager myUsbManager = (UsbManager) 
    getSystemService(Context.USB_SERVICE);
    UsbAccessory myUsbAccessory = (myUsbManager.getAccessoryList())[0];
    ParcelFileDescriptor pfd = myUsbManager.openAccessory(myUsbAccessory);
    FileDescriptor fileDescriptor = pfd.getFileDescriptor();
    FileInputStream myFileInputStream = new FileInputStream(fileDescriptor);
    FileOutputStream myFileOutputStream = new FileOutputStream(fileDescriptor);

    如果您仍然对SELinux级别有疑问,可以在此处进行一些编辑,以使您的程序平稳运行:
    // default.prop
    ro.secure=1 -----------------> ro.secure=0
    ro.adb.secure=1 -----------------> ro.adb.secure=0

    //init.rc
    setsebool debugfs 1 --------> setsebool debugfs 0
    setenforce 0
    setprop selinux.reload_policy 1 -------> setprop selinux.reload_policy 0

    // init.target.rc
    setprop selinux.reload_policy 1 -----> setprop selinux.reload_policy 0

    由于 SELinux默认情况下设置为强制执行最高安全性,因此您想授予客户端通过USB访问您的Android设备的权限。

    根据您的Android品牌和型号,尝试拔下连接设备和台式机的USB电缆,然后将其重新插入。系统将提示您“打开USB”存储。如果是这种情况,请继续尝试在Android上浏览至“设置”→“更多...”,然后寻找USB大容量存储选项。

    enter image description here
    (来源: pocketables.com)

    或者,寻找设备制造商建议的USB大容量存储过程。当您打开USB存储设备时,设备会通知您某些应用将停止运行,然后继续操作即可。现在,移至台式计算机并浏览至USB大容量存储介质,如果尚未重命名,则通常称为NO NAME。单击大容量存储设备,然后在 footer 文件夹中找到一个名为data.tsv的文件。

    您也可以通过在您喜欢的文本编辑器中打开data.tsv来检查它。您会在其中找到两列,它们之间用制表符整齐地隔开;在每一行中,您都会找到一对整数值。这对于我们的项目而言已经足够了。更复杂的数据项目通常需要为每行指定唯一的标识符,一个表中的一行指向另一表中的特定记录。

    根据您的 development environment,您还必须相应地调整设置。如果您在Windows上进行开发,请按照USB驱动程序安装 instructions available进行操作。如果您是在Linux上进行开发,请按照 setting up您的设备进行开发的说明。

    此外,还值得一提的是,许多以前发布的Android驱动的设备只能充当USB设备,而无法启动与外部USB设备的连接。 Android Open Accessory(AOA)支持克服了此限制,并允许您通过允许附件启动 connection来构建可与各种Android驱动的设备进行交互的附件。在项目中可以找到Android Open Accessory的常见用法示例:使用 USB host mode录制和播放音频-当然,这需要启动并运行USB模式。

    将Android与 Arduino微 Controller 通过USB进行通信也是一种成功的实现方式,因为它允许您通过多设备解决方案方法扩展集成其他功能的Android功能。允许设备与Android USB通信的典型Arduino Sketch如下所示:
    // the USB Host libraries
    #include <Max3421e.h>
    #include <Usb.h>
    // the AOA library
    #include <AndroidAccessory.h>

    void setup();
    void loop();

    void setup()
    { // start serial debugging
    Serial.begin(115200);
    Serial.print("\r\nADK has run setup().");
    Serial.println("Ready to start USB communication...");
    }

    void loop()
    { // example - read the voltage from a sensor
    uint16_t val;
    val = analogRead(TEMP_SENSOR); // or any sort of input
    Serial.println(val,HEX);
    Serial.write(val);
    // Delay for 100 milliseconds.
    delay(100);
    }

    所有Arduino项目必须声明一个setup()和loop()方法,否则您的Android将无法正常通信。

    还请记住,使用AOA所需的最低要求的列表:
  • 与AOA兼容的Android设备。要在尝试本示例之前测试兼容性,请引用“支持的Android设备”部分,以获取指向Google Play上可用的Microchip AOA演示应用程序的链接。
  • 兼容的微 Controller 板。如果您不确定,Arduino Mega ADK将是一个简单的选择。


  • 使用USB的Android设备的可能性是惊人的,并且对能够充分利用此类功能的创新APP的需求将显着增长。

    关于java - 尝试访问USB设备时libusb_open_device_with_vid_pid失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30649589/

    33 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com