为什么我无法在Android Q上打开下载的文件

4

我的应用程序有一个简单的功能,用户可以下载文件并使用任何其他已安装的应用程序打开或共享该文件。 在Android Q之前,我没有遇到任何问题,但是随着新的隐私更改,我不知道如何正确处理这个问题。

我需要执行以下两个步骤:

  1. 使用DownloadManager将文件下载到普通设备“下载”文件夹中(而不是应用程序下载文件夹)
  2. 打开此文件或共享此文件(使用intent)

为了将文件下载到普通的Downloads文件夹中,我使用了下面的代码:

val request = DownloadManager.Request(config.uri)
    .setTitle(title)
    .setDescription(config.description)
    .setNotificationVisibility(notificationVisibility)
    .setDestinationInExternalPublicDir(Environment.DIRECTORY_DOWNLOADS, "filename.pdf")
val downloadId = downloadManager.enqueue(request)

下载完成后,我会获得如下的已下载文件 URI。

val query = DownloadManager.Query().setFilterById(downloadId)
val cursor = downloadManager.query(query)
val fileUriStr = cursor.getString(cursor.getColumnIndex(DownloadManager.COLUMN_LOCAL_URI))
val fileUri = Uri.parse(fileUriStr)

最终,当用户点击“打开”按钮时,我会创建下一个意图。
val mime = context.contentResolver.getType(fileUri)
val intent = Intent()
    .setAction(Intent.ACTION_VIEW)
    .setDataAndType(uri, mime)
    .addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY)
    .addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION)

所有这些解决方案在Android Q之前都能正常工作。在Android Q上,在Intent启动后,我会看到选择目标应用程序的对话框,当我选择目标应用程序后,会出现错误提示,指出此应用程序无法访问该文件(我使用Adobe Reader作为目标应用程序)。

因此,问题是如何在Android 10上正确执行此操作?

P / S / 对不起我的英语不太好。


2
可能与Android 10中的隐私更改有关,详见https://developer.android.com/about/versions/10/privacy/changes#scoped-storage 另外还有即将推出的Android 11,详见https://developer.android.com/preview/privacy/storage - GSala
另外,也许这个链接会有帮助:https://developer.android.com/training/data-storage/shared/media#other-file-types - GSala
1个回答

3

我曾经遇到过同样的问题。我使用了DownloadManager.getUriForDownloadedFile()代替从查询返回的Uri,问题得以解决!我不知道具体是什么原因导致了这个问题,但我发现这个解决方案在较低版本上不起作用。所以最终我使用了这行代码:

var fileUri = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) downloadManager.getUriForDownloadedFile(requestId) else Uri.parse(fileUriStr)

此外,我从这里获取MIME类型:
val mime = cursor.getString(cursor.getColumnIndex(DownloadManager.COLUMN_MEDIA_TYPE))

它适用于所有版本。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接