Android存储访问框架——在没有写权限的情况下也能删除

移动开发 2026-07-12

我目前正在用Kotlin开发一个Android应用,遇到了新版存储访问框架(SAF)的一些问题。在我的应用中,用户可以选择两个文件夹,我们把它们称为源文件夹(source)和目标文件夹(target)。应用应该对源文件夹仅具备只读权限,对目标文件夹具备读写权限。我更希望系统能强制执行这一点,这样应用就不会删除它不应该删除的文件。

但问题是应用在这两个文件夹中都能删除文件,我不理解为什么。权限已像这样正确持久化:

//
if (folderType == "source") {
    requireContext().contentResolver.takePersistableUriPermission(
        it,
        Intent.FLAG_GRANT_READ_URI_PERMISSION
    ) 
} else if (folderType == "target") {
    requireContext().contentResolver.takePersistableUriPermission(
        it,
        Intent.FLAG_GRANT_READ_URI_PERMISSION or Intent.FLAG_GRANT_WRITE_URI_PERMISSION
    ) 
}

我也再次确认了:

requireContext().contentResolver.persistedUriPermissions.forEach { perm ->
    Log.i(TAG, "URI: ${perm.uri} | Read: ${perm.isReadPermission} | Write: ${perm.isWritePermission}")
}

它会打印出:

I  URI: content://com.android.externalstorage.documents/tree/primary%3ATest%2FTarget | Read: true | Write: true
I  URI: content://com.android.externalstorage.documents/tree/primary%3ATest%2FSource | Read: true | Write: false

我用以下方式删除文件:

val deleted = DocumentsContract.deleteDocument(resolver, fileUri)

我试图在各种文档页面以及借助ChatGPT来弄清楚,但并不算成功。我的当前假设是情况就是这样,但我并不真正理解为什么,以及如果系统不利用这些权限来强制存储访问,那么这些权限究竟有什么作用。

如果能得到帮助,我将不胜感激。先行感谢!

解决方案

我认为需要重新考虑对源文件夹中文件的保护策略。你可以在 src 目录下使用Room数据库来保护项目文件,或者,在可能的情况下,对这些文件进行编程式保护。看来在Android中使用存储访问框架可能并不是这种场景下最合适的做法。

站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章