Не могу понять, как использовать ACTION_VIEW и Storage Access Framework вместе - PullRequest
0 голосов
/ 25 сентября 2019

Примерно через неделю после того, как я выдернул свои волосы, я наконец закончил и готов обратиться за помощью.

В основном в своем приложении я использую нижеприведенное намерение, чтобы создать новый PDF, что и делается.через Storage Access Framework.

val intent = Intent(Intent.ACTION_CREATE_DOCUMENT)
intent.addCategory(Intent.CATEGORY_OPENABLE)
intent.type = "application/pdf"
intent.putExtra(Intent.EXTRA_TITLE, title)
startActivityForResult(intent, 1234)

После этого я получаю Uri для метода onActivityResult (), например так:

uri = dataIntent.data
if (uri != null) {
    val takeFlags = data.flags and (Intent.FLAG_GRANT_READ_URI_PERMISSION or Intent.FLAG_GRANT_WRITE_URI_PERMISSION)
    contentResolver.takePersistableUriPermission(uri, takeFlags)
    generatePdf(uri)
}

Генерация PDF в порядке, проблема возникает, когда мне нужновызвать ACTION_VIEW для пользователя, чтобы увидеть сгенерированный файл или поделиться файлом с помощью ACTION_SEND.

Пример использования ACTION_VIEW (Да, я использую и Kotlin, и Java):

Intent intent = new Intent();
intent.setAction(Intent.ACTION_VIEW);
intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
intent.setDataAndType(uri, mimeType);
startActivity(intent);

Я не могу на всю жизнь понять, как получить Uri, который другойприложение может использовать.

То, что я пробовал до сих пор:

  • Этот ответ , но выдается следующее исключение: java.lang.IllegalArgumentException:столбец "_data" не существует.Доступные столбцы: [_display_name, _size]
  • DocumentFile, используя DocumentFile.fromFile (файл) , что переводит Uri из content: //com.myapp.provider/root/document/primary:folder-created-by-the-user/generated-pdf.pdf в файл: /// root / document / primary: папка, созданная пользователем /Генерируемый-pdf.pdf , и до сих пор ни одно приложение не может открыть его
  • Многие другие вещи, которые я даже больше не могу вспомнить

Если бы кто-то мог пролить свет наэтот вопрос будет по достоинству оценен.

Ответы [ 2 ]

0 голосов
/ 27 сентября 2019

Как сказали в своем ответе blackapps, мне нужно было реализовать ContentProvider, точнее DocumentProvider.

После этой ссылки и этой ссылки являетсячто в итоге сработало.Я реализовал CustomDocumentProvider, который предоставляет папку в личных файлах моего приложения (context.getFilesDir (). GetAbsolutePath () + "/ folderToExpose"), после этого все файлы, созданные в этой папке, были открыты для других приложений, и я мог использовать ACTION_VIEW и ACTION_SEND.как обычно.

Если кто-то сталкивался с этой проблемой, просто убедитесь, что в папке, которую вы хотите открыть, нет файлов, которые имеют решающее значение для вашего приложения, таких как файлы базы данных, поскольку пользователи будут иметь полный доступ ко всемего содержания.И если это новая папка, обязательно создайте ее, вызвав mkdirs ().

0 голосов
/ 25 сентября 2019

В принципе используйте тот же URI, который был получен при создании файла.Но ... вы не можете дать разрешение на чтение URI для этого URI.Ты понял.Но вы не можете переслать такое разрешение зрителю вашего документа.

Вместо этого вам следует реализовать ContentProvider.Затем вы можете обслуживать содержимое вашего файла.

...