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.
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.
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.
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();
}