2012-10-15 7 views
3

j'ai besoin de lire le fichier à partir du lecteur de stylo, mon code est le suivant:Lire les données stylo lecteur via le mode hôte USB Android

private static final String ACTION_USB_PERMISSION = "android.hardware.usb.action.USB_ACCESSORY_ATTACHED"; 

private final BroadcastReceiver mUsbReceiver = new BroadcastReceiver() { 
    @Override 
    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(
         UsbManager.EXTRA_PERMISSION_GRANTED, false)) { 
        if (device != null) { 
         // call method to set up device communication 
        } 
       } else { 
        Log.d(TAG, "permission denied for device " + device); 
       } 
      } 
     } 
    } 
}; 

Pour détecter appareil j'utilise:

mgr = (UsbManager) getSystemService(Context.USB_SERVICE); 
devs = new HashMap<String, UsbDevice>(); 
devs = mgr.getDeviceList(); 

Et après obtenir l'appareil et l'interface, je reçois point final comme suit:

public void getEndpointCount(View v) { 
    itf = value.getInterface(0); 
    endPointCount = itf.getEndpointCount(); 

    AlertDialog.Builder builder = new AlertDialog.Builder(this); 
    builder.setMessage("No. of Endpoints: " + endPointCount) 
      .setTitle("Endpoint Count").setCancelable(true) 
      .setPositiveButton("OK", new DialogInterface.OnClickListener() { 
       public void onClick(DialogInterface dialog, int id) { 
        dialog.cancel(); 
       } 
      }); 
    AlertDialog alert = builder.create(); 
    alert.show(); 
    ((Button) findViewById(R.id.button4)).setEnabled(true); 
} 

public void getEndpointDirections(View v) { 
    endPoint = null; 


    UsbDeviceConnection conn = null; 

    if (mgr.hasPermission(value)) { 
     conn = mgr.openDevice(value); 
     conn.claimInterface(itf, true); 
    } 

    String str = null; 
    for (int i = 0; i < endPointCount; i++) { 
     ((TextView) findViewById(R.id.tvLoopVal)).setText("" + i); 
     endPoint = itf.getEndpoint(i); 
     str = str + " Endpoint: " + i + " - " + endPoint.getDirection() 
       + "\n"; 

if (endPoint.getType() == UsbConstants.USB_ENDPOINT_XFER_BULK) { 
      ((TextView) findViewById(R.id.tvLoopVal)).setText("" + (i - 1)); 
      if (endPoint.getDirection() == UsbConstants.USB_DIR_IN) { 
       Toast.makeText(this, "epin", Toast.LENGTH_SHORT).show(); 
       epIn = endPoint; 
      } else { 
       epOut = endPoint; 
       Toast.makeText(this, "epout", Toast.LENGTH_SHORT).show(); 
      } 
     } 

    } 

    AlertDialog.Builder builder = new AlertDialog.Builder(this); 
    builder.setMessage(
      str + " Mac packet Size = " + endPointUsed.getMaxPacketSize()) 
      .setTitle("Endpoints Directions").setCancelable(true) 
      .setPositiveButton("OK", new DialogInterface.OnClickListener() { 
       public void onClick(DialogInterface dialog, int id) { 
        dialog.cancel(); 
       } 
      }); 
    AlertDialog alert = builder.create(); 
    alert.show(); 

} 

a la fin je reçois le point final maintenant où je suis coincé est ce qui est le nex t étape pour lire ou écrire les données sur la clé USB. Je ne comprends rien à cela et j'ai besoin de conseils pour savoir où regarder maintenant.

De plus, si je ne connecte pas de périphérique USB à ma tablette, il est toujours indiqué 1 périphérique trouvé et lorsque je connecte la clé USB à un câble OTG, 2 périphériques sont détectés !! C'est aussi étrange

EDIT:

Je demande initialisés aussi en utilisant la méthode de demande USB mais je ne comprends pas comment cela fonctionne

public void initializeRequest(View v) { 
    UsbRequest uReq = new UsbRequest(); 
    Toast.makeText(this, "" + uReq.initialize(conn, epIn), 
      Toast.LENGTH_SHORT).show(); 
    AlertDialog.Builder builder = new AlertDialog.Builder(this); 
    builder.setMessage(
      " Is Request Initialized: = " + uReq.initialize(conn, epIn)) 
      .setTitle("Request Initialization").setCancelable(true) 
      .setPositiveButton("OK", new DialogInterface.OnClickListener() { 
       public void onClick(DialogInterface dialog, int id) { 
        dialog.cancel(); 
       } 
      }); 
    AlertDialog alert = builder.create(); 
    alert.show(); 
    byte[] bb = new String("Hello").getBytes(); 
    ByteBuffer bBuffer = ByteBuffer.allocate(5); 
    // bBuffer.put(bb); 
    uReq.queue(bBuffer, 5); 

    UsbRequest request = conn.requestWait(); 
    // Object obj = uReq.getClientData(); 
    // Log.v("Client Data", "" + obj.toString()); 
    if (request != null) { 
     Toast.makeText(this, "Not null request", Toast.LENGTH_SHORT).show(); 
     Log.v("Response of request wait", "" 
       + request.getClientData().toString()); 
     request.close(); 
    } 
    uReq.close(); 

    // Log.v("Response of request wait", "" + conn.requestWait()); 
    // uReq.close(); 
} 

je vérifié que les paramètres sont s'assignés, mais quand cette méthode est exécuté l'application attend simplement, ne fait rien. Après quelque temps Android demande de fermer l'application. Est-ce que c'est parce que l'application function requestWait() attend un type d'événement?

EDIT

D'accord, si l'on oublie la lecture du lecteur de stylo et tout simplement besoin d'obtenir le flux audio à partir d'un périphérique USB, permet de dire microphone où je ne vais pas lire tout ce que je vais prendre tout ce que le micro donnera, alors encore je dois faire quelque chose d'autre alors ce que j'ai fait ici ??

Répondre

1

Il ne semble pas que vous soyez en train de lire des données. Si vous avez un EndPoint allant de l'appareil à l'hôte, vous devriez pouvoir lire les données avec la méthode bulkTransfer.

Je ne suis pas très familier avec la communication USB de bas niveau, mais je suppose que vous devez gérer vous-même l'analyse du système de fichiers. Si vous lisez le premier secteur (512 octets) sur le lecteur et les deux derniers octets de ce secteur sont 0x55,0xAA le lecteur est probablement formaté avec un système de fichiers FAT, et vous devrez travailler votre chemin à partir de là.

+0

Que suis-je en train de faire est d'avoir une webcam USB connecté au téléphone android et obtenir la vidéo à partir la caméra. Pourquoi est-ce que j'essaie de lire la clé USB est de comprendre comment les périphériques USB communiquent avec le périphérique Android. Je ne sais pas par où commencer la forme sauf la classe usbhost d'android.et à ce stade, je ne vois aucun moyen d'avancer – Calvin

+0

Avez-vous essayé d'énumérer les points de terminaison et d'utiliser un UsbDeviceConnection pour lire les données à partir d'un point de terminaison approprié? – Michael

+0

yup j'ai écrit ce code en question – Calvin

0

Puisqu'il n'y avait aucune réponse acceptée, je posterai le mien.

Il existe une bibliothèque open source appelée libaums qui implémente le mode de stockage de masse usb (UMS) pour Android ainsi que le système de fichiers Fat32. Vous pouvez utiliser cette bibliothèque dans votre application Android pour lire/écrire des fichiers à partir de périphériques USB. La bibliothèque poignée communication de bas niveau avec le périphérique USB ..

https://github.com/magnusja/libaums

de base Exemple:

UsbMassStorageDevice[] devices = UsbMassStorageDevice.getMassStorageDevices(this /* Context or Activity */); 

for(UsbMassStorageDevice device: devices) { 

    // before interacting with a device you need to call init()! 
    device.init(); 

    // Only uses the first partition on the device 
    FileSystem currentFs = device.getPartitions().get(0).getFileSystem(); 
    Log.d(TAG, "Capacity: " + currentFs.getCapacity()); 
    Log.d(TAG, "Occupied Space: " + currentFs.getOccupiedSpace()); 
    Log.d(TAG, "Free Space: " + currentFs.getFreeSpace()); 
    Log.d(TAG, "Chunk size: " + currentFs.getChunkSize()); 
} 
Questions connexes