119 votes

android get real path par Uri.getPath()

J'essaie d'obtenir une image de la galerie.

Intent intent = new Intent();
intent.setType("image/*");
intent.setAction(Intent.ACTION_GET_CONTENT);
startActivityForResult(Intent.createChooser(intent, "Select picture"), resultCode );

Après mon retour de cette activité, j'ai une donnée qui contient URI. On dirait :

content://media/external/images/1

Comment puis-je convertir ce chemin en chemin réel (tout comme '/sdcard/image.png') ?

Merci.

Merci

.

207voto

m3n0R Points 2333

Voici ce que je fais :

Uri selectedImageURI = data.getData();
imageFile = new File(getRealPathFromURI(selectedImageURI));

et :

private String getRealPathFromURI(Uri contentURI) {
    String result;
    Cursor cursor = getContentResolver().query(contentURI, null, null, null, null);
    if (cursor == null) { // Source is Dropbox or other similar local file path
        result = contentURI.getPath();
    } else { 
        cursor.moveToFirst(); 
        int idx = cursor.getColumnIndex(MediaStore.Images.ImageColumns.DATA); 
        result = cursor.getString(idx);
        cursor.close();
    }
    return result;
}

REMARQUE : la méthode managedQuery() est obsolète, je ne l'utilise donc pas.

Dernière édition : Amélioration. Nous devrions fermer le curseur ! !

58voto

Márton Molnár Points 5258

Est-il vraiment nécessaire pour vous d'obtenir un chemin physique ?
Par exemple, ImageView.setImageURI() et ContentResolver.openInputStream() vous permettent d'accéder au contenu d'un fichier sans connaître son chemin réel.

11voto

Javatar Points 101

MODIFIER : Utilisez cette solution ici : https://stackoverflow.com/a/20559175/2033223 Fonctionne parfaitement !

Tout d'abord, merci pour votre solution @luizfelipetx

J'ai un peu changé ta solution. Cela fonctionne pour moi :

public static String getRealPathFromDocumentUri(Context context, Uri uri){
    String filePath = "";

    Pattern p = Pattern.compile("(\\d+)$");
    Matcher m = p.matcher(uri.toString());
    if (!m.find()) {
        Log.e(ImageConverter.class.getSimpleName(), "ID for requested image not found: " + uri.toString());
        return filePath;
    }
    String imgId = m.group();

    String[] column = { MediaStore.Images.Media.DATA };
    String sel = MediaStore.Images.Media._ID + "=?";

    Cursor cursor = context.getContentResolver().query(MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
            column, sel, new String[]{ imgId }, null);

    int columnIndex = cursor.getColumnIndex(column[0]);

    if (cursor.moveToFirst()) {
        filePath = cursor.getString(columnIndex);
    }
    cursor.close();

    return filePath;
}

Remarque : Nous avons donc obtenu des documents et des images, selon, si l'image vient de 'recents', 'gallery' ou quoi que ce soit. Donc j'extrait d'abord l'ID de l'image avant de la chercher.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X