gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 11:01:43 27 4
gpt4 key购买 nike

我有一个适用于 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);

一旦下载:

    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);

我如何打开它:

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;
}

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

它与任何 PDF App 无关,因为它与 Gmail 共享发送文档时发生相同。

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

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

有什么新想法吗?

最佳答案

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

我的感觉是,自 Android 7(和 7.1)起,Android 可能会将文件保存在临时文件夹中,然后发送 Broadcast FileDownloadedSuccessfully,然后将文件移动到最终目标文件夹。

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

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

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

关于java - Android 7 - 无法显示 PDF(pdf_name 格式无效),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40996935/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com