Android 13写入存储权限授予方法及目录创建、图片保存问题
Android 13 下解决存储写入与目录创建问题
核心权限变化说明
Android 13(API 33)弃用了WRITE_EXTERNAL_STORAGE权限,针对不同存储场景,权限要求完全不同,以下是对应解决方案:
1. 保存图片到公共媒体目录(如DCIM、Pictures)
不需要额外申请写入权限,仅需已有的READ_MEDIA_IMAGES权限即可,通过MediaStore API完成写入,无需手动创建目录(系统会自动维护媒体目录结构)。
示例代码:
fun saveBitmapToPublicPictures(context: Context, bitmap: Bitmap, fileName: String) { val contentValues = ContentValues().apply { put(MediaStore.Images.Media.DISPLAY_NAME, fileName) put(MediaStore.Images.Media.MIME_TYPE, "image/png") put(MediaStore.Images.Media.RELATIVE_PATH, Environment.DIRECTORY_PICTURES + "/YourAppFolder") } val resolver = context.contentResolver val uri = resolver.insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, contentValues) uri?.let { resolver.openOutputStream(it)?.use { outputStream -> bitmap.compress(Bitmap.CompressFormat.PNG, 100, outputStream) } } }
注:
RELATIVE_PATH指定的子目录如果不存在,系统会自动创建,无需手动调用mkdirs()。
2. 保存到应用私有外部存储目录
完全不需要任何权限,这个目录属于应用私有空间,其他应用无法访问,应用卸载时会被自动删除。
示例代码:
fun saveBitmapToPrivateStorage(context: Context, bitmap: Bitmap, fileName: String) { // 获取应用私有外部存储的Pictures目录 val privateDir = File(context.getExternalFilesDir(Environment.DIRECTORY_PICTURES), "YourAppFolder") if (!privateDir.exists()) { privateDir.mkdirs() // 这里创建目录不需要权限 } val file = File(privateDir, fileName) FileOutputStream(file).use { outputStream -> bitmap.compress(Bitmap.CompressFormat.PNG, 100, outputStream) } }
3. 需创建自定义公共目录(如外部存储根目录下的自定义文件夹)
这种场景需要申请MANAGE_EXTERNAL_STORAGE特殊权限,注意:Google Play对该权限的审核非常严格,仅允许文件管理器、备份类等特定类型应用使用,普通应用不建议采用此方案。
申请步骤:
- 在
AndroidManifest.xml中添加权限:
<uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE" android:minSdkVersion="30" />
- 动态引导用户开启权限:
fun requestManageStoragePermission(context: Context) { if (!Environment.isExternalStorageManager()) { val intent = Intent(Settings.ACTION_MANAGE_APP_ALL_FILES_ACCESS_PERMISSION).apply { data = Uri.parse("package:" + context.packageName) } context.startActivity(intent) } }
内容的提问来源于stack exchange,提问作者sukhvinder singh
相关产品推荐
相关产品推荐

