java - tutorial - expuesto más allá de la aplicación a través de ClipData.Item.getUri
android studio tutorial pdf español (2)
Agregue el siguiente bloque de código antes de iniciar la cámara o la exploración de archivos
StrictMode.VmPolicy.Builder builder = new StrictMode.VmPolicy.Builder();
StrictMode.setVmPolicy(builder.build());
Consulte el modo estricto del enlace de referencia y se explican todos los detalles técnicos y de uso.
Estoy tratando de solucionar un problema después de la nueva característica agregada 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 arreglar esto :)
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;
}
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 @ 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 ():
Uri imageUri = FileProvider.getUriForFile(
MainActivity.this,
"com.example.homefolder.example.provider", //(use your app signature + ".provider" )
imageFile);
Luego debe configurar su proveedor en su manifiesto de Android:
<application>
...
<provider
android:name="android.support.v4.content.FileProvider"
android:authorities="com.example.homefolder.example.provider"
android:exported="false"
android:grantUriPermissions="true">
<!-- ressource file to create -->
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/file_paths">
</meta-data>
</provider>
</application>
(En "autoridades" use el mismo valor que el segundo argumento del método getUriForFile () (firma de la aplicación + ".provider"))
Y finalmente necesita crear el archivo de recursos: "file_paths". Este archivo debe crearse en el directorio res / xml (probablemente también necesite crear este directorio):
<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android">
<external-path name="external_files" path="." />
</paths>