2009-02-18 7 views
44

J'essaie d'obtenir un objet FileInputStream sur une image que l'utilisateur sélectionne dans la galerie d'images. Ceci est l'androïde URI retourné par android.provider.MediaStore.Images.Media.INTERNAL_CONTENT_URIAndroid - comment puis-je convertir un objet android.net.Uri en objet java.net.URI?

contenu

: // media/externe/images/media/3

Lorsque je tente de construire un objet URI java de cet objet, je reçois un IllegalArgumentException avec la description d'exception système de fichier attendu URI: contenu: // médias/externes/images/médias/3 alors que l'URI android montre le schéma que contenu

n'a jamais trouvé une solution pour la question initiale. Mais si vous voulez le flux d'octets d'une image dans la galerie d'images, ce morceau de code le fera.

Bitmap bitmap = Media.getBitmap(getContentResolver(), imageUri); 
ByteArrayOutputStream bytes = new ByteArrayOutputStream(); 
bitmap.compress(Bitmap.CompressFormat.JPEG, 40, bytes); 
ByteArrayInputStream fileInputStream = new ByteArrayInputStream(bytes.toByteArray()); 

Répondre

40

Vous pouvez utiliser la méthode toString de l'androïde Uri en combinaison du constructeur basé String de Java URI.

android.net.Uri auri = new android.net.Uri(what ever); 
java.net.URI juri = new java.net.URI(auri.toString()); 

Android URI | Java URI

+3

Merci. J'ai essayé ça. Il donne une exception (java.net.URI devrait avoir un schéma valide) – lostInTransit

+8

c'est faux et échouera si l'URI a des caractères qui ont besoin d'encodage (comme l'espace). android.net.Uri.toString() décode les caractères encodés, et java.net.URI lèvera une exception si vous essayez de le construire sur une chaîne non-encodée. la bonne solution 'huri = new java.net.URI (URLEncoder.encode (auri.toString()," UTF-8 "));' –

+0

@Jeffrey: Uri.toString() retourne les caractères encodés sur mon Android 4.1.2 périphérique –

0

Puisque la construction de chaîne ne fonctionne pas, avez-vous essayé de le construire vous-même?

android.net.URI auri = new android.net.URI(what ever); 
java.net.URI juri = new java.net.URI(auri.getSchema(), 
            auri.getSchemaSpecificPart(), 
            auri.getFragment()); 

Vous pouvez également vérifier que vous obtenez des données valides de la classe URI Android. Les docs listés dans mon autre réponse expliquent à peu près comment cela ne se passe pas. S'il y a une erreur, la classe crache tout de même les ordures et ne jette aucune exception. Ce qui pourrait très probablement être pourquoi la classe java qui fait la validation jette une exception.

+0

Merci Brian. L'uri est retourné par android lui-même. il contient le chemin d'une image dans la galerie d'images du téléphone. donc ne peux rien faire à propos de l'image. Je vais essayer de poster l'uri dans les questions – lostInTransit

+0

Je pense que vous vouliez dire getScheme et getSchemeSpecificPart, non? – Piotr

38

trouvé la bonne façon d'ouvrir InputStream de URI contenu:

InputStream fileInputStream=yourContext.getContentResolver().openInputStream(uri); 

C'est tout!

+2

Merci! si simple, je savais qu'il était là quelque part. La réponse acceptée pourrait fonctionner dans certains cas, mais ne semble pas sûre/fonctionnelle dans tous les cas. – plainjimbo

+0

Merci beaucoup! Fonctionne comme un charme lorsque vous avez besoin d'un byte [] à partir d'une image sélectionnée dans la galerie intégrée! –

+0

Cette force ferme mon application et ouvre Binder.class sans source attachée. J'envoie des contacts.CONTENT_VCF_URI – tasomaniac

1

J'ai voté pour la réponse de jgilrincon.Je ne peux pas commenter en raison de la mauvaise réputation, et voici quelques informations supplémentaires - vous pouvez utiliser FileHelper.java du projet Apache Cordova, il a des fonctions dont vous avez besoin pour le traitement des fichiers à partir des chaînes Uri, en considérant mediastore aussi (et dossier des applications)

particulièrement cette méthode fournit InputStream d'Uri:

public static InputStream getInputStreamFromUriString(String uriString, Activity cordova) 
Questions connexes