2010-07-31 10 views
1

Je suis en train de faire une application qui fonctionne avec des images. J'ai besoin d'implémenter des fonctionnalités où l'utilisateur choisit un fichier stocké sur la carte SD. Une fois qu'ils ont choisi l'image (en utilisant la galerie Android), l'emplacement du fichier de l'image sera envoyé à une autre activité, où d'autres travaux seront effectués.Get Image Emplacement du fichier d'image dans Android

J'ai vu des messages similaires ici sur SO, mais aucun pour répondre à ma question en particulier. En gros, cela est le code que je fais lorsque l'utilisateur clique sur le « Charger une image » bouton:

// Create a new Intent to open the picture selector: 
Intent loadPicture = new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI); 

// To start it, run the startActivityForResult() method: 
startActivityForResult(loadPicture, SELECT_IMAGE); 

A partir de ce code, j'ai ensuite une méthode onActivityResult() pour écouter le rappel:

// If the user tried to select an image: 
if(requestCode == SELECT_IMAGE) 
{ 
    // Check if the user actually selected an image: 
    if(resultCode == Activity.RESULT_OK) 
    { 
     // This gets the URI of the image the user selected: 
     Uri selectedImage = data.getData(); 

     // Create a new Intent to send to the next Activity: 
     Intent i = new Intent(currentActivty.this, nextActivity.class); 

     // ----------------- Problem Area ----------------- 
     // I would like to send the filename to the Intent object, and send it over. 
     // However, the selectedImage.toString() method will return a 
     // "content://" string instead of a file location. How do I get a file 
     // location from that URI object? 
     i.putExtra("PICTURE_LOCATION", selectedImage.toString()); 

     // Start the activity outlined with the Intent above: 
     startActivity(i); 

Comme l'indique le code ci-dessus, le uri.toString() renvoie une chaîne content:// au lieu de l'emplacement du fichier de l'image sélectionnée. Comment puis-je obtenir l'emplacement du fichier?

Remarque: Une autre solution possible consiste à envoyer la chaîne content:// et à la convertir en Bitmap (ce qui se produit dans l'activité suivante). Cependant, je ne sais pas comment faire ça.

+0

Je ne suis pas 100% à ce sujet mais je pense que j'ai fait quelque chose comme selectedImage.getPath(); – stealthcopter

Répondre

2

J'ai trouvé la réponse à ma propre question. Après avoir fait plus de recherche, je suis finalement tombé sur un post ici sur SO qui pose la même question ici: android get real path by Uri.getPath().

Malheureusement, la réponse a un lien brisé. Après quelques recherches sur Google, j'ai trouvé le bon lien vers le site ici: http://www.androidsnippets.org/snippets/130/ (J'ai vérifié que ce code fonctionne effectivement.)

Cependant, j'ai décidé de prendre un chemin différent. Puisque ma prochaine activité utilise un ImageView pour afficher l'image, je vais plutôt utiliser la chaîne de contenu Uri pour toutes les méthodes liées à l'activité suivante.

Dans l'activité suivante, j'utilise la méthode ImageView.setImageUri().

Voici le code que je fais dans l'activité suivante pour afficher l'image de la chaîne content://:

// Get the content string from the previous Activity: 
picLocation = getIntent().getStringExtra("PICTURE_LOCATION"); 

// Instantiate the ImageView object: 
ImageView imageViewer = (ImageView)findViewById(R.id.ImageViewer); 

// Convert the Uri string into a usable Uri: 
Uri temp = Uri.parse(picLocation); 
imageViewer.setImageURI(temp); 

J'espère que cette question et la réponse sera utile pour les futurs développeurs Android.

2

Voici une autre réponse que j'espère que quelqu'un trouve utile:

Vous pouvez le faire pour tout contenu dans le MediaStore. Dans mon application, je dois obtenir le chemin à partir des URI et obtenir l'URI des chemins. L'ancien:

/** 
* Gets the corresponding path to a file from the given content:// URI 
* @param selectedVideoUri The content:// URI to find the file path from 
* @param contentResolver The content resolver to use to perform the query. 
* @return the file path as a string 
*/ 
private String getFilePathFromContentUri(Uri selectedVideoUri, 
     ContentResolver contentResolver) { 
    String filePath; 
    String[] filePathColumn = {MediaColumns.DATA}; 

    Cursor cursor = contentResolver.query(selectedVideoUri, filePathColumn, null, null, null); 
    cursor.moveToFirst(); 

    int columnIndex = cursor.getColumnIndex(filePathColumn[0]); 
    filePath = cursor.getString(columnIndex); 
    cursor.close(); 
    return filePath; 
} 

Ce dernier (que je fais pour les vidéos, mais peut aussi être utilisé pour des fichiers audio ou d'autres types de contenus stockés en substituant MediaStore.Audio (etc) pour MediaStore.Video:

/** 
* Gets the MediaStore video ID of a given file on external storage 
* @param filePath The path (on external storage) of the file to resolve the ID of 
* @param contentResolver The content resolver to use to perform the query. 
* @return the video ID as a long 
*/ 
private long getVideoIdFromFilePath(String filePath, 
     ContentResolver contentResolver) { 


    long videoId; 
    Log.d(TAG,"Loading file " + filePath); 

      // This returns us content://media/external/videos/media (or something like that) 
      // I pass in "external" because that's the MediaStore's name for the external 
      // storage on my device (the other possibility is "internal") 
    Uri videosUri = MediaStore.Video.Media.getContentUri("external"); 

    Log.d(TAG,"videosUri = " + videosUri.toString()); 

    String[] projection = {MediaStore.Video.VideoColumns._ID}; 

    // TODO This will break if we have no matching item in the MediaStore. 
    Cursor cursor = contentResolver.query(videosUri, projection, MediaStore.Video.VideoColumns.DATA + " LIKE ?", new String[] { filePath }, null); 
    cursor.moveToFirst(); 

    int columnIndex = cursor.getColumnIndex(projection[0]); 
    videoId = cursor.getLong(columnIndex); 

    Log.d(TAG,"Video ID is " + videoId); 
    cursor.close(); 
    return videoId; 
} 

Fondamentalement, la colonne DATA de MediaStore (ou selon la sous-section de celui-ci vous interrogez) stocke le chemin du fichier, vous utilisez ce que vous savez regarder les données, ou vous interrogez sur le champ DATA pour sélectionner le contenu qui vous intéresse