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

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特殊权限:

  1. 在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" />
  1. 动态请求权限(跳转到系统设置):
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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 17:56:31