Android 13+ 存储权限适配与 ImageView 图片保存完整指南

云晨同学_4363

云晨同学_4363

2026-11-03

967人浏览

原创

Android 13+ 存储权限适配与 ImageView 图片保存完整指南

本文详解如何在 android api 13 及以上(含 android 11+ 的分区存储变更)中正确申请存储权限,并将 imageview 中的图片安全、合规地保存至外部公共相册目录,涵盖清单声明、运行时权限请求、android 11+ 特殊管理权限处理及兼容性保存逻辑。

本文详解如何在 android api 13 及以上(含 android 11+ 的分区存储变更)中正确申请存储权限,并将 imageview 中的图片安全、合规地保存至外部公共相册目录,涵盖清单声明、运行时权限请求、android 11+ 特殊管理权限处理及兼容性保存逻辑。

在 Android 权限模型持续演进的背景下,尤其是从 Android 11(API 30)引入分区存储(Scoped Storage)并逐步强化限制,再到 Android 13(API 33)正式弃用 WRITE_EXTERNAL_STORAGE 运行时权限,仅靠传统 READ/WRITE_EXTERNAL_STORAGE 已无法满足图片保存需求。本文提供一套面向 API 13+ 的生产级解决方案,兼顾向后兼容性与 Google Play 政策合规性。

✅ 正确声明权限(AndroidManifest.xml)

需根据目标 SDK 版本分层声明权限。注意:MANAGE_EXTERNAL_STORAGE 仅限必要场景(如文件管理器类应用),普通应用应优先使用 MediaStore API;而 READ_MEDIA_IMAGES 是 Android 12+ 访问媒体库的必需权限:

<!-- 基础读写(API < 33 仍需声明,但不再触发运行时弹窗) -->
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"></uses-permission><uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" android:maxsdkversion="28"></uses-permission><!-- Android 12+ 访问用户图片库 --><uses-permission android:name="android.permission.READ_MEDIA_IMAGES"></uses-permission><!-- Android 11+ 管理所有文件(谨慎使用!需 Google Play 审核豁免理由) --><uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE" android:minsdkversion="30"></uses-permission>

⚠️ 注意:MANAGE_EXTERNAL_STORAGE 自 Android 13 起受严格限制,若非必需,请改用 MediaStore 直接插入——本文后续保存逻辑已默认采用该推荐方式。

✅ 动态权限请求(ActivityResultLauncher 驱动)

摒弃已废弃的 requestPermissions(),统一使用 ActivityResultLauncher 实现响应式权限处理:

Android SMS Gateway
Android SMS Gateway

自托管短信服务,使用 Android 手机作为网关提供 HTTP API,支持发送/接收短信,兼容主流短信网关。

下载
// 在 Activity 类成员变量中声明
private ActivityResultLauncher<string> permissionLauncher;
private ActivityResultLauncher<intent> manageAllFilesLauncher;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    // ... 初始化代码

    // 1. 普通读写权限(API  {
            if (isGranted) {
                saveImageViewImage(); // 权限通过,执行保存
            } else {
                Toast.makeText(this, "存储权限被拒绝,无法保存图片", Toast.LENGTH_SHORT).show();
            }
        }
    );

    // 2. Android 11+ 管理所有文件权限(跳转系统设置页)
    manageAllFilesLauncher = registerForActivityResult(
        new ActivityResultContracts.StartActivityForResult(),
        result -> {
            if (isPermitted()) {
                saveImageViewImage();
            } else {
                Toast.makeText(this, "请手动开启‘允许管理所有文件’权限", Toast.LENGTH_LONG).show();
            }
        }
    );
}</intent></string>

✅ 权限状态检查与请求逻辑

封装跨版本权限判断,确保逻辑清晰且可维护:

