2017-01-21 3 views
1

J'essaie de créer quelque chose comme un explorateur de fichiers via des périphériques USB connectés (via les ports OTG ou USB sur Android TV). Tout ce dont j'ai besoin pour cela est un chemin quelque chose comme "/ storage/sda4" et l'identifiant de l'appareil, puis je peux travailler avec le périphérique via simle android class File. Cela semble simple mais je ne trouve aucune information à ce sujet, mais tous les explorateurs de fichiers peuvent le faire (par exemple ESExplorer). Ok, je trouve un moyen simple d'obtenir tous les périphériques USB connectés avec identifiantComment puis-je lire des fichiers à partir d'un périphérique USB sur Android?

UsbManager usbManager = (UsbManager) context.getSystemService(Context.USB_SERVICE); 
usbManager.getDeviceList(); 

mais comment puis-je obtenir une information sur le chemin path? deviceName contient quelque chose comme ceci "/ dev/bus/usb/00x" mais il ne peut pas m'aider, j'ai besoin d'un simple chemin android émulé ("/ storage/sda4"). Cette page https://developer.android.com/guide/topics/connectivity/usb/host.html dit que j'ai besoin d'obtenir UsbInterfaces et de rendre UsbConnection au transfert en vrac et à d'autres conneries, j'ai tout fait mais je n'ai pas trouvé de chemin vers le périphérique ou d'autres informations sur la liste de fichiers usb.

Ok, je trouve une autre façon d'obtenir (qui ne nécessite pas l'autorisation!) Pour obtenir le chemin à tous les appareils connectés

StorageManager storageManager = (StorageManager) context.getSystemService(Context.STORAGE_SERVICE); 
Method getVolumeListMethod = StorageManager.class.getDeclaredMethod("getVolumeList"); 
Object[] storageVolumeList = (Object[]) getVolumeListMethod.invoke(storageManager); 

et il fonctionne, mais je dois identifier un dispositif (parce que je veux fichiers cache de différents stockages USB) mais tout ce que je peux obtenir à partir de l'objet volume est mStorageId, mDescriptionId, mPrimary, mRemovable, mEmulated, mMtpReserveSpace, mAllowMassStorage, mMaxFileSize, mOwner, mUuid, mUserLabel, mState, mSubSystem. Rien de cela ne peut pas identifier le périphérique: mDescriptionId et mStorageId sont unique pour le port usb, mUuid est nul, mUserLabel n'est pas unique.

Environment.getExternalFilesDirs() n'aidera pas, il ne fournit aucun identifiant de périphérique et ne fonctionne qu'avec un périphérique.

Je trouve une question similaire ici, mais elle n'a pas de bonne réponse Android list files from USB Drive.

Eh bien, est un moyen simple d'obtenir la liste des périphériques USB avec chemin et identifiant existe?

+0

Jetez un oeil à 'getExternalFilesDirs()'. La troisième entrée serait le lecteur OTG USB. – greenapps

+0

Je viens de modifier la question, j'ai mentionné getExternalStorageDirectory au lieu de getExternalFilesDirs. Il ne fournit aucun identifiant d'appareil – LamaUltramarine

+0

Pour quoi avez-vous besoin d'un identifiant d'appareil si vous voulez faire un explorateur de fichiers? Vous avez seulement besoin d'un chemin. Et getExternalFilesDirs() vous le donnera. Ne dites pas que ce n'est pas le cas! – greenapps

Répondre

1

Tout ce que je dois pour cela est un chemin quelque chose comme «/stockage/sda4 » et l'identifiant de l'appareil, puis je peux travailler avec appareil par simle android classe fichier

Non, parce que you do not have arbitrary access to removable storage, y compris Les lecteurs USB OTG, sur Android 4.4+.

tous les explorateurs de fichiers peuvent le faire (par exemple ESExplorer)

pré-installé des applications « explorateur de fichiers » peuvent avoir des droits supplémentaires qui leur sont accordés par le fabricant de l'appareil ou développeur ROM personnalisé. Sinon, ils n'ont pas non plus accès arbitrairement au stockage amovible.

est un moyen simple d'obtenir la liste des périphériques USB avec chemin et identificateur existe?

Pas avec un chemin de système de fichiers, non. getStorageVolumes() sur StorageManager vous donnera une liste des volumes de stockage, ce qui inclut le stockage externe et le stockage amovible. Vous pouvez ensuite utiliser createAccessIntent() sur StorageVolume pour demander à l'utilisateur la permission de travailler avec le volume.Si elles accordent la permission, vous obtenez un Uri arrière qui:

  • sert d'identifiant temporaire du volume (c.-à-ne sera plus utilisable comme un identifiant si l'utilisateur éjecte les médias, mais jusque-là, peut distinguer un volume d'un autre), et

  • vous permet de travailler avec une partie du contenu de ce volume, mais en utilisant Uri valeurs, système de fichiers non chemins

+0

Un grand merci pour la réponse détaillée. J'essaie getStorageVolumes, mais il nécessite 24 API et plus, mais pour l'instant il ne s'étale pas tellement. Après votre réponse, je comprends que seule la façon dont je peux le faire est la deuxième seconde façon que je décris, il me fournit le chemin de tous les appareils, et je peux travailler avec un simple fichier de classe (je l'ai testé sur android 5 and 5.1 :) c'est un défaut d'android mais c'est la vérité. Je vais utiliser mUserLabel comme identifiant, unique dans la plupart des cas. – LamaUltramarine

+0

StorageManager storageManager = (StorageManager) context.getSystemService (Contexte.STORAGE_SERVICE); Méthode getVolumeListMethod = StorageManager.class.getDeclaredMethod ("getVolumeList"); Object [] storageVolumeList = (Object []) getVolumeListMethod.invoke (storageManager); J'utilise ces lignes pour obtenir la liste des volumes de stockage mais je ne reçois que/storage/emulated/0, alors que mon OTG était connecté avec une clé USB. Pourquoi je ne reçois pas le chemin pour le périphérique OTG connecté? – Anupriya

+0

@Anupriya: Peut-être parce que vous utilisez la réflexion pour obtenir quelque chose qui n'est pas supporté par la version d'Android que vous utilisez. – CommonsWare