web-dev-qa-db-fra.com

Ouverture d'un PDF File utilisant FileProvider URI ouvre un écran vide

Je crée un fichier PDF sur mon application et je l'écris sur le stockage externe, dans le répertoire "Télécharger". Désormais, lorsque je l'ouvre dans mon application avec une action intentionnelle. VIEW utilisant FileProvider uri, Google PDF Viewer affiche un écran vide. Adobe Acrobat ne peut même pas ouvrir le fichier. Voici mon code pour écrire le fichier et ensuite essayer de le montrer. Notez que j'envoie une notification locale et que j'essaie d'ouvrir le fichier via la notification.

try {

                    File mypath=new File( Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS),mParam1.getEmlak_id()+".pdf");
                    document.writeTo(new FileOutputStream(mypath));

                    document.close();

                    NotificationManager notificationManager = (NotificationManager)getContext().getSystemService(Context.NOTIFICATION_SERVICE);

                    File file = new File( Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS),mParam1.getEmlak_id()+".pdf");
                    Uri pdfUri = FileProvider.getUriForFile(getContext(), getContext().getApplicationContext().getPackageName() + ".com.onur.emlakdosyasi.provider", file);
                    Intent intent = new Intent(Intent.ACTION_VIEW);
                    intent.setDataAndType(pdfUri, "application/pdf");
                    intent.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY);
                    intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);

                    //use the flag FLAG_UPDATE_CURRENT to override any notification already there
                    PendingIntent contentIntent = PendingIntent.getActivity(getContext(), 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);

                    Notification notification = new Notification.Builder(getContext())
                            .setContentTitle("title")
                            .setContentText("content")
                            .setSmallIcon(R.drawable.pdficon)
                            .setContentIntent(contentIntent)
                            .setDefaults(Notification.DEFAULT_ALL)
                            .setPriority(Notification.PRIORITY_HIGH)
                            .build();


                    notificationManager.notify(10, notification);

                } catch (FileNotFoundException e) {
                    e.printStackTrace();
                } catch (IOException e) {
                    e.printStackTrace();
                }

Voici mon fournisseur sur AndroidManifest.xml

<provider
        Android:name=".GenericFileProvider"
        Android:authorities="${applicationId}.com.onur.emlakdosyasi.provider"
        Android:exported="false"
        Android:grantUriPermissions="true">
        <meta-data
            Android:name="Android.support.FILE_PROVIDER_PATHS"
            Android:resource="@xml/provider_paths"/>
    </provider>

Et voici les chemins du fournisseur:

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

Notez que je peux ouvrir le fichier enregistré à partir du dossier de téléchargement manuellement. Je ne peux tout simplement pas l'ouvrir avec l'URI fourni par FileProvider.

Changer le champ "exporté" en vrai ne change rien.

8
Onur Yıldırım

J'ai tout essayé pendant des heures et posté ici pour le dernier recours. Après 15 minutes, résolu ..

Pour ceux qui se demandent, j'ai changé l'attribut du nom du fournisseur de

Android:name=".GenericFileProvider"

à

Android:name="Android.support.v4.content.FileProvider"

Je ne sais même pas pourquoi j'ai créé moi-même une classe de fournisseur de fichiers, mais je me rappelle avoir suivi un tutoriel à ce sujet. 

4
Onur Yıldırım

J'ai eu le même problème mais dans mon cas c'était la ligne: 

intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);

c'était manquant.

3
Anders
  File pdfFile = new File(Environment.getExternalStorageDirectory() + "/Ap/" + "manual.pdf");  // -> filename = manual.pdf

    Uri excelPath;

            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {

        excelPath = FileProvider.getUriForFile(mContext, "YourPackageName", pdfFile);
    } else {
        excelPath = Uri.fromFile(pdfFile);
    }
    Intent pdfIntent = new Intent(Intent.ACTION_VIEW);
            pdfIntent.setDataAndType(excelPath, "application/pdf");
            pdfIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
            pdfIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
            pdfIntent.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY);
            try{
        startActivity(pdfIntent);
    }catch(ActivityNotFoundException e){
        Toast.makeText(mContext, "No Application available to view PDF", Toast.LENGTH_SHORT).show();
    }
0
Ap11