MediaStore.Images.Media.EXTERNAL_CONTENT_URI
  • 不要滥用 MANAGE_EXTERNAL_STORAGE:Google Play 会审核其使用合理性,普通图片保存场景应完全避免。
  • READ_MEDIA_IMAGES 必须声明:Android 12+ 访问相册元数据(如查询已有图片)所必需,即使你只写入。
  • Bitmap 内存管理:大图建议先采样缩放(BitmapFactory.Options.inSampleSize),防止 OOM。
  • 异步执行:图片压缩与 I/O 操作应在后台线程(如 Executors.newSingleThreadExecutor())中进行,避免阻塞主线程。
  • 权限拒绝后引导用户:可在 else 分支中调用 showPermissionRationaleDialog() 提示用户手动开启权限。

通过以上结构化实现,你将获得一个既符合最新 Android 权限规范、又具备强兼容性的图片保存方案——无论目标设备是 Android 13 的 Pixel 8,还是仍在使用的 Android 10 设备,均可稳定运行。

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

android

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
android开发三大框架
android开发三大框架

android开发三大框架是XUtil框架、volley框架、ImageLoader框架。本专题为大家提供android开发三大框架相关的各种文章、以及下载和课程。

2023.08.14

922

4

android是什么系统
android是什么系统

Android是一种功能强大、灵活可定制、应用丰富、多任务处理能力强、兼容性好、网络连接能力强的操作系统。本专题为大家提供android相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.22

2747

5

android权限限制怎么解开
android权限限制怎么解开

android权限限制可以使用Root权限、第三方权限管理应用程序、ADB命令和Xposed框架解开。详细介绍:1、Root权限,通过获取Root权限,用户可以解锁所有权限,并对系统进行自定义和修改;2、第三方权限管理应用程序,用户可以轻松地控制和管理应用程序的权限;3、ADB命令,用户可以在设备上执行各种操作,包括解锁权限;4、Xposed框架,用户可以在不修改系统文件的情况下修改应用程序的行为和权限。

2023.09.19

5477

7

android重启应用的方法有哪些
android重启应用的方法有哪些

android重启应用有通过Intent、PendingIntent、系统服务、Runtime等方法。本专题为大家提供Android相关的文章、下载、课程内容,供大家免费下载体验。

2023.10.18

705

5

Android语音播放功能实现方法
Android语音播放功能实现方法

实现方法有使用MediaPlayer实现、使用SoundPool实现两种。可以根据具体的需求选择适合的方法进行实现。想了解更多语音播放的相关内容,可以阅读本专题下面的文章。

2024.03.01

964

5

Tailwind CSS 如何制作导航栏和卡片
Tailwind CSS 如何制作导航栏和卡片

用 Tailwind CSS 制作导航栏和卡片,可先搭建语义化结构,再组合 Flex、Grid、间距、圆角与阴影类。这里整理横向导航、移动端菜单、卡片网格及悬停效果的相关文章,帮助你把常见页面组件做得清晰且适配不同屏幕。

2026.11.03

0

17

Tailwind CSS 响应式布局怎么写
Tailwind CSS 响应式布局怎么写

Tailwind CSS 响应式布局通常从移动端样式写起,再用 sm、md、lg 等前缀调整不同屏幕宽度下的网格、间距和导航。本专题整理断点配置、Grid 与 Flex 自适应布局及常见溢出问题,帮助你逐步完成多设备适配。

2026.11.03

0

19

Tailwind CSS 常用类名怎么记
Tailwind CSS 常用类名怎么记

Tailwind CSS 类名很多,先按布局、间距、文字、颜色和状态分组记忆,再通过官方文档检索具体写法。本专题结合类名排序、动态拼接失效、自定义实用类等问题,帮助你建立常用类名的速查方法。

2026.11.03

0

12

码上飞入口地址合集
码上飞入口地址合集

本专题汇总了码上飞(CodeFlying)的官方入口地址合集,涵盖官网主站及网页版在线使用入口,支持注册登录后直接在线体验零代码AI应用生成。同时整理了APP端下载渠道与小程序入口,助你快速访问平台,通过自然语言描述需求即可生成应用、小程序或网站。

2026.11.03

0

10

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Excel 教程
Excel 教程

共162课时 | 45.1万人学习

Java 教程
Java 教程

共578课时 | 195.8万人学习

Uniapp从零开始实现新闻资讯应用
Uniapp从零开始实现新闻资讯应用

共64课时 | 9.7万人学习