当前位置: 首页 > 知识库问答 >
问题:

在Android11上写很多文件

百里锋
2023-03-14

我正在尝试创建许多文件,作为用户的一个功能。例如,我可能会编写一个应用程序,为他们过去几周听的每首歌创建一个文件(例如,一个带有歌词的文本文件)。我不能让用户为我生成的每个文件选择目录和文件名,这将花费他们数小时的时间。用户应该可以从其他应用程序访问这些文档。

在Android11中,存储访问框架似乎没有什么用处。我注意到最初有两个有趣的选项:

  1. 创建一个新文件(该文件创建启动用户与之交互的活动,以仅保存一个文件),如下所述
  2. 授予对目录内容的访问权限(允许读取访问,但无法写入任何文档),如下所述。
  3. 注意:如果您以Android 10为目标并请求write_external_storage,则已经存在解决方案。不幸的是,这个权限在Android11上被拒绝了。因此,我不能使用这里发布的解决方案。
  4. 使用存储访问框架(特别是action_open_document_tree)访问目录,但我无法将文件写入此目录。(我得到FileNotFoundException,因为这不是普通路径,而是树路径。)

我想在我的例子中,我需要沿着“管理存储设备上的所有文件”的路线走下去,正如这里所描述的,它涉及使用action_manage_all_files_access_permission启动一个额外的活动。我宁愿不请求许可阅读整个驱动器或使用户进入设置应用程序给予许可。写入文件不需要任何权限...

您将如何处理为用户保存许多(非媒体)文件?

共有1个答案

郁吉星
2023-03-14

有两种方法,但首先,我将定义文件和目录名,稍后将其保存在外部(sdcard)下载文件夹中

val outputFilename = "my_file"
val outputDirectory = "my_sub_directory" // The folder within the Downloads folder, because we use `DIRECTORY_DOWNLOADS`

虽然environment.getExternalStoragePublicDirectory不推荐使用,但它仍然适用于针对Android11并在其上运行的应用程序。

file = File(Environment.getExternalStoragePublicDirectory(
    Environment.DIRECTORY_DOCUMENTS),
    "$outputDirectory/$outputFilename"
)
val outputStream = FileOutputStream(file)

或者,您可以使用Mediastore的文件集合,这里建议Gaurav mall。我不知道纵隔文件收藏...

我用kotlin重写了它,并在这里为写文件进行了修改:

val resolver = context.contentResolver
val values = ContentValues()
// save to a folder
values.put(MediaStore.MediaColumns.DISPLAY_NAME, outputFilename)
values.put(MediaStore.MediaColumns.MIME_TYPE, "application/my-custom-type")
values.put(MediaStore.MediaColumns.RELATIVE_PATH, Environment.DIRECTORY_DOWNLOADS + "/" + outputDirectory)
val uri = resolver.insert(MediaStore.Files.getContentUri("external"), values)
// You can use this outputStream to write whatever file you want:
val outputStream = resolver.openOutputStream(uri!!)
// Or alternatively call other methods of ContentResolver, e.g. .openFile

在下面的两种情况下,对于Android29及以上版本,您不需要write_external_storage

 类似资料:
  • 对于如何在Android11上实现这一点有什么想法吗?BlobManager似乎很合适,但文档很糟糕(我尝试了它,但没有成功:Android11上的新BlobStoreManager读写) 编辑:我尝试了一些其他解决方案: 外部公共存储方式 应用程序“A”可以写入文件,然后读取文件。但另一个应用程序“B”不能读取“A”所写的文件。 我只得到一个访问错误:notificationhelper-rea

  • 我想在Android11上读一个OTG USB,我可以在Android9上列出这样的文件: 问题是为什么我在Android 11上可以读取外存,却不能读取OTG USB?我想要能够在Android11上读取USB OTG。

  • 我想保留一个文件,即使在卸载了我的应用程序在Android11。多亏了Android10和11关于存储的更新,我不能再这样做了。另外,我不想使用数据备份或远程服务器,它必须离线。有什么建议吗?

  • 问题内容: 在两列上可能有hasMany关系吗? 我的表格有两列,和。 我希望我的关系匹配任一列。 在我的模型中 运行查询:。 我需要运行的查询是: 编辑: 我正在使用急切加载,我认为这将影响它的工作方式。 问题答案: 我认为不可能完全按照您的要求去做。 我认为您应该将它们视为独立的关系,然后在模型上创建一个新方法来检索两者的集合。 这样,您仍然可以获得在模型上进行预先加载和关系缓存的好处。

  • 你好,我有错误,如java.lang.NullPointerException上OutputStream out=ftp.storeFileStream(路径);. 你能帮帮我吗?代码编写了第一个图像,并完全停止了编写。这是我的方法代码。。。。。。。。 我将发布两个单独的代码。事实上这是一种方法。 这是NPE错误! java.lang.NullPointerException atcom.scm.

  • http://www.springframework.org/schema/beans/spring-beans-2.5.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd“> 这里context1.xml是由context2.xml编写