Estoy tratando de solucionar un problema después de que se agregó la nueva función en el sistema de archivos de Android, pero aparece este error:
android.os.FileUriExposedException: file:///storage/emulated/0/MyApp/Camera_20180105_172234.jpg exposed beyond app through ClipData.Item.getUri()
Así que espero que alguien pueda ayudarme a solucionar este problema :)
Gracias
private Uri getTempUri() {
// Create an image file name
SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd_HHmmss");
String dt = sdf.format(new Date());
imageFile = null;
imageFile = new File(Environment.getExternalStorageDirectory()
+ "/MyApp/", "Camera_" + dt + ".jpg");
AppLog.Log(
TAG,
"New Camera Image Path:- "
+ Environment.getExternalStorageDirectory()
+ "/MyApp/" + "Camera_" + dt + ".jpg");
File file = new File(Environment.getExternalStorageDirectory() + "/MyApp");
if (!file.exists()) {
file.mkdir();
}
imagePath = Environment.getExternalStorageDirectory() + "/MyApp/"
+ "Camera_" + dt + ".jpg";
imageUri = Uri.fromFile(imageFile);
return imageUri;
}
Respuestas:
Para sdk 24 y posteriores, si necesita obtener el Uri de un archivo fuera del almacenamiento de su aplicación, tiene este error.
Las soluciones de @ eranda.del le permiten cambiar la política para permitir esto y funciona bien.
Sin embargo, si desea seguir las pautas de Google sin tener que cambiar la política de API de su aplicación, debe usar un FileProvider.
Al principio, para obtener el URI de un archivo, debe usar el método FileProvider.getUriForFile ():
Entonces necesitas configurar tu proveedor en tu manifiesto de Android:
(En "autoridades", use el mismo valor que el segundo argumento del método getUriForFile () (firma de la aplicación + ".provider"))
Y finalmente necesitas crear el archivo de recursos: "file_paths". Este archivo debe crearse en el directorio res / xml (probablemente también necesite crear este directorio):
fuente
<external-path ...
se utiliza cuando se desea Environment.getExternalStorageDirectory (). y utilícelo<files-path ...
si necesita Context.getFilesDir (). Es mejor que primero consulte los documentos oficiales: developer.android.com/reference/android/support/v4/content/…androidx
él está:android:name="androidx.core.content.FileProvider"
Agregue el siguiente bloque de código antes de iniciar la cámara o la exploración de archivos
Consulte el modo estricto del enlace de referencia y se explican todos los detalles técnicos y de uso.
fuente
No se debe permitir ninguna configuración de proveedor requerida en AndroidManifest only Camera and Storage. Utilice el siguiente código para iniciar la cámara:
Después de capturar la imagen, puede encontrar su imagen capturada en:
fuente