setimageresource - Obtener contenido uri de la ruta del archivo en Android
set image view android (8)
// Este código funciona para imágenes en 2.2, no estoy seguro si hay algún otro tipo de medio
//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();
}
};
Conozco la ruta absoluta de una imagen (por ejemplo, por ejemplo, /sdcard/cats.jpg). ¿Hay alguna manera de 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 utilizando la ruta, obtengo los bytes y creo un mapa de bits y luego configuro el mapa de bits en el ImageView. Este es un proceso muy lento, en cambio, si pudiera obtener el contenido de uri, podría usar el método ImageView.setImageUri(uri)
muy fácilmente ImageView.setImageUri(uri)
Intenta con:
ImageView.setImageURI(Uri.fromFile(new File("/sdcard/cats.jpg")));
O con:
ImageView.setImageURI(Uri.parse(new File("/sdcard/cats.jpg").toString()));
La forma más sencilla y robusta de crear contenido de Uri de content://
desde un archivo es usar FileProvider . Uri proporcionado por FileProvider también se puede usar para proporcionar archivos con otras aplicaciones. Para obtener el Archivo Uri desde una ruta absoluta de File
, puede usar DocumentFile.fromFile (nuevo Archivo (ruta, nombre)), se agrega en Api 22 y devuelve nulo para las versiones a continuación.
File imagePath = new File(Context.getFilesDir(), "images");
File newFile = new File(imagePath, "default_image.jpg");
Uri contentUri = getUriForFile(getContext(), "com.mydomain.fileprovider", newFile);
La solución aceptada es probablemente la mejor opción para sus propósitos, pero para responder realmente la pregunta en la línea de asunto:
En mi aplicación, tengo que obtener la ruta de los URI y obtener la 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;
}
Este último (lo que hago para los videos, pero también se puede usar para audio o archivos u otros tipos de contenido almacenado sustituyendo 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 la subsección de la que esté consultando) almacena la ruta del archivo, por lo que utiliza esa información para buscarla.
Obtención del ID de archivo sin escribir ningún código, solo con los comandos de la 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]+"
Puedes probar el siguiente 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;
}
Puedes usar estas dos formas basadas en el uso
Uri uri = Uri.parse("String file location");
o
Uri uri = Uri.fromFile(new File("string file location"));
He intentado en ambos sentidos y ambos trabajos.
ACTUALIZAR
Aquí se supone que su contenido multimedia (Imagen / Video) ya está agregado al proveedor de contenido multimedia. Si no es así, no podrá obtener la URL del contenido como exacta lo que desea. En su lugar habrá archivo Uri.
Tenía la misma pregunta para la actividad de mi explorador de archivos. Debe saber que el contenturi para archivo solo admite datos de mediastore como imagen, audio y video. Le estoy dando el código para obtener el contenido de la imagen uri al seleccionar una imagen de sdcard. Prueba este código, tal vez te funcione ...
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;
}
}
}