web-dev-qa-db-fra.com

Obtenir le contenu du chemin d'accès au fichier dans Android

Je connais le chemin absolu d’une image (par exemple, /sdcard/cats.jpg). Existe-t-il un moyen de contourner le contenu de l'URI pour ce fichier? 

En fait, dans mon code, je télécharge une image et la sauvegarde à un emplacement particulier. Afin de définir l’image dans un ImageView, j’ouvre actuellement le fichier à l’aide du chemin, récupère les octets, crée un bitmap puis le définit dans ImageView. Il s’agit d’un processus très lent. Si je pouvais obtenir le contenu uri, je pourrais très facilement utiliser la méthode ImageView.setImageUri(uri).

222
pankajagarwal

Essayez avec:

ImageView.setImageURI(Uri.fromFile(new File("/sdcard/cats.jpg")));

Ou avec:

ImageView.setImageURI(Uri.parse(new File("/sdcard/cats.jpg").toString()));
426

METTRE À JOUR

Ici, on suppose que votre média (Image/Vidéo) est déjà ajouté au fournisseur de contenu multimédia. Sinon, vous ne pourrez pas obtenir le URL de contenu aussi exacte que vous voulez. Au lieu de cela, il y aura un fichier Uri.

J'ai eu la même question pour mon activité Explorateur de fichiers. Vous devez savoir que le contenturi pour fichier ne prend en charge que les données médiastore telles que l'image, l'audio et la vidéo. Je vous donne le code pour obtenir le contenu de l'image uri en sélectionnant une image de sdcard. Essayez ce code, peut-être que cela fonctionnera pour vous ...

public static Uri getImageContentUri(Context context, File imageFile) {
  String filePath = imageFile.getAbsolutePath();
  Cursor cursor = context.getContentResolver().query(
      MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
      new String[] { MediaStore.Images.Media._ID },
      MediaStore.Images.Media.DATA + "=? ",
      new String[] { filePath }, null);
  if (cursor != null && cursor.moveToFirst()) {
    int id = cursor.getInt(cursor.getColumnIndex(MediaStore.MediaColumns._ID));
    cursor.close();
    return Uri.withAppendedPath(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, "" + id);
  } else {
    if (imageFile.exists()) {
      ContentValues values = new ContentValues();
      values.put(MediaStore.Images.Media.DATA, filePath);
      return context.getContentResolver().insert(
          MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values);
    } else {
      return null;
    }
  }
}
76
Jinal Jogiyani

// Ce code fonctionne pour les images sur la version 2.2, pas sûr si d'autres types de média 

   //Your file path - Example here is "/sdcard/cats.jpg"
   final String filePathThis = imagePaths.get(position).toString();

   MediaScannerConnectionClient mediaScannerClient = new
   MediaScannerConnectionClient() {
    private MediaScannerConnection msc = null;
    {
        msc = new MediaScannerConnection(getApplicationContext(), this);
        msc.connect();
    }

    public void onMediaScannerConnected(){
        msc.scanFile(filePathThis, null);
    }


    public void onScanCompleted(String path, Uri uri) {
        //This is where you get your content uri
            Log.d(TAG, uri.toString());
        msc.disconnect();
    }
   };
15
AndroidDebaser

La solution acceptée est probablement le meilleur choix pour vos besoins, mais pour répondre à la question dans la ligne d'objet:

Dans mon application, je dois obtenir le chemin des URI et 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 également être utilisé pour Audio ou Fichiers ou d’autres types de contenu stocké en remplaçant MediaStore.Audio (etc.) par 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 sa sous-section que vous interrogez) stocke le chemin du fichier. Vous pouvez donc utiliser cette information pour la rechercher.

14
Jon O

Le moyen le plus simple et le plus robuste pour créer du contenu Uri content:// à partir d'un fichier consiste à utiliser FileProvider . Uri fourni par FileProvider peut également être utilisé pour partager des fichiers avec d'autres applications. Pour obtenir File Uri à partir d'un chemin absolu de File, vous pouvez utiliser DocumentFile.fromFile (nouveau fichier (chemin, nom)), il est ajouté dans Api 22 et renvoie null pour les versions ci-dessous.

File imagePath = new File(Context.getFilesDir(), "images");
File newFile = new File(imagePath, "default_image.jpg");
Uri contentUri = getUriForFile(getContext(), "com.mydomain.fileprovider", newFile);
2
Thracian

Obtenir l'ID de fichier sans écrire de code, uniquement avec les commandes adb Shell CLI:

adb Shell content query --uri "content://media/external/video/media" | grep FILE_NAME | grep -Eo " _id=([0-9]+)," | grep -Eo "[0-9]+"
2
BogdanBiv

U peut essayer ci-dessous l'extrait de code 

    public Uri getUri(ContentResolver cr, String path){
    Uri mediaUri = MediaStore.Files.getContentUri(VOLUME_NAME);
    Cursor ca = cr.query(mediaUri, new String[] { MediaStore.MediaColumns._ID }, MediaStore.MediaColumns.DATA + "=?", new String[] {path}, null);
    if (ca != null && ca.moveToFirst()) {
        int id = ca.getInt(ca.getColumnIndex(MediaStore.MediaColumns._ID));
        ca.close();
        return  MediaStore.Files.getContentUri(VOLUME_NAME,id);
    }
    if(ca != null) {
        ca.close();
    }
    return null;
}
0
caopeng

C'est tard, mais peut aider quelqu'un à l'avenir.

Pour obtenir le contenu de l'URI d'un fichier, vous pouvez utiliser la méthode suivante:

FileProvider.getUriForFile(Context context, String authority, File file)

Il retourne l'URI du contenu.

Cochez cette case pour apprendre à configurer une FileProvider

0
artenson.art98