Android 中如何重命名共享存储内通过 MediaStore 创建的文件夹?
分区存储下重命名DCIM/Pictures公共目录文件夹的实现方案
可行性说明
首先明确:分区存储机制下,对自有应用创建的DCIM/Pictures子文件夹执行重命名完全可行,可根据使用场景选择MediaStore或SAF实现。
方案1:使用MediaStore实现(推荐针对自有媒体文件夹场景)
适用场景
仅需要操作你自己应用创建的、仅包含媒体文件的文件夹,无需用户手动授权。
实现逻辑
MediaStore没有直接操作文件夹的API,你可以通过修改该文件夹下所有媒体文件的RELATIVE_PATH字段为新路径,系统会自动完成文件夹的重命名/迁移,旧的空文件夹会被系统自动回收。
代码示例(Android Q及以上)
// 旧文件夹相对路径 String oldRelativePath = Environment.DIRECTORY_DCIM + File.separator + "旧文件夹名"; // 新文件夹相对路径 String newRelativePath = Environment.DIRECTORY_DCIM + File.separator + "新文件夹名"; ContentValues values = new ContentValues(); values.put(MediaStore.Images.Media.RELATIVE_PATH, newRelativePath); // 批量更新该路径下所有你的应用创建的图片 getContentResolver().update( MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values, MediaStore.Images.Media.RELATIVE_PATH + "=? AND " + MediaStore.Images.Media.OWNER_PACKAGE_NAME + "=?", new String[]{oldRelativePath, getPackageName()} );
注意事项
- 如果文件夹中包含非媒体文件,MediaStore无法扫描识别,这类文件不会被同步迁移到新文件夹
- 若要操作其他应用创建的媒体文件夹,需要申请
MANAGE_EXTERNAL_STORAGE权限,该权限仅适用于文件管理类应用,普通应用上架Google Play无法通过审核
方案2:使用存储访问框架(SAF)实现(通用场景)
适用场景
需要操作非自有应用创建的文件夹、文件夹包含非媒体文件,需要更通用的文件夹操作能力。
实现逻辑
通过SAF让用户主动授权文件夹的访问权限,直接调用系统API完成重命名,不需要申请任何特殊权限。
实现步骤
- 唤起系统文件夹选择器,让用户选择要重命名的文件夹的父目录并授权:
Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT_TREE); startActivityForResult(intent, REQUEST_CODE_SAF);
- 在
onActivityResult中拿到授权的父目录Uri,找到要重命名的子文件夹的Uri,调用重命名方法:
@Override protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) { super.onActivityResult(requestCode, resultCode, data); if (requestCode == REQUEST_CODE_SAF && resultCode == RESULT_OK && data != null) { Uri parentTreeUri = data.getData(); // 拿到要重命名的文件夹的DocumentUri String parentDocId = DocumentsContract.getTreeDocumentId(parentTreeUri); String oldFolderDocId = parentDocId + "/旧文件夹名"; Uri oldFolderUri = DocumentsContract.buildDocumentUriUsingTree(parentTreeUri, oldFolderDocId); // 执行重命名 DocumentsContract.renameDocument(getContentResolver(), oldFolderUri, "新文件夹名"); } }
废弃方案说明
分区存储生效后(Android 10及以上),直接使用File.renameTo()操作公共目录文件夹的方式已经彻底失效,File API仅能访问应用私有目录下的文件,对公共目录的访问会抛出权限异常,请勿再使用该方案。
内容的提问来源于stack exchange,提问作者nitnatsnoK
相关产品推荐
相关产品推荐

