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?

Ce lecteur de PDF que vous voulez utiliser? Que pensez-vous du vent, donnant comme valeur de 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