Android 13(API33)从Assets复制文件到外部存储失败求助
Android 13(API33)无法写入外部存储的解决方案
核心原因
Android 13对外部存储权限机制做了重大调整:
WRITE_EXTERNAL_STORAGE权限在API33及以上版本中,仅对**媒体文件(图片/音频/视频)**的写入生效,无法再用来写入非媒体类型的文件到公共存储目录(比如你代码中根目录下的Sample文件夹)。- 你当前申请的
READ_MEDIA_*权限仅用于读取媒体文件,和文本文件的写入无关。
推荐解决方案:改用应用专属外部存储(无需额外权限)
应用专属外部存储是Android官方推荐的存储方案,无需申请读写权限,文件仅你的应用可访问,卸载应用时会自动删除,适合保存应用自身需要的文件。
修改代码中的存储目录路径:
// 替换原来的Environment.getExternalStorageDirectory() final File FolderProgramSample = new File(getExternalFilesDir(null), "Sample");
getExternalFilesDir(null)会返回应用专属外部存储的根目录,路径类似/storage/emulated/0/Android/data/[你的包名]/files/,在这个目录下创建文件夹和写入文件不需要任何权限。
备选方案:写入公共存储目录(需特殊权限)
如果你必须将文件写入公共存储(比如根目录的Sample文件夹),需要申请MANAGE_EXTERNAL_STORAGE特殊权限:
- 在Manifest中添加权限:
<uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE" android:minSdkVersion="30" /> <!-- 保留WRITE_EXTERNAL_STORAGE用于兼容低版本 --> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" android:maxSdkVersion="32" />
- 动态请求权限(跳转到系统设置):
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { if (!Environment.isExternalStorageManager()) { Intent intent = new Intent(Settings.ACTION_MANAGE_APP_ALL_FILES_ACCESS_PERMISSION); Uri uri = Uri.fromParts("package", getPackageName(), null); intent.setData(uri); startActivityForResult(intent, 1001); // 可根据需求设置请求码 } }
⚠️ 注意:MANAGE_EXTERNAL_STORAGE权限属于特殊权限,Google Play审核时会严格限制,仅允许文件管理器、备份类等确实需要访问所有文件的应用使用,普通应用不推荐使用。
代码优化点
你的copyFileFromAssetsToStorage方法中,mkdirs()被调用了两次,属于冗余操作,可修改为:
if (!destinationDirectory.exists()) { if (destinationDirectory.mkdirs()) { Log.d("destinationFile", "Directory created successfully"); } else { Log.e("destinationFile", "Failed to create directory"); } }
内容的提问来源于stack exchange,提问作者masm31
相关产品推荐
相关产品推荐

