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
相关产品推荐
相关产品推荐

