USB bulkTransfer between Android tablet and camera

USB bulkTransfer between Android tablet and cameraThe question about 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; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); text = (TextView) findViewById(R.id.txt); usbTest(); } private void usbTest() { UsbDevice device = (UsbDevice) getIntent().getParcelableExtra( UsbManager.EXTRA_DEVICE); if (device == null) text.setText("device null"); else 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 = deviceIterator.next(); 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() { @Override public void onReceive(Context context, Intent intent) { String action = intent.getAction(); if (UsbManager.ACTION_USB_DEVICE_DETACHED.equals(action)) { UsbDevice device = (UsbDevice) intent .getParcelableExtra(UsbManager.EXTRA_DEVICE); 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)); } } 

USB bulkTransfer between Android tablet and camera3 avaliable solutions to USB bulkTransfer between Android tablet and camera 

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.

USB bulkTransfer between Android tablet and camera

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.

USB bulkTransfer between Android tablet and camera

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 Comment