Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

File I/O on a mounted USB storage device in USB Host mode (Android 3.1 and up)

Ok, so I have a Android 3.1 tablet (Acer Iconia Tab, which is great by the way) which I can use with Android USB API to connect with a USB Mass Storage Device (a simple USB memory stick).

I use USB Host mode, find the device, get permission to connect to it (using BroadcastReceiver). All works great. The problem is that I don't know exactly what to do in order to copy a file from the External Storage Directory to the USB memory stick.

This is what I have so far:

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

I read the documentation on the Android Dev Usb Host but it's not very explicit and I found a pretty good tutorial Android Usb Host Tutorial - AdbTest but it uses asynchronous communication.

I just want to know how should I set up the connection and use the endpoint (I didn't get the endpoint part, why they are needed) to just be able to create a new file on the USB storage device and copy contents of a different file in there, probably using bulkTransfer() method.

Any hints or pointers to more explicit documentation would be greatly appreciated.

Thank you

like image 481
Bandreid Avatar asked Sep 10 '11 12:09

Bandreid


People also ask

What is USB host in Android?

In USB host mode, the Android-powered device acts as the host. Examples of devices include digital cameras, keyboards, mice, and game controllers. USB devices that are designed for a wide range of applications and environments can still interact with Android applications that can correctly communicate with the device.


1 Answers

The Android USB host APIs provide only raw USB access. To access files on a memory device, your app must itself implement USB Mass Storage Mode on top of the USB Apis, and then the code of a filesystem on top of that.

A few vendor-customized versions of Android will mount a USB mass storage device with a recognized file system at operation system level, but that is not currently part of standard android. It is also possible that if you have a rooted device you may be able to use that to convince the kernel to mount such a filesystem.

like image 67
Chris Stratton Avatar answered Nov 04 '22 08:11

Chris Stratton