java - USB bulkTransfer between Android tablet and camera

I would like to exchange data/commands between a camera and an Android tablet device using the bulkTransfer function. I wrote this Activity, but the method bulkTransfer returns -1 (error status). Why does it return the error?

public class MainActivity extends Activity {

    private TextView text;
    private int TIMEOUT = 1000;

    protected void onCreate(Bundle savedInstanceState) {
        text = (TextView) findViewById(;

    private void usbTest() {
        UsbDevice device = (UsbDevice) getIntent().getParcelableExtra(
        if (device == null)
            text.setText("device null");
            text.setText("device not null");

        UsbManager manager = (UsbManager) getSystemService(Context.USB_SERVICE);
        HashMap<String, UsbDevice> deviceList = manager.getDeviceList();
        text.setText(text.getText() + "\nDevices connected: "
                     + deviceList.values().size());
        Iterator<UsbDevice> deviceIterator = deviceList.values().iterator();

        while (deviceIterator.hasNext()) {
            device =;
            text.setText(text.getText() + "\nDevice name: "
                         + device.getDeviceName());
            text.setText(text.getText() + "\nDevice protocol: "
                         + device.getDeviceProtocol());
            text.setText(text.getText() + "\nDevice id: "
                         + device.getDeviceId());
            text.setText(text.getText() + "\nDevice product id: "
                         + device.getProductId());
            text.setText(text.getText() + "\nDevice vendor id: "
                         + device.getVendorId());
            text.setText(text.getText() + "\nDevice class: "
                         + device.getDeviceClass());
            text.setText(text.getText() + "\nDevice subclass: "
                         + device.getDeviceSubclass());
            text.setText(text.getText() + "\nDevice interface count: "
                         + device.getInterfaceCount());
            text.setText(text.getText() + "\n\n");

        // communicate with device
        UsbInterface intf = device.getInterface(0);
        UsbEndpoint endpoint = intf.getEndpoint(0);
        UsbDeviceConnection connection = manager.openDevice(device);
        connection.claimInterface(intf, true);

        for (int i = 0; i < intf.getEndpointCount(); i++) {
            UsbEndpoint ep = intf.getEndpoint(i);
            if (ep.getType() == UsbConstants.USB_ENDPOINT_XFER_BULK) {
                if (ep.getDirection() == UsbConstants.USB_DIR_OUT) {
                    endpoint = ep;
                    text.setText("Found: "+i);

        // byte[] opensession = { 0x0C, 0x00, 0x00, 0x00, 0x01, 0x00, 0x02,
        // 0x10,
        // 0x00, 0x00, 0x00, 0x00 };
        // connection.bulkTransfer(endpoint, opensession, opensession.length,
        // TIMEOUT);

        byte[] getEvent = { 0x0C, 0x00, 0x00, 0x00, 0x01, 0x00, toByte(0xC7),
            toByte(0x90), 0x00, 0x00, 0x00, 0x00 };
        int status = connection.bulkTransfer(endpoint, getEvent,
                                             getEvent.length, TIMEOUT);
        //text.setText("Status: " + status);

        byte[] capture = { 0x14, 0x00, 0x00, 0x00, 0x10, 0x00, 0x0E, 0x10,
            0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
            0x00, 0x00 };
        connection.bulkTransfer(endpoint, capture, capture.length, TIMEOUT);

        // teminate communication
        BroadcastReceiver mUsbReceiver = new BroadcastReceiver() {
            public void onReceive(Context context, Intent intent) {
                String action = intent.getAction();
                if (UsbManager.ACTION_USB_DEVICE_DETACHED.equals(action)) {
                    UsbDevice device = (UsbDevice) intent
                    if (device != null) {
                        // call your method that cleans up and closes
                        // communication with the device


    public static byte toByte(int c) {
        return (byte) (c <= 0x7f ? c : ((c % 0x80) - 0x80));


3 Answers

  1. Aaron- Reply


    I suspect you are not correctly searching for interface and endpoint.

    see explanation below.

    Suggestion: test if the endpoint if it is valid and try to match it with device descriptor.

    a interface can have multiple setting.

    AFAIK, for camera, their should be three alternate setting for the camera interface.

    • Zero Bandwidth -- no endpoints inside -- most possibly alternate setting 0
    • Isochronous (if the camera support it) -- isochronous endpoint inside
    • Bulk -- bulk endpoint inside <-- place of you interest

    (I dont know the actual USB camera specification but, this should be applicable to all streaming protocol over USB (as i see in Audio Class))

    You need to search for the bulk alternate setting and then perform communication on the endpoint inside it.

  2. Aaron- Reply


    I think this function is not passing the correct endpoint

    int status = connection.bulkTransfer(endpoint, getEvent,
                                         getEvent.length, TIMEOUT);

    which is coming from

    UsbInterface intf = device.getInterface(0);
    UsbEndpoint endpoint = intf.getEndpoint(0);

    maybe the USB interface is not correct. Please check if index 0 parameter is correct.

  3. Abel- Reply


    Check usb endpoint direction. I've encountered some devices where USB_DIR_OUT was USB_DIR_IN and USB_DIR_IN was USB_DIR_OUT and it was causing some issues.

Leave a Reply

Your email address will not be published. Required fields are marked *

You can use these HTML tags and attributes <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>