Android SAF存储访问框架
SAF存储访问框架
首先介绍下SAF存储访问框架:在Android 4.4中引入的一套存储访问框架(Storage Access Framework),借助 SAF,用户可轻松在其所有首选文档存储提供程序中浏览并打开文档、图像及其他文件。用户可通过易用的标准界面,以统一方式在所有应用和提供程序中浏览文件,以及访问最近使用的文件。
我们可以通过ACTION_OPEN_DOCUMENT
或ACTION_OPEN_DOCUMENT_TREE
来选择文件或文件夹,获得对应的URI(在Android系统中的地址)
通过URI与DocumentFile工具类来进行添加、编辑、保存和删除的操作
实例
选择文件
选择文件使用ACTION_OPEN_DOCUMENT
private fun showFileChooser() {
val intent = Intent(Intent.ACTION_OPEN_DOCUMENT)
// 只显示可以打开的文件
intent.addCategory(Intent.CATEGORY_OPENABLE)
// 可选择所有文件类型
intent.type = "*/*"
// 只可选择jpeg图片
// intent.type = "image/jpeg"
startActivityForResult(intent, 1)
}
通过上面代码系统会打开内置的文件管理器,在管理器中选择文件后会回调onActivityResult
override fun onActivityResult(requestCode: Int, resultCode: Int, resultData: Intent?) {
if (resultCode == Activity.RESULT_OK && requestCode == 1) {
resultData?.data?.let {
val inputStream = contentResolver.openInputStream(it)
}
}
super.onActivityResult(requestCode, resultCode, data)
}
在Intent
的data
中获取选择文件的uri
,通过contentResolver.openInputStream(uri)
获取该文件的inputStream
选择文件夹
选择文件夹使用ACTION_OPEN_DOCUMENT_TREE
private fun showFolderChooser() {
val intent = Intent(Intent.ACTION_OPEN_DOCUMENT_TREE)
startActivityForResult(intent, 2)
}
在文件管理器中选择好文件夹后,同样回调onActivityResult
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
if (resultCode == Activity.RESULT_OK && requestCode == 2) {
data?.data?.let {
DocumentFile.fromTreeUri(this, uri)
// 在文件夹内创建新文件夹
?.createDirectory("newFolder")
?.apply {
// 在新文件夹内创建文件
createFile("text/plain", "text.txt")
// 通过文件名找到文件
findFile("text.txt")?.also {
// 在文件中写入内容
contentResolver.openOutputStream(it.uri)
?.write("hello".toByteArray())
}
// 删除文件
?.delete()
}
// 删除文件夹
?.delete()
}
}
super.onActivityResult(requestCode, resultCode, data)
}
上面代码演示了文件夹与文件的创建、编辑和删除的操作
补充:由于SAF支持USB 存储提供程序,因此我们可以用来读写U盘OTG内的文件
参考
https://developer.android.com/guide/topics/providers/document-provider
转载自原文链接, 如需删除请联系管理员。
原文链接:Android SAF存储访问框架,转载请注明来源!