2016-10-19 37 views
1

私はUSB経由でウェブカメラにAndroidデバイスを接続しようとするプログラムを持っています。私はいくつかの問題、すなわち適切にデータを転送することに問題があります。私はbulkTransferを使用しようとしましたが、それが使用されていることの認識がないようです。私はhereのような私を助けるかもしれない例を見つけようとしていますが、彼らの構造は私のものより優れていると思われますが、負荷がかかってプログラムがクラッシュするたびに役立ちます。BulkTransfer&Android USB API

私のバイト宣言も間違っていると私は確信しています。どういうわけか私のデータをそこに転送するはずですが、どうしたらよいかわかりません。どのようにデータ転送の方法と私のコードを構造化する方法の面での助けに感謝します。

いくつかの宣言:オンに

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

作成:

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 
    } 

追加関連するコード:

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

答えて

0

の問題の一つは、エンドポイントを見つけることにあります。 endpoint0はタスクを制御するためのコードで、適切なINおよびOUTエンドポイントを見つける必要があります。

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

usbGotPermiDVCは、USB経由でアクセスする許可を得たデバイスです。