У меня есть простая функция в моем приложении, пользователь может загрузить файл, а затем открыть его или поделиться им с помощью любого другого установленного приложения. До android Q у меня не было никаких проблем с этим, но с новыми изменениями конфиденциальности я не знаю, как это сделать правильно. Мне нужно сделать следующие два шага:
- Загрузить файл, используя DownloadManager, в общую папку загрузок устройства ( не в папке загрузок приложения )
- Откройте этот файл или поделитесь этим файлом (используя намерение)
Для загрузки файла в общую папку «Загрузки» я использую следующий код
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 после запуска намерения я вижу диалоговое окно для выбора целевого приложения, когда я выбираю целевое приложение, я получаю ошибку, что это приложение не может получить доступ к файлу (я использую Adobe Reader в качестве целевого приложения).
Итак, вопрос как правильно выполнить эту операцию на Android 10?
P / S / Извините за мой плохой английский sh