2012-12-20 8 views
17

Ich möchte Daten/Befehle zwischen einer Kamera und einem Android Tablet-Gerät mit der bulkTransfer-Funktion austauschen. Ich habe diese Aktivität geschrieben, aber die Methode bulkTransfer gibt -1 (Fehlerstatus) zurück. Warum gibt es den Fehler zurück?USB BulkTransfer zwischen Android Tablet und Kamera

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

} 
+0

Wurde das Gerät richtig nummeriert? Sie können keine Massenübertragungen mit Geräten durchführen, die am Endpunkt 0 sitzen. nur Kontrolltransfers. Daher müssen Sie das Gerät einer geeigneten Endpunktadresse zuweisen. –

Antwort

0

Ich vermute, dass Sie nicht richtig nach Schnittstelle und Endpunkt suchen.

siehe Erklärung unten.

Vorschlag: Testen Sie, ob der Endpunkt gültig ist, und versuchen Sie, ihn mit dem Gerätedeskriptor abzugleichen.


Eine Schnittstelle kann mehrere Einstellungen haben.

AFAIK, für Kamera, sollte ihre drei alternative Einstellung für die Kamera-Schnittstelle sein.

  • Null Bandbreite - keine Endpunkte innerhalb - die meisten möglicherweise alternative Einstellung 0
  • Isochronous (wenn die Kamera-Unterstützung it) - isochronen Endpunkt innerhalb
  • Masse - bulk Endpunkt innerhalb < - anstelle von Sie interessieren

(ich weiß nicht, die tatsächliche USB-Kamera-Spezifikation aber, sollte dies für alle Streaming-Protokoll über USB anwendbar sein (wie ich in Audio-Klasse))

Sie müssen nach der Einstellung "Bulk-Alternative" suchen und dann die Kommunikation auf dem Endpunkt ausführen.

0

Ich denke, diese Funktion nicht den richtigen Endpunkt

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

, die kommt von

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

vielleicht die USB-Schnittstelle nicht richtig ist passiert. Bitte überprüfen Sie, ob der Parameter 0 korrekt ist.

Verwandte Themen