Dans mon application, l'utilisateur doit sélectionner un fichier audio que l'application gère ensuite. Le problème est que pour que l'application fasse ce que je veux qu'elle fasse avec les fichiers audio, j'ai besoin que l'URI soit au format de fichier. Lorsque j'utilise le lecteur de musique natif d'Android pour rechercher le fichier audio dans l'application, l'URI est un URI de contenu, qui ressemble à ceci:
content://media/external/audio/media/710
Cependant, en utilisant la populaire application de gestion de fichiers Astro, j'obtiens ce qui suit:
file:///sdcard/media/audio/ringtones/GetupGetOut.mp3
Ce dernier est beaucoup plus accessible pour moi, mais bien sûr, je veux que l'application ait une fonctionnalité avec le fichier audio que l'utilisateur choisit, quel que soit le programme qu'il utilise pour parcourir sa collection. Ma question est donc la suivante: y a-t-il un moyen de convertir l' content://
URI de style en file://
URI? Sinon, que me recommanderiez-vous pour résoudre ce problème? Voici le code qui appelle le sélecteur, pour référence:
Intent ringIntent = new Intent();
ringIntent.setType("audio/mp3");
ringIntent.setAction(Intent.ACTION_GET_CONTENT);
ringIntent.addCategory(Intent.CATEGORY_OPENABLE);
startActivityForResult(Intent.createChooser(ringIntent, "Select Ringtone"), SELECT_RINGTONE);
Je fais ce qui suit avec l'URI du contenu:
m_ringerPath = m_ringtoneUri.getPath();
File file = new File(m_ringerPath);
Ensuite, faites des trucs FileInputStream avec ledit fichier.
Réponses:
Utilisez simplement
getContentResolver().openInputStream(uri)
pour obtenir un àInputStream
partir d'un URI.http://developer.android.com/reference/android/content/ContentResolver.html#openInputStream(android.net.Uri)
la source
C'est une vieille réponse avec une manière obsolète et piratée de surmonter certains problèmes spécifiques du résolveur de contenu. Prenez-le avec d'énormes grains de sel et utilisez l'API openInputStream appropriée si possible.
Vous pouvez utiliser le résolveur de contenu pour obtenir un
file://
chemin à partir de l'content://
URI:la source
android.provider.MediaStore.Images.ImageColumns.DATA
) est-elle toujours garantie d'exister si le schéma existecontent://
?File
lorsque vous essayez de contourner ContentResolver. Utilisez les méthodes ContentResolver pour opérer sur lescontent://
uris, c'est l'approche officielle, encouragée par les ingénieurs de Google.Si vous avez un Uri de contenu avec,
content://com.externalstorage...
vous pouvez utiliser cette méthode pour obtenir le chemin absolu d'un dossier ou d'un fichier sur Android 19 ou supérieur .Vous pouvez vérifier que chaque partie d'Uri utilise println. Les valeurs renvoyées pour ma carte SD et la mémoire principale de mon appareil sont répertoriées ci-dessous. Vous pouvez accéder et supprimer si le fichier est en mémoire mais je n'ai pas pu supprimer le fichier de la carte SD en utilisant cette méthode, ne lisez ou ouvrez l'image qu'en utilisant ce chemin absolu. Si vous avez trouvé une solution à supprimer en utilisant cette méthode, veuillez la partager. CARTE SD
MÉMOIRE PRINCIPALE
Si vous souhaitez obtenir Uri
file:///
après avoir utilisé le cheminla source
Essayer de gérer l'URI avec le schéma content: // en appelant
ContentResolver.query()
n'est pas une bonne solution. Sur HTC Desire exécutant 4.2.2, vous pourriez obtenir NULL comme résultat de la requête.Pourquoi ne pas utiliser ContentResolver à la place? https://stackoverflow.com/a/29141800/3205334
la source
content://
uri, correspondant au fichier dans son répertoire interne privé, vous ne pourrez pas utiliser cet uri avec lesFile
API dans les nouvelles versions d'Android. ContentResolver est conçu pour surmonter ce type de limitations de sécurité. Si vous avez obtenu l'URI de ContentResolver, vous pouvez vous attendre à ce qu'il fonctionne.Les réponses inspirées sont Jason LaBrun et Darth Raven . Essayer des approches déjà répondues m'a conduit à la solution ci-dessous qui peut principalement couvrir les cas nuls de curseur et la conversion de contenu: // en fichier: //
Pour convertir le fichier, lisez et écrivez le fichier à partir de l'URI gagné
Pour obtenir l'utilisation du nom de fichier, il couvrira la casse nulle du curseur
Il existe une bonne option pour convertir du type mime en extension de fichier
Curseur pour obtenir le nom du fichier
la source
Eh bien je suis un peu en retard pour répondre, mais mon code est testé
vérifier le schéma de uri:
Dans la réponse ci-dessus, j'ai converti l'URI de la vidéo en tableau d'octets, mais ce n'est pas lié à la question, je viens de copier mon code complet pour montrer l'utilisation de
FileInputStream
etInputStream
comme les deux fonctionnent de la même manière dans mon code.J'ai utilisé le contexte variable qui est getActivity () dans mon Fragment et dans Activity, il s'agit simplement de ActivityName.
context=getActivity();
// en fragmentcontext=ActivityName.this;
// en activitéla source
byte[] videoBytes;
? La plupart des réponses montrent uniquement comment utiliserInputStream
avec une image.