Android 7 - 无法显示 PDF(pdf_name 格式无效)

Chr*_*ian 7 java pdf android

我有一个适用于 Android 4、5 和 6 的应用程序。该应用程序列出了服务器中的远程文件,并允许您从服务器下载它们(PDF 文件)。单击文件后,它会将其下载到“Android 下载文件夹”中,并在下载完成后使用默认 PDF 阅读器打开它。

问题是 Android 7 中的相同代码失败并给出下一个错误:“无法显示 PDF(pdf_name 的格式无效)”。

这很有趣,因为:

  • 如果我访问下载文件夹并单击下载的文件,它会正确打开。
  • 下载完成后,它会显示一条通知,单击它可以正确打开它。

所以只有当同一个应用程序在下载文件后尝试自动打开文件时才会出现问题。

我如何进行下载:

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);
Run Code Online (Sandbox Code Playgroud)

一次下载:

    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);
Run Code Online (Sandbox Code Playgroud)

我如何打开它:

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;
}
Run Code Online (Sandbox Code Playgroud)

关于 FileProvider:我已经使用 FileProvider 实现了,问题是一样的。它与权限无关,下载文件夹是公共文件夹,并且没有引发 SecurityException 或任何其他与权限相关的异常。

它与任何 PDF 应用程序无关,因为它与 Gmail 发生相同的共享以发送文档。

Extrange 行为:当我逐步调试应用程序时,它运行良好。当我正常执行时,它失败了。如果我睡眠或延迟 5 秒,则不起作用。所以只能调试。

关于 Android 7:阅读Android 7的官方更改(https://developer.android.com/about/versions/nougat/android-7.0-changes.html)它说它应该可以工作,但不再推荐这种方式。否则,它不起作用。

有什么新想法吗?

Chr*_*ian 4

经过几天的研究和一些人的参与,我们得出的结论是,Android 在 Android 7 上更改了 DownloadManager 的行为以添加 FileProvider 的权限。(在 Android 7 Changelog 中他们解释了)

我的感觉是,自 Android 7(和 7.1)以来,Android 可能会将文件保存在临时文件夹中,然后发送广播文件下载成功,然后将文件移动到最终目标文件夹。

由于 FileDownloaded Broadcast 在文件移动之前跳转,因此无法打开它。这就是为什么在调试或休眠 10 秒时它就会起作用。

除了停止使用 DownloaderManager 进行下载和打开并实现我自己的之外,没有找到任何解决此问题的方法。(仅用于下载文件,不涉及任何其他操作)。

希望它对下一个发现这个问题的人有所帮助。