Obtenga contenido uri desde la ruta del archivo en Android

Conozco la ruta absoluta de una imagen (por ejemplo, /sdcard/cats.jpg). ¿Hay alguna manera para el contenido uri para este archivo?

En realidad, en mi código descargo una imagen y la guardo en una ubicación particular. Para establecer la imagen en un ImageView actualmente, abro el archivo usando la ruta, obtengo los bytes y creo un bitmap y luego establezco el bitmap en ImageView. Este es un proceso muy lento, en cambio si pudiera obtener el contenido uri entonces podría usar el método ImageView.setImageUri(uri)

Prueba con:

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

O con:

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

ACTUALIZAR

Aquí se supone que su medio (Imagen / Video) ya está agregado al proveedor de contenido multimedia. De lo contrario, no podrá obtener la URL del contenido exactamente como desee. En cambio, habrá un archivo Uri.

Tenía la misma pregunta para mi actividad de explorador de archivos. Debe saber que contenturi for file solo admite datos de mediatore como imagen, audio y video. Te estoy dando el código para que uri de contenido de imagen seleccione una imagen de sdcard. Pruebe este código, tal vez funcione para usted …

 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; } } } 

// Este código funciona para imágenes en 2.2, no estoy seguro si hay otros tipos de medios

  //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(); } }; 

La solución aceptada es probablemente la mejor para sus propósitos, pero para responderla en el asunto:

En mi aplicación, debo obtener la ruta de los URI y obtener el URI de las rutas. El primero:

 /** * 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; } 

El último (que hago para videos, pero también se puede usar para Audio o Archivos u otros tipos de contenido almacenado al sustituir MediaStore.Audio (etc) por 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; } 

Básicamente, la columna DATA de MediaStore (o cualquiera de las subsecciones que se consultan) almacena la ruta del archivo, por lo que se usa esa información para buscarla.

Obteniendo el ID de archivo sin escribir ningún código, solo con los comandos de CLI de adb shell:

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

U puede probar debajo del fragmento de código

  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); } ca.close(); return null; } 

La manera más fácil y robusta para crear contenido Uri content:// desde un archivo es usar FileProvider . Uri provisto por FileProvider se puede usar también para proporcionar Uri para compartir archivos con otras aplicaciones también. Para obtener File Uri de una ruta absoluta de File , puede usar DocumentFile.fromFile (new File (path, name)), se agrega en Api 22 y devuelve null para las versiones siguientes.

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

Puede usar estas dos formas en función del uso

Uri uri = Uri.parse("String file location");

o

Uri uri = Uri.fromFile(new File("string file location"));

Lo intenté en ambos sentidos y ambos funcionan.