#Android开发杂记--新版安卓(SDK>=29)中的文件读写方法
- 引言
- 文件读取
- 文件写入
引言
众所周知,随着 Android 版本的升级,以下两个用来读写文件的权限逐渐被弃用:
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
在新版本的安卓中想要进行文件读写可真不是一件容易的事,笔者翻阅了无数文档后,最终找到了最简单的方法,并且不需要申请上述两个权限。
文件读取
在新版安卓中,想要进行文件读取,需要用到 Storage Access Framework(SAF)。这是安卓官方推出的专门用于访问设备上的文档和其他文件的一组API。它提供了一种标准化的方式,让应用程序能够与设备的存储空间(包括内部存储和外部存储,如SD卡)进行交互,而无需了解具体的文件系统路径或权限细节。
使用Storage Access Framework,应用程序可以获得用户授权来访问设备上的文件,而无需直接请求文件系统权限。这使得用户可以更精细地控制他们的数据,并且有助于提高应用程序的安全性和可移植性。
示例代码如下所示:
registerForActivityResult(ActivityResultContracts.StartActivityForResult()) {
contentResolver.openInputStream(it.data!!.data!!)!!.buffered().reader().use { reader ->
val value = reader.readText()
println(value)
}
}.launch(Intent(Intent.ACTION_OPEN_DOCUMENT).setType("*/*"))
文件写入
ContentResolver是一个关键的类,用于管理应用程序与系统中各种数据源之间的交互。它提供了一种统一的接口,让应用程序可以访问和操作各种类型的数据,包括数据库、文件系统、网络资源等。
示例代码如下所示:
val content = ContentValues()
content.put(MediaStore.Downloads.DISPLAY_NAME, "abc.ts")
contentResolver.insert(MediaStore.Downloads.EXTERNAL_CONTENT_URI, content)?.let {
contentResolver.openOutputStream(it)?.buffered().use { writer ->
writer?.write(data)
}
}