检查下载中的自定义文件夹中是不是存在文件 - 不推荐使用 getExternalStoragePublicDirectory
Posted
技术标签:
【中文标题】检查下载中的自定义文件夹中是不是存在文件 - 不推荐使用 getExternalStoragePublicDirectory【英文标题】:Check if file exist inside custom folder in Downloads - getExternalStoragePublicDirectory deprecated检查下载中的自定义文件夹中是否存在文件 - 不推荐使用 getExternalStoragePublicDirectory 【发布时间】:2020-12-16 18:32:14 【问题描述】:我想要实现的是在下载之前检查文件是否存在,这样我就不必再次重新下载它。例如,我必须第一次打开来自互联网“history-of-comics.pdf”的这个 pdf,为此我必须下载它并在我的应用程序中打开,第二次我选择重新-阅读它,我必须确定“history-of-comics.pdf”是否存在于 Downloads/MyDocs 中,我不必浪费资源让用户等待再次下载。目前应用程序 targetSdkVersion 是 29,到目前为止我所做的是:
-
授予 READ_EXTERNAL_STORAGE 和 WRITE_EXTERNAL_STORAGE 的权限
包含在清单 android:requestLegacyExternalStorage="true" 应用标签内
在 MyDocs 中的 Downloads 文件夹中下载 pdf 文件
下面是我的代码的快速示例(我已经评论了我尝试过的其他组合):
private void checkIfPdfExists(String pdfFileName)
String uriFile = String.valueOf(getExternalFilesDir(Environment.DIRECTORY_DOWNLOADS+File.separator+"MyDocs"+File.separator+pdfFileName+".pdf"));
File file = new File(uriFile);
//File file = new File(getExternalFilesDir(Environment.DIRECTORY_DOWNLOADS)+"/MyDocs", pdfFileName+".pdf");
//File file = new File(Environment.DIRECTORY_DOWNLOADS+File.separatorChar+"MyDocs"+File.separatorChar+pdfFileName+".pdf");
//File file = new File(Environment.DIRECTORY_DOWNLOADS+File.separatorChar+"MyDocs", pdfFileName+".pdf");
if (file.exists() && file!=null)
Toast.makeText(getApplicationContext(), file.getPath() + "/n exists", Toast.LENGTH_SHORT).show();
displayFromUri(Uri.parse(file.getPath()));
else
beginDownload("https://www.heritagestatic.com/comics/d/history-of-comics.pdf",pdfFileName);
这就是我在下载 pdf 时定义路径的方式,下载器可以正常工作:
DownloadManager.Request request = new DownloadManager.Request(Uri.parse(url));
request.addRequestHeader("Accept", "application/pdf");
request.setDescription(file_name);
request.setTitle("Getting your doc");
request.setDestinationInExternalPublicDir(Environment.DIRECTORY_DOWNLOADS,"MyDocs/"+file_name+".pdf");
我在发布问题之前做了一些研究,在一些线程中我发现与 Android Q 相关,但我找不到真正的解决方案。任何帮助将不胜感激,在此先感谢!
【问题讨论】:
文件 file = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTOR_DOWNLOADS), "MyDocs/Pdffilename.pdf"); 您唯一的问题是使用正确的文件路径。if (file.exists() && file!=null)
那应该是if ((file!=null ) && file.exists())
否则,如果文件为空,您仍然会收到 NullPointerException。但是您可以更好地删除检查,因为文件永远不会为空。
@blackapps 非常感谢您的帮助。你告诉我的方法似乎工作正常,唯一的“问题”是“getExternalStoragePublicDirectory”已被弃用,我正在开发的应用程序正在很多 Android Q 和 Android R beta 中进行测试,这就是我包含 Q在主题。我尝试使用“context.getExternalFilesDir”而不是“Environment.getExternalStoragePublicDirectory”,但它总是返回这个文件存在,同时它不存在。你能给我一些关于这方面的指示吗?再次感谢!
场景如下。如果您可以使用并使用setDestinationInExternalPublicDir()
,那么您与getExternalStrorageDirectory()
核对。如果您下载到setDestinationInExternalFilesDir()
,则使用getExternalFilesDir()
。以此类推。
【参考方案1】:
我的问题的解决方案是我如何引用文件路径和用于下载的方法。正如@blackapps 提到的,如果您使用“setDestinationInExternalFilesDir”保存文件,则检查文件是否存在的正确方法是使用“getExternalFilesDir”,在我的情况下:
File file = new File(getExternalFilesDir(Environment.DIRECTORY_DOWNLOADS)+File.separator+"MyDocs"+File.separator+pdfFileName+".pdf");
【讨论】:
以上是关于检查下载中的自定义文件夹中是不是存在文件 - 不推荐使用 getExternalStoragePublicDirectory的主要内容,如果未能解决你的问题,请参考以下文章