将文件写入Android Q-范围存储中的可公开访问的文档文件夹

问题描述 投票:1回答:2

背景

迁移到Android Q后,我不再找到合适的方式来获取对documents文件夹(/storage/emulated/0/Documents)的写访问权限

[在有人提到作用域存储的许多其他问题之前,我已经阅读了许多问题,到目前为止,从我所看到的所有解决方案中,所有解决方案都使用应用程序特定目录或仅访问媒体目录(不访问文档文件夹访问权限) )。

据我对Android Q的了解,我可以选择:

  • 使用只能由我的应用程序访问的应用程序特定目录(或我允许访问的应用程序)
  • 允许用户选择要将文件存储在哪里(我认为这可以是公共位置)ACTION_OPEN_DOCUMENT_TREE

问题

我开发的应用程序用于对主题进行测试,测试数据自动存储在可公开访问的Documents文件夹中,类似于:/storage/emulated/0/Documents/myAppName/subjectName/testData-todaysDate.pdf

[当用户想要访问测试数据时,他们将智能手机插入计算机并导航到documents文件夹,其余的很明显。因此,我必须使用可公开访问的存储。还可以想象他们想通过另一个应用程序“同等交易”在手机上打开测试数据!

我正在寻找的解决方案

因此,我正在寻找的解决方案需要能够执行以下操作:

  • 不多次请求许可(一次可以)
  • 在没有用户提示的情况下自动保存测试数据(因为将进行数百次测试)
  • 保存到公共文档文件夹,例如/storage/emulated/0/Documents/
  • 不涉及用户选择目录,因此不ACTION_OPEN_DOCUMENT_TREE
  • 理想情况下,数据是持久的,因此卸载应用程序不会导致数据丢失

[我了解到,Android Q中的这些变化旨在使用户更多地了解应用程序访问数据的方式,但是一旦他们了解了您的应用程序如何使用数据,就不会有问题。

android mediastore android-10.0 scoped-storage
2个回答
2
投票
仅适用于Android Q。

String collection = "content://media/1c11-2404/file"; // One can even write to micro SD card String relative_path = "Documents/MyFolder"; Uri collectionUri = Uri.parse(collection); ContentValues contentValues = new ContentValues(); contentValues.put(MediaStore.MediaColumns.DISPLAY_NAME, displayName); contentValues.put(MediaStore.MediaColumns.MIME_TYPE, mimeType); contentValues.put(MediaStore.MediaColumns.SIZE, filesize); contentValues.put(MediaStore.MediaColumns.DATE_MODIFIED, modified ); contentValues.put(MediaStore.MediaColumns.RELATIVE_PATH, relative_path); contentValues.put(MediaStore.MediaColumns.IS_PENDING, 1) Uri fileUri = context.getContentResolver().insert(collectionUri, contentValues);

拥有一个uri可以打开输出流以写入文件的内容。

0
投票
尝试将此行放入您的Android Q清单文件中:android:requestLegacyExternalStorage =“ true”在应用程序标记中。
© www.soinside.com 2019 - 2024. All rights reserved.