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

Android 11(API 29+)下能否将共享存储文件复制到应用私有文件夹?

Android 11共享存储文件复制到应用私有文件夹说明

首先明确结论:Android 11系统完全允许将共享存储的文件复制到应用私有文件夹,只要遵循分区存储的权限规则即可实现。

相关规则要点整理:

  • Android 11(API 30)强制启用分区存储,API 29可用的requestLegacyExternalStorage退避配置在API 30及以上版本自动失效,但不会影响合法的文件复制操作
  • 访问共享存储的媒体类文件(图片/音频/视频)只需申请对应读取权限即可(Android 12及以下申请READ_EXTERNAL_STORAGE,Android 13及以上按文件类型申请READ_MEDIA_IMAGES/READ_MEDIA_AUDIO/READ_MEDIA_VIDEO权限)
  • 访问共享存储的非媒体类文件,只需通过系统文件选择器让用户主动授权选中对应文件即可读取
  • 应用私有目录本身无需额外权限即可读写,只要成功获取共享存储文件的读取流,就可以直接写入私有目录完成复制

你给出的代码是将应用内文件写入共享存储相册的实现,对应代码如下:

try {
    if (tempFolder.canWrite()) {
        ContentValues values = new ContentValues();
        values.put(MediaStore.Images.Media.DISPLAY_NAME, photoNamegagalery);
        values.put(MediaStore.Images.Media.MIME_TYPE, "image/jpeg");
        values.put(MediaStore.Images.Media.RELATIVE_PATH, Environment.DIRECTORY_PICTURES);
        Uri uri = getContentResolver().insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values);
        OutputStream imageOutStream = getContentResolver().openOutputStream(uri);

        String destinationImagePath = File.separator + photoNamegagalery;
        File source = new File(selectedImagePath);
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
            Bitmap bitmap = ImageDecoder.decodeBitmap(ImageDecoder.createSource(getContentResolver(), Uri.fromFile(source)));
            try {
                bitmap.compress(Bitmap.CompressFormat.JPEG, 100, imageOutStream);
            } finally {
                imageOutStream.close();
            }
        }
}

如果是从共享存储复制到应用私有目录,核心逻辑就是读取共享存储文件的输入流,写入私有目录的输出流即可,不需要额外的特殊权限。

内容的提问来源于stack exchange,提问作者Abraham Mathew

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.13 18:39:01