优雅地在高版本Android将文件保存到磁盘

文章介绍了如何在Android11及以上版本中使用现代方法优雅地存储文件到公共目录,主要涉及ResultAPI和CreateDocument接口,通过contentResolver打开输出流,简化了传统文件操作的复杂性,并且在用户选择保存文件时自动处理权限问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Android对于文件存储的限制正在日趋严格。事实上,从Android 11(Android R)开始,那些传统的文件保存和读取方式统统失效了。

而高版本Android中存/取文件操作,百度到的内容是可行的,但是非常麻烦,比如:

洋洋洒洒一堆又臭又长不知所云的代码😡😡😡。

本文介绍一种现代且优雅的高版本Android存储文件到公共目录的方法(读取的方法见上一篇)。

总共分两步。

1、声明一个保存文件的launcher

Result API是取代ActivityForResult的一个现代Android接口。高版本Android中改变了很多的运行逻辑,比如说在上一篇提到的,如果要读取或者存储一个文件,就调用系统文件窗口,如果用户选择了一个文件而且确定返回了,自然而然也就意味着用户同意该应用读取/存储文件,当然也就不用再申请相关的文件权限,这是理所当然的。

像上篇那样,只需要先声明一个打开系统保存文件的activity(类似于Windows上面的SaveFileDialog),同样只需要一行代码:

val saveFileLauncher = rememberLauncherForActivityResult(contract = CreateDocument("*/*"), onResult = {
        uri ->
        uri?.let {
            val output = context.contentResolver.openOutputStream(it)
            output?.let {
                    os ->
                scope.launch(Dispatchers.IO) {
                    vm.downloadFile(
                        context.fileList(),
                        file,
                        os)
                }
            }
        }
    })

没错,这实际上也确实只是一行代码。😁😁😁

这个启动器(launcher)里面,包含了用户保存文件后的回调,这里直接用contentResolver打开一个输出流,就可以把下载的文件的流输出到输出流中。

2、在合适的位置打开启动器(launcher)

合适位置,比如说button的点击事件里面,也是只需要一行代码:

saveFileLauncher.launch(it)

这里的it,是你想要的默认的保存文件的名字,包含后缀,当然在打开的launcher也是可以修改文件名的。

总共两行代码😁😊🤣

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值