Intentando abrir un archivo PDF desde la carpeta de activos usando fileProvider pero da FileNotFoundException: No existe dicho archivo o directorio [duplicad
Esta pregunta ya tiene una respuesta aquí:
Lea un archivo pdf de la carpeta de activos 7 respuestas Estoy tratando de mostrar el archivo "NEFT.pdf" almacenado en la carpeta de activos de mi aplicación de Android.
El siguiente código funciona absolutamente bien hasta API 25
private void CopyReadAssets(String filename) {
AssetManager assetManager = getAssets();
InputStream in = null;
OutputStream out = null;
File file = new File(getFilesDir(), filename);
try {
in = assetManager.open(filename);
out = openFileOutput(file.getName(), Context.MODE_WORLD_READABLE);
copyFile(in, out);
in.close();
in = null;
out.flush();
out.close();
out = null;
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setDataAndType(
Uri.parse("file://" + getFilesDir() + "/"+filename), "application/pdf");
startActivity(intent);
} catch (Exception e)
{
Toast.makeText(PdfFilesList.this, "cra: "+e.toString(), Toast.LENGTH_SHORT).show();
}
}
Este código no funciona en API 25 y superior. Da el error MODE_WORLD_READABLE ya no es compatible
Lo cambié a MODE_PRIVATE pero eso me da otro error
android.os.fileuriexposedexception expuesto más allá de la aplicación a través de intent.getdata ().
Así que apliqué el concepto explicado en Developer.Android.com.
Esto es lo que obtengo en el registro de errores:
E / DisplayData: openFd: java.io.FileNotFoundException: No existe tal archivo o directorio
E / PdfLoader: No se puede cargar el archivo (no se abre) Mostrar datos [PDF: NEFT.pdf] + ContentOpenable, uri: contenido: //com.user.plansmart.provider/pdf_files/NEFT.pd
uri me parece correcto. ¿Alguien puede ayudarme a localizar el error aquí.
Aquí está elproveedo elemento en el archivo de manifiesto.
<provider
android:name="android.support.v4.content.FileProvider"
android:authorities="${applicationId}.provider"
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/provider_paths"/>
</provider>
Este es el provider_paths.xml archiv
<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android">
<external-path name="external_files" path="."/>
<files-path name="pdf_files" path="pdf/"/>
Este es el código de Android para mostrar el archivo pdf
private void displayFile(String filename) {
try {
File filePath = new File(getApplicationContext().getFilesDir(), "pdf");
File newFile = new File(filePath, filename);
//new version
Uri fileUri = FileProvider.getUriForFile(PdfFilesList.this,
BuildConfig.APPLICATION_ID + ".provider", newFile);
getApplicationContext().grantUriPermission(PACKAGE_NAME,
fileUri, Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setDataAndType(fileUri, "application/pdf");
intent.setFlags(FLAG_GRANT_READ_URI_PERMISSION | FLAG_GRANT_WRITE_URI_PERMISSION);
startActivity(intent);
}catch (Exception e){
e.printStackTrace();
Toast.makeText(PdfFilesList.this, "df "+e.toString(), Toast.LENGTH_SHORT).show();
}
}