2016-10-19 1 views
1

J'ai un programme dans lequel je tente de connecter mon appareil Android à une webcam via USB. J'ai des problèmes avec certaines choses, à savoir le transfert de données correctement. J'ai essayé d'utiliser bulkTransfer et il semble n'y avoir aucune reconnaissance de son utilisation. J'ai essayé de trouver des exemples qui peuvent m'aider tels que here mais aucun ne m'aide - leur structure semble être meilleure que la mienne mais chaque fois que je commute mon programme tombe en panne. Je suis assez confiant que ma déclaration d'octets est également incorrecte et je devrais être en quelque sorte en train de transférer mes données, mais je ne sais pas comment. Toute aide en termes de transfert de données et de structuration de mon code serait appréciée.BulkTransfer & Android API USB

Quelques déclarations:

private byte[] bytes = {1,2}; 
private static int TIMEOUT = 0; 
private boolean forceClaim = true; 

Dans Sur Créer:

UsbDevice device = (UsbDevice) getIntent().getParcelableExtra(UsbManager.EXTRA_DEVICE); 
    UsbManager mUsbManager = (UsbManager) getSystemService(Context.USB_SERVICE); 
    HashMap<String, UsbDevice> deviceList = mUsbManager.getDeviceList(); 
    Iterator<UsbDevice> deviceIterator = deviceList.values().iterator(); 
    while(deviceIterator.hasNext()) { 
     device = deviceIterator.next(); 
     PendingIntent mPermissionIntent = PendingIntent.getBroadcast(this,0,new Intent(ACTION_USB_PERMISSION), 0); 
     IntentFilter filter = new IntentFilter(ACTION_USB_PERMISSION); 
     registerReceiver(mUsbReceiver, filter); 
     mUsbManager.requestPermission(device, mPermissionIntent); 
     UsbDeviceConnection connection = mUsbManager.openDevice(device); 
     Log.d("CAM Connection", " " + connection); 
     Log.d("CAM UsbManager", " " + mUsbManager); 
     Log.d("CAM Device", " " + device); 



     UsbInterface intf = device.getInterface(0); 
     Log.d("CAM_INTF Interface!!!!", " " + intf); 
     UsbEndpoint endpoint = intf.getEndpoint(0); 
     Log.d("CAM_END Endpoint", " " + endpoint); 

     connection.claimInterface(intf, forceClaim); 
     StringBuilder sb = new StringBuilder(); 
     if(connection.bulkTransfer(endpoint,bytes,bytes.length,TIMEOUT) < 2) 
      Log.d("test", ""); 
     //Log.d("BULK", ""+ connection.bulkTransfer(endpoint, bytes, bytes.length, TIMEOUT)); //do in another thread 
    } 

code correspondant supplémentaires:

private 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(EXTRA_PERMISSION_GRANTED, false)) { 
        if(device != null){ 



         //call method to set up device communication 
        } 
       } 
       else { 
        Log.d("Deny:", "permission denied for device " + device); 
       } 
      } 
     } 
    } 
}; 

Répondre

0

l'un de votre problème est de trouver des points d'extrémité. endpoint0 est pour contrôler la tâche et vous devriez trouver les points de terminaison IN et OUT appropriés dans votre code.

UsbInterface usbInterfaceTemp = null; 
     usbInterface = null; 
     endpointIN = null; 
     endpointOUT = null; 
     for (int i = 0; i < usbGotPermiDVC.getInterfaceCount(); i++) { 

      usbInterfaceTemp = usbGotPermiDVC.getInterface(i); 
      if (usbInterfaceTemp.getEndpointCount() >= 2) { 

       for (int j = 0; j < usbInterfaceTemp.getEndpointCount(); j++) { 

        UsbEndpoint usbEndpointTemp = usbInterfaceTemp.getEndpoint(j); 

        if (usbEndpointTemp.getType() == UsbConstants.USB_ENDPOINT_XFER_BULK) { 

         if (usbEndpointTemp.getDirection() == UsbConstants.USB_DIR_IN) { 

          endpointIN = usbEndpointTemp; 

         } else if (usbEndpointTemp.getDirection() == UsbConstants.USB_DIR_OUT) { 

          endpointOUT = usbEndpointTemp; 

         } 
        } 
       } 
      } 
     } 

     if (endpointIN != null && endpointOUT != null) { 
      usbInterface = usbInterfaceTemp; 
     } 

     if (usbInterface == null) { 
      return; 
     } 


     usbDeviceConnection = usbManager.openDevice(usbSelectedDevice); 

     if (!(usbDeviceConnection != null && usbDeviceConnection.claimInterface(usbInterface, true))) { 
      usbDeviceConnection = null; 
      return; 
     } 

     usbDeviceConnection.controlTransfer(0x21, 34, 0, 0, null, 0, 0); 
     usbDeviceConnection.controlTransfer(0x21, 32, 0, 0, new byte[]{(byte) 0x80, 
       0x25, 0x00, 0x00, 0x00, 0x00, 0x08}, 7, 0); 

     Toast.makeText(getApplicationContext(), "Device opened and Interface claimed!", Toast.LENGTH_SHORT).show(); 

dans lequel usbGotPermiDVC est le dispositif qui a obtenu l'autorisation d'accéder via USB.