Android 7 - Ne peut pas afficher le PDF (pdf_name est de format non valide)
J'ai une Application qui fonctionne correctement pour Android 4, 5 et 6. L'Application des listes de fichiers à distance sur un serveur et vous permet de les télécharger à partir du serveur (fichiers PDF). Une fois que vous cliquez sur un fichier, il le télécharge sur le "Android dossier "Téléchargements" et quand c'est fini, il l'ouvre avec le lecteur PDF par défaut.
Le problème est que le même code dans Android 7 ne parvient pas donner l'erreur suivante: "Impossible d'afficher le PDF (pdf_name est de format non valide)".
C'est drôle parce que:
- si j'ai accès au dossier de Téléchargements et cliquez sur le fichier téléchargé, il s'ouvre correctement.
- Quand il a fini de télécharger, il affiche une notification, cliquez sur il s'ouvre correctement.
De sorte que le problème se produit uniquement lorsque la même Application tente d'ouvrir le fichier automatiquement après le téléchargement.
Comment je dois le télécharger:
fileName="file.pdf";
request = new DownloadManager.Request(Uri.parse(Constants.GetURL()));
request.setMimeType(mime)
.setTitle(fileName).setVisibleInDownloadsUi(true)
.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE)
.setDescription(mContext.getString(R.string.app_name))
.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED)
.setDestinationInExternalPublicDir(Environment.DIRECTORY_DOWNLOADS, fileName);
enqueue = dm.enqueue(request);
Une fois téléchargé:
Uri path = Uri.parse(c.getString(c.getColumnIndex(DownloadManager.COLUMN_LOCAL_URI)));
//path contains the route where file was downloaded. Something like: file:///storage/emulated/0/Download/file.pdf
Intent pdfOpenintent = IntentHelper.getViewPDFIntent(path);
mContext.startActivity(pdfOpenintent);
Comment je l'ouvre:
public static Intent getViewPDFIntent(Uri path){
Intent i = new Intent(Intent.ACTION_VIEW);
i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
pdfOpenintent.setDataAndType(path, "application/pdf");
return i;
}
Sur FileProvider:
J'ai mis en œuvre à l'aide de FileProvider et le problème est le même. Il n'est pas en rapport avec les autorisations, Télécharger le Dossier est un dossier public, et il n'y a pas de SecurityException de sensibilisation ou de toute autre exception relative aux autorisations.
Il n'est pas en rapport avec un PDF Application, car il arrive la même chose de partage avec Gmail pour envoyer le document.
Extrange comportement: Quand je déboguer l'Application, étape par étape, il fonctionne parfaitement. Lorsque j'exécute la normale, il échoue. Si j'ai mis du sommeil ou de retards de 5 secondes, ne fonctionne pas. Donc, ne fonctionne que le débogage.
Sur Android 7: la Lecture de l'officiel des changements de Android 7 ( https://developer.android.com/about/versions/nougat/android-7.0-changes.html ), il est dit, il doit travailler, mais ne pas recommander plus de cette façon. Sinon, il ne fonctionne pas.
Toute idée nouvelle?
path
? Qu'est-ce que getViewPDFIntent()
?Salut @CommonsWare j'ai modifié le code de répondre à vos questions. Thx.
Un
file
Uri
ne fonctionne pas sur Android 7.0+ une fois que vous augmentez votre targetSdkVersion
à 25 ou plus, de sorte que vous pouvez commencer à bouger à FileProvider
déjà. Et, comme je l'ai demandé précédemment, ce lecteur de PDF que vous voulez utiliser?Salut @CommonsWare , la visionneuse de PDF est demandé une fois qu'il essaie d'ouvrir le fichier, Si vous avez plus de 1, il va demander à qui, sinon, il va utiliser l'application PDF par défaut (Par exemple Google Drive). Le targetSdkVersion est le 23.
"la visionneuse de PDF est demandé une fois qu'il essaie d'ouvrir le fichier, Si vous avez plus de 1, il va demander à qui, sinon, il va utiliser l'application PDF par défaut (Par exemple Google Drive)" -- oui, je suis conscient de cela. Cependant, votre cité le message d'erreur est à venir à partir d'une visionneuse de PDF. À partir du texte de l'erreur, c'est probablement Google Drive, et qui semble avoir de bugs. Vous pouvez essayer certains autres lecteurs de PDF, de déterminer dans quelle mesure le problème, c'est le certains PDF viewer qui est en échec.
OriginalL'auteur Christian | 2016-12-06
Vous devez vous connecter pour publier un commentaire.
Après quelques jours de recherche et de certaines personnes impliquées, nous sommes arrivés à la conclusion que Android a changé le comportement de DownloadManager sur Android 7 pour ajouter des autorisations de FileProvider. (En Android 7 "Changelog", expliquent-ils)
Mon sentiment est que Android depuis Android 7 (et 7.1), est probablement d'enregistrer le Fichier dans un temporelles dossier, puis envoie la Diffusion FileDownloadedSuccessfully, puis il déplace le fichier vers le dossier de destination finale.
Parce que le FileDownloaded Diffusion sauts avant que le fichier est déplacé, il n'est pas capable de l'ouvrir. C'est pourquoi, lors du débogage ou de mettre un sommeil de 10 secondes, puis il travaille.
N'a pas trouvé de solution pour ce problème plus que de cesser d'utiliser DownloaderManager pour télécharger&ouvrir et de mettre en œuvre mon propre. (Uniquement à utiliser pour juste un téléchargement d'un fichier, sans aucune autre action).
Espère que cela aide pour le prochain qui retrouve ce problème.
OriginalL'auteur Christian