当前位置: 首页 > 工具软件 > SAF > 使用案例 >

Android SAF存储访问框架

平学
2023-12-01

Android SAF存储访问框架

SAF存储访问框架

首先介绍下SAF存储访问框架:在Android 4.4中引入的一套存储访问框架(Storage Access Framework),借助 SAF,用户可轻松在其所有首选文档存储提供程序中浏览并打开文档、图像及其他文件。用户可通过易用的标准界面,以统一方式在所有应用和提供程序中浏览文件,以及访问最近使用的文件。

我们可以通过ACTION_OPEN_DOCUMENTACTION_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)
}

Intentdata中获取选择文件的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

 类似资料: