web-dev-qa-db-fra.com

Android - comment convertir un objet Android.net.Uri en un objet Java.net.URI?

J'essaie d'obtenir un objet FileInputStream sur une image que l'utilisateur sélectionne dans la galerie d'images. Il s'agit du Android URI renvoyé par Android.provider.MediaStore.Images.Media.INTERNAL_CONTENT_URI

content://media/external/images/media/3

Lorsque j'essaye de construire un objet Java URI à partir de cet objet, j'obtiens un IllegalArgumentException avec la description de l'exception Schéma de fichier attendu dans URI: content: // media/external/images/media/ alors que l'URI Android montre le schéma sous la forme conten

Mise à jour: Jamais trouvé de solution à la question d'origine. 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());
57
lostInTransit

Vous pouvez utiliser la méthode toString du Android Uri en combinaison avec le constructeur basé sur String du Java URI.

Android.net.Uri auri = new Android.net.Uri(what ever);
Java.net.URI juri = new Java.net.URI(auri.toString());

RI Android | Java URI

51
Brian Gianforcaro

Trouvé la bonne façon d'ouvrir InputStream à partir de l'URI de contenu:

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

C'est tout!

40
Fedor

J'ai voté pour la réponse de jgilrincon. Je ne peux pas commenter en raison de la faible 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 la gestion des fichiers à partir des chaînes Uri, compte tenu du médiastore ainsi (et le dossier des ressources de l'application)

En particulier, cette méthode fournit InputStream d'Uri:

public static InputStream getInputStreamFromUriString(String uriString, Activity cordova)
2
Mixaz

Il existe une solution à votre question d'origine (convertir Uri en URI):

  1. Obtenez le vrai chemin de fichier (regardez ce code: Obtenez le nom de fichier et le chemin de l'URI de mediastore )

  2. Obtenez l'URI en utilisant le chemin réel et le constructeur: URI (String uri)

Si vous avez besoin de plus de détails, regardez ici:

Comment supprimer une vidéo enregistrée en utilisant une intention avec ACTION_VIDEO_CAPTURE?

2
jgilrincon

Puisque la construction de chaînes ne fonctionne pas, avez-vous essayé de la 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 vos données valides sont extraites de la classe Android URI. Les documents répertoriés dans mon autre réponse expliquent comment il ne fait pratiquement aucune vérification d'erreur. erreur, la classe crache de toute façon des ordures et ne lève aucune exception. Ce qui pourrait très probablement être la raison pour laquelle la classe Java qui effectue la validation lève une exception.

0
Brian Gianforcaro