5

我知道如何做以下事情:

  • 监听 USB 设备的附加和分离事件
  • 获取所有连接的设备
  • 获取设备权限

所以最后我有一个UsbDevice并且我有权读/写它。从这里开始怎么走?

我可以打开设备并获得FileDescriptor如下信息:

 UsbManager manager = (UsbManager) activity.getSystemService(Context.USB_SERVICE);
 UsbInterface intf = device.getInterface(0);
 UsbEndpoint endpoint = intf.getEndpoint(0);
 UsbDeviceConnection connection = manager.openDevice(device);
 boolean interfaceClaimed = connection.claimInterface(intf, true);
 int fileDescriptor = connection.getFileDescriptor();

我现在该如何处理FileDescriptor?或者我还能如何访问 USB 设备上的文件?

编辑

  • android < 6 的解决方案:不要打开 aUsbDeviceConnection并尝试查找 USB 设备路径。尽管如此,您仍然无法区分多个USB设备并且不知道哪个路径属于哪个设备......

  • android >= 6 的解决方案:使用存储访问框架,实际上我还不知道它是如何工作的......

4

1 回答 1

2

因为我和你一样难过,所以我会走使用ls命令的路线。

代码示例:

try {
    Process process = Runtime.getRuntime().exec("ls /storage/UsbDriveA");
    BufferedReader in = new BufferedReader(new InputStreamReader(process.getInputStream()));
    String listOfFiles = "";
    String line;
    while ((line = buffer.readLine()) != null) {
      listOfFiles += line;
    }
} catch (InterruptedException e) {
    e.printStackTrace();
}

lsno such file or directory如果挂载点不正确,将返回。

以下是制造商使用的许多安装点的列表:

/storage/UsbDriveA     (all Samsung devices)
/storage/USBstorage1   (LG G4, V10, G3, G2, other LG devices)
/storage/usbdisk       (Moto Maxx, Turbo 2, Moto X Pure, other Motorola devices)
/storage/usbotg        (Sony Xperia devices, Lenovo Tabs)
/storage/UDiskA        (Oppo devices)
/storage/usb-storage   (Acer Iconia Tabs)
/storage/usbcard       (Dell Venue -- Vanilla Android 4.3 tablet)
/storage/usb           (HTC One M7, and some Vanilla Android devices)

(基于我收集的设备和其他 3 个人的设备,以及快速前往 Bestbuy 以测试最新的旗舰产品。我知道我缺少的唯一流行设备是位于中国的 Hawuei/Xioami 设备,它们在英国国家越来越流行,但他们很可能使用上述之一。)

要找到正确的挂载点,您将使用下一个挂载点侦听no such file or directory并循环/重新执行该exec()语句。

完成所有这些后,您可以使用重定向轻松读取文件cat /storage/.../file.txt并使用重定向进行写入:echo test > /storage/.../file.txt

希望这可以帮助

于 2016-02-05T13:12:17.063 回答