java – 在Android平板電腦和相機之間的USB bulkTransfer
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)); } }
我懷疑你沒有正確地搜尋介面和端點.
見下面的說明.
建議:測試端點是否有效,並嘗試將其與裝置描述符進行匹配.
一個介面可以有多個設定.
AFAIK,對於相機,他們應該是相機介面的三個替代設定.
>零頻寬 – 內部沒有端點 – 最可能的替代設定0
>同步(如果相機支援它) – 等時端點在裡面
>批量 – 您感興趣的地方內的批量端點
(我不知道實際的USB相機規格,但是這應該適用於所有通過USB的流式傳輸協議(正如我在Audio Class中看到的)
您需要搜尋批量交替設定,然後在其中的端點上執行通訊.
http://stackoverflow.com/questions/13982264/usb-bulktransfer-between-android-tablet-and-camera