检查使用DownloadManager下载的文件是否仍存在于设备存储中

时间:2016-12-20 11:49:35

标签: android uri android-contentresolver android-download-manager

我正在使用DownloadManager下载我的应用程序中的所有文件。另外,我保存了enqueue方法返回的所有id。问题是:如何判断文件是否在一段时间后仍然存在?

我正试图以这种方式做到这一点

Cursor c =
        mgr.query(new DownloadManager.Query().setFilterById(lastDownload));

if (c == null || !c.moveToFirst()) {
    // File doesn't exist?
}

但那没用。有时downloadManager会返回一个Cursor,并且moveToFirst调用返回true,但事实上,已下载的文件已从文件系统中删除。

好的,我发现的第二种方式 - 从下载管理器获取内容Uri。另外,我正在阅读有关内容Uri限制的this post。如果我理解正确,简而言之--Uri不保证内容存在,此外,Uri甚至不保证内容是一个文件。无论如何,我认为这种结构应该有效:

try {
    contentResolver.openFileDescriptor(contentUri, "r");
} catch (FileNotFoundException e) {
    // File doesn't exist?
}

但结果非常令人沮丧。有时(绝对随机)应用程序因SecurityException而崩溃。

java.lang.SecurityException: Permission Denial: reading com.android.providers.downloads.DownloadProvider uri content://downloads/all_downloads/1145 from pid=16585, uid=10086 requires android.permission.ACCESS_ALL_DOWNLOADS, or grantUriPermission()

我的问题是:如何检查下载的文件是否存在?为什么应用程序有时会崩溃?它看起来像heisenbug,因为行为绝对是随机的。

1 个答案:

答案 0 :(得分:0)

您是否已为清单添加读取或写入文件的权限。

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

或者如果您正在使用版本23,那么您应该在获取数据之前使用安全权限条件。