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也是可以修改文件名的。
总共两行代码😁😊🤣