2011-09-10 4 views
9

Ok, j'ai donc une tablette Android 3.1 (Acer Iconia Tab, qui est géniale) que je peux utiliser avec Android API USB pour se connecter à un périphérique de stockage de masse USB (une simple clé USB).Fichier E/S sur un périphérique de stockage USB monté en mode hôte USB (Android 3.1 et versions ultérieures)

J'utilise le mode hôte USB, trouve le périphérique, obtiens l'autorisation de s'y connecter (en utilisant BroadcastReceiver). Tout fonctionne très bien. Le problème est que je ne sais pas exactement quoi faire pour copier un fichier du répertoire de stockage externe sur la clé USB.

C'est ce que j'ai jusqu'à présent:

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

        // Got to a point where I should set up connection 
        // I'm setting up a very simple connection, just want some file transfer 

        UsbInterface intf = device.getInterface(0); 
        UsbEndpoint endpoint = intf.getEndpoint(0); 
        UsbDeviceConnection connection = UsbManager.openDevice(device); 

        if (connection.claimInterface(intf, true)) { 
         UtilsAndDialogs.print(getApplicationContext(), "Connected to device"); 

         // Copy file to USB... 

        } else 
         UtilsAndDialogs.print(getApplicationContext(), "Could not connect!"); 
       } 
      } else { 
       UtilsAndDialogs.print(getApplicationContext(), "Permission denied"); 
       Log.d(UtilsAndDialogs.LOG_TAG, "Permission denied for device " + device); 
      } 
     } 
    } 
}; 

J'ai lu la documentation sur l'Android Dev Usb Host mais ce n'est pas très explicite et j'ai trouvé un très bon tutoriel Android Usb Host Tutorial - AdbTest mais il utilise la communication asynchrone. Je veux juste savoir comment dois-je configurer la connexion et utiliser le point de terminaison (je n'ai pas obtenu la partie de point de terminaison, pourquoi ils sont nécessaires) pour pouvoir créer un nouveau fichier sur le périphérique de stockage USB et Copiez le contenu d'un fichier différent, probablement en utilisant la méthode bulkTransfer(). Des conseils ou des indications sur une documentation plus explicite seraient grandement appréciés.

Merci

Répondre

1

Votre connexion est établie, les points d'extrémité sont essentiellement des drapeaux sur l'appareil avec des informations sur le transfert de données.

Pour votre bâton, vous devez faire quelque chose comme VV pour savoir combien de points d'extrémité que vous avez,

UsbInterface intf = device.getInterface(0); 
// checks for 2 endpoints 
if (intf.getEndpointCount() != 2) { 
Toast toast = Toast.makeText(context, "could not find endpoint", duration); 
toast.show(); 
return; 
    } 
UsbEndpoint ep = intf.getEndpoint(0); 
if (ep.getType() == UsbConstants.USB_ENDPOINT_XFER_BULK) { 
if (ep.getDirection() == UsbConstants.USB_DIR_OUT) { 

cela vous permettra de comprendre si le point final qui vous intéresse est une masse (constantes usb docs a d'autres types) et si vous pouvez envoyer des données vers ou depuis l'appareil à ce point de terminaison (usb_dir_in pour tester dans). Quel point final que vous voulez est périphérique spécifique, mon exemple commence sur 0, le vôtre sera différent

Pour enregistrer à nouveau le fichier que vous devez faire quelque chose comme

mConnection.bulkTransfer(mEndpointOut, bytes, 512, TIMEOUT); 

Je gardais la mémoire tampon à chaque fois qu'il remplit un flux de sortie de fichier, ceci est probablement inefficace (car je suppose que le transfert de volume est déjà en train de sauvegarder quelque part) mais la documentation est rare.

+0

Wow, merci de répondre. J'ai perdu l'espoir d'obtenir une réponse. Je vais le vérifier aujourd'hui et accepter votre réponse si cela fonctionne :). – Bandreid

+1

@Bandreid Je ne comprends pas comment vous spécifiez ce que vous voulez transférer. Où dites-vous, "envoyez-moi le fichier 'abc.txt' situé dans '/ docs/alphabet /'? –

+0

@Mike Ortiz - Je n'ai pas ajouté cette partie du code dans ma question – Bandreid

4

Les API hôtes USB Android fournissent uniquement un accès USB brut. Pour accéder aux fichiers sur un périphérique de stockage, votre application doit elle-même implémenter le mode de stockage de masse USB au-dessus de l'USB Apis, puis le code d'un système de fichiers en plus de cela. Quelques versions personnalisées d'Android permettent de monter un périphérique de stockage de masse USB avec un système de fichiers reconnu au niveau du système d'exploitation, mais cela ne fait actuellement pas partie de la norme android. Il est également possible que si vous avez un périphérique enraciné, vous puissiez l'utiliser pour convaincre le noyau de monter un tel système de fichiers.

+1

Je ne trouve aucun bon exemple pour implémenter le mode de stockage de masse USB. Y at-il quelqu'un qui peut pointer? –

+0

Je ne suis pas au courant de tout - mais le stockage de masse est la partie facile, vous avez également besoin d'une implémentation de système de fichiers. –

+0

Y at-il une bibliothèque qui pourrait faciliter le processus? –

Questions connexes