abrir un pdf en android con una aplicacion ya instalada

publicado por: Anonymous

tengo el siguiente codigo pero no reconoce el archivo

String dir = Environment.getExternalStorageDirectory() + "/" + Environment.DIRECTORY_DOWNLOADS + "/"+nombPdf;//Directory()+"/2555524_01012018_2390_RTF.pdf";//
    Toast.makeText(context, dir, Toast.LENGTH_LONG).show();
    File arch = new File(dir);
    if (arch.exists()) {
        Uri uri = Uri.parse(String.valueOf(arch));
        Intent intent = new Intent(Intent.ACTION_VIEW );
        intent.setData(uri);
        intent.setType( "application/pdf");
        intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
        intent.setPackage("com.adobe.reader");
        intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        try {
            Intent chooser = null;
            chooser = Intent.createChooser(intent, "Abrir factura");
            startActivity(intent);
            //startActivity(intent);
        } catch (ActivityNotFoundException e) {
            Toast.makeText(context, "No existe una aplicación para abrir el PDF", Toast.LENGTH_SHORT).show();
        }
    }

y los siguientes permisos en el manifest

<application
    android:allowBackup="true"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:roundIcon="@mipmap/ic_launcher_round"
    android:supportsRtl="true"
    android:theme="@style/AppTheme">

    <activity android:name=".MainActivity">

        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <action android:name="android.intent.action.VIEW"/>
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
</application>

solución

Ya encontré el problema era por la necesidad de usar file provider en las nuevas versiones de android
este sería el codigo que debería ir en el archivo manifest

    <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/file_paths" />
    </provider>

este sería el código a poner en el xml que contiene las rutas de los archivos

    <?xml version="1.0" encoding="utf-8"?>
    
    <paths xmlns:android="http://schemas.android.com/apk/res/android">
        <external-path name="external_files" path="." />
    </paths>

y este el de la función que abre los archivos

    String s= String.valueOf(file);
    File arch = new File(s);
    if (arch.exists()) {
        Uri uri = FileProvider.getUriForFile(getContext(), getActivity().getApplicationContext().getPackageName() + ".provider", arch);
        Intent intent = new Intent(Intent.ACTION_VIEW );
        intent.setDataAndType(uri, "application/pdf");
        intent.setFlags(Intent.FLAG_ACTIVITY_NO_HISTORY);
        intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
        try {
            startActivity(intent);
        } catch (ActivityNotFoundException e) {
            Utils.showSnackBar(root.getResources().getString(R.string.error_pdf), root);
    }
Respondido por: Anonymous

Leave a Reply

Your email address will not be published. Required fields are marked *