在USB主机模式下安装的USB存储设备上的文件I/O(Android 3.1及更高版本)

Ban*_*eid 9 usb file-io android

好的,所以我有一个Android 3.1平板电脑(Acer Iconia Tab,顺便说一句,这很棒)我可以使用Android USB API连接USB大容量存储设备(一个简单的USB记忆棒).

我使用USB主机模式,找到设备,获得连接它的权限(使用BroadcastReceiver).一切都很棒.问题是我不知道该怎么做才能将文件从外部存储目录复制到USB记忆棒.

这是我到目前为止:

final BroadcastReceiver mUsbReceiver = new BroadcastReceiver() {
    public void onReceive(Context context, Intent intent) {
        String action = intent.getAction();
        if (ACTION_USB_PERMISSION.equals(action)) {
            synchronized (this) {
            UsbDevice device = (UsbDevice) intent.getParcelableExtra(UsbManager.EXTRA_DEVICE);

            if (intent.getBooleanExtra(UsbManager.EXTRA_PERMISSION_GRANTED, false)) {
                if (device != null) {

                    // Got to a point where I should set up connection
                    // I'm setting up a very simple connection, just want some file transfer

                    UsbInterface intf = device.getInterface(0);
                    UsbEndpoint endpoint = intf.getEndpoint(0);
                    UsbDeviceConnection connection = UsbManager.openDevice(device);

                    if (connection.claimInterface(intf, true)) {
                        UtilsAndDialogs.print(getApplicationContext(), "Connected to device");

                        // Copy file to USB...

                    } else
                        UtilsAndDialogs.print(getApplicationContext(), "Could not connect!");
                }
            } else {
                UtilsAndDialogs.print(getApplicationContext(), "Permission denied");
                Log.d(UtilsAndDialogs.LOG_TAG, "Permission denied for device " + device);
            }
        }
    } 
};
Run Code Online (Sandbox Code Playgroud)

我阅读了Android Dev Usb主机上的文档,但它不是很明确,我找到了一个非常好的教程Android Usb主机教程 - AdbTest,但它使用异步通信.

我只想知道如何设置连接并使用端点(我没有得到端点部分,为什么需要它们)才能在USB存储设备上创建新文件并复制内容那里有不同的文件,可能使用bulkTransfer()方法.

任何提示或指向更明确的文档将不胜感激.

谢谢

Chr*_*ton 5

Android USB 主机 API 仅提供原始 USB 访问。要访问存储设备上的文件,您的应用程序本身必须在 USB API 之上实现 USB 大容量存储模式,然后在其之上实现文件系统的代码。

一些供应商定制的 Android 版本会在操作系统级别挂载具有可识别文件系统的 USB 大容量存储设备,但这目前不是标准 android 的一部分。也有可能如果你有一个 root 设备,你可以使用它来说服内核挂载这样的文件系统。


小智 1

您的连接已建立,端点基本上是设备上带有数据传输信息的标志。

对于你的棍子,你需要做类似 VV 的事情来弄清楚你有多少个端点,

UsbInterface intf = device.getInterface(0);
// checks for 2 endpoints
if (intf.getEndpointCount() != 2) {
Toast toast = Toast.makeText(context, "could not find endpoint", duration);
toast.show();
return;
    }
UsbEndpoint ep = intf.getEndpoint(0);
if (ep.getType() == UsbConstants.USB_ENDPOINT_XFER_BULK) {
if (ep.getDirection() == UsbConstants.USB_DIR_OUT) {
Run Code Online (Sandbox Code Playgroud)

这将让您弄清楚您感兴趣的端点是否是批量端点(usb 常量文档有其他类型)以及您是否可以向该端点的设备发送数据或从该端点的设备发送数据(用于测试 in 的 usb_dir_in )。您想要的端点是特定于设备的,我的示例从 0 开始,您的会有所不同

要重新保存文件,您需要执行类似的操作

mConnection.bulkTransfer(mEndpointOut, bytes, 512, TIMEOUT);
Run Code Online (Sandbox Code Playgroud)

每次缓冲区填充文件输出流时,我都会保存缓冲区,这可能效率低下(因为我假设批量传输已经保存在某处),但文档很少。

  • @AlikElzin-kilaka - 这个答案基本上是不完整的,因为它未能解决 **android USB 主机 api 仅支持原始访问**这一事实。文件系统级访问要求应用程序本身实现 USB 海量存储模式和其上的文件系统。 (3认同)