You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android 11(Build.VERSION_CODES.R)下如何重命名图片文件夹?

Android 11+ 文件夹重命名失败问题修复

问题分析

你的代码存在三个核心问题导致文件夹无法重命名:

  1. 变量覆盖逻辑混乱:重新定义了ext变量,覆盖了原路径变量,导致重命名操作的目标对象完全错误。
  2. 重命名路径逻辑错误:你试图将原文件夹重命名为自身子目录下的文件,这不符合文件系统的重命名规则,正确的目标路径应该是原文件夹父目录下的新名称。
  3. Android 11+ API使用错误:File.renameTo()在Android 11+对外部存储公共目录已失效,必须使用存储访问框架(SAF)或MediaStore API完成文件夹/文件的修改操作;你调用的MediaStore.createWriteRequest仅请求了媒体文件修改权限,但未关联到正确的重命名逻辑。

修正代码(使用SAF实现文件夹重命名)

如果你的需求是重命名外部存储中的文件夹,建议使用SAF来获取文件夹的修改权限并执行重命名:

// 定义请求码
private const val REQUEST_CODE_RENAME_FOLDER = 124

// 启动SAF选择原文件夹,请求修改权限
private fun startFolderRename() {
    val originalFolder = File(bucketData.buckedPath)
    val parentFolder = originalFolder.parentFile ?: return

    val intent = Intent(Intent.ACTION_OPEN_DOCUMENT_TREE).apply {
        putExtra("android.content.extra.SHOW_ADVANCED", true)
        // 指定初始目录为原文件夹的父目录
        val parentUri = DocumentFile.fromFile(parentFolder).uri
        putExtra(DocumentsContract.EXTRA_INITIAL_URI, parentUri)
    }
    startActivityForResult(intent, REQUEST_CODE_RENAME_FOLDER)
}

// 处理权限回调与重命名操作
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
    super.onActivityResult(requestCode, resultCode, data)
    if (requestCode == REQUEST_CODE_RENAME_FOLDER && resultCode == RESULT_OK) {
        data?.data?.let { treeUri ->
            // 持久化权限,避免下次操作重复请求
            contentResolver.takePersistableUriPermission(
                treeUri,
                Intent.FLAG_GRANT_READ_URI_PERMISSION or Intent.FLAG_GRANT_WRITE_URI_PERMISSION
            )

            val originalFolder = File(bucketData.buckedPath)
            val newFolderName = edt.text.toString().trim()
            if (newFolderName.isEmpty()) return@let

            // 获取原文件夹的DocumentFile对象
            val parentDoc = DocumentFile.fromTreeUri(this, treeUri)
            val originalDoc = parentDoc?.findFile(originalFolder.name)

            // 执行重命名
            originalDoc?.renameTo(newFolderName)?.let { success ->
                if (success) {
                    Toast.makeText(this, "文件夹重命名成功", Toast.LENGTH_SHORT).show()
                } else {
                    Toast.makeText(this, "文件夹重命名失败", Toast.LENGTH_SHORT).show()
                }
            }
        }
    }
}

补充说明

  • 若你实际需要重命名的是文件夹内的媒体文件而非文件夹本身,需遍历文件夹内所有媒体文件,通过MediaStore API更新每个文件的DISPLAY_NAME和RELATIVE_PATH字段。
  • Android 11+对外部存储权限限制严格,直接使用File API操作公共目录会被系统拦截,必须通过SAF或MediaStore API完成修改操作。

内容的提问来源于stack exchange,提问作者Nirali Pandya

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 04:10:32