您需要根据运行应用的 Android 版本来整合逻辑。
在 Android 11 上运行
使用以下方法:
- 使用 MediaStore.createWriteRequest()) 或 MediaStore.createTrashRequest()) 为应用的写入或删除请求创建待定 intent,然后通过调用该 intent 提示用户授予修改一组文件的权限。
- 评估用户的响应:
- 如果获得了权限,执行修改或删除操作;
- 如果未能获得权限,向用户解释为什么您的应用需要此权限。
详细了解如何使用 Android 11 引入的这些方法执行批量操作。
在 Android 10 上运行
如果您的应用目标 API 为 Android 10 (API level 29),请停用分区存储并继续使用 Android 9 及更低版本所使用的方法来执行这类操作。
在 Android 9 及更低版本上运行
使用以下方法:
- 使用 “请求应用权限” 一文中描述的最佳实践来请求 WRITE_EXTERNAL_STORAGE 权限。
- 使用 MediaStore API 来修改和删除媒体文件。
导入已存在的单个图片
如果您想要导入一张已存在的图片 (例如将照片用于用户个人资料),您的应用可以使用自己的 UI 或者系统图片选择器来执行这一操作。
提供您自己的用户界面
使用以下方法:
使用系统选择器
使用 ACTION_GET_CONTENT intent 来要求用户选择要导入的图片。如果您希望过滤系统选择器向用户展示的图片类型,可以使用 setType()) 或 EXTRA_MIME_TYPES。
拍摄单张图片
当您想要拍摄一张图片并用于您的应用时 (例如将照片用于用户个人资料),使用 ACTION_IMAGE_CAPTURE intent 来要求用户使用设备的相机拍摄一张照片。系统会将拍摄的照片存储于 MediaStore.Images 表中。
与其他应用共享媒体文件
使用 insert()) 方法将记录直接加入 MediaStore。详细信息,可以参阅媒体存储指南中 “添加项目” 部分。
与特定应用共享媒体文件
使用 Android FileProvider 组件,相关内容在 “设置文件分享” 指南中有描述。
从代码或依赖库中使用直接文件路径访问文件
您需要根据运行应用的 Android 版本来整合逻辑。
在 Android 11 上运行
使用以下方法:
- 使用 “请求应用权限” 一文中描述的最佳实践来请求 READ_EXTERNAL_STORAGE 权限。
- 使用直接文件路径访问文件。
详细信息,请参阅 “使用原始路径访问文件”。
在 Android 10 上运行
如果您的应用目标 API 为 Android 10 (API level 29),请停用分区存储并继续使用 Android 9 及更低版本所使用的方法来执行这类操作。
在 Android 9 及更低版本上运行
使用以下方法:
-
使用 “请求应用权限” 一文中描述的最佳实践来请求
WRITE_EXTERNAL_STORAGE
权限。 -
使用直接文件路径访问文件。
打开文档文件
使用 ACTION_OPEN_DOCUMENT
intent 来要求用户通过系统选择器选择需要打开的文件。如果您想要过滤系统选择器展示给用户的文件类型,可以使用 setType()
) 或 EXTRA_MIME_TYPES
。
举例来说,您可以通过以下代码找到所有的 PDF、ODT 和 TXT 文件:
Kotlin 代码
startActivityForResult(
Intent(Intent.ACTION_OPEN_DOCUMENT).apply {
addCategory(Intent.CATEGORY_OPENABLE)
type = “/”
putExtra(Intent.EXTRA_MIME_TYPES, arrayOf(
“application/pdf”, // .pdf
“application/vnd.oasis.opendocument.text”, // .odt
“text/plain” // .txt
))
},
REQUEST_CODE
)
复制代码
Java 代码
Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT);
intent.addCategory(Intent.CATEGORY_OPENABLE);
intent.setType(“/”);
intent.putExtra(Intent.EXTRA_MIME_TYPES, new String[] {
“application/pdf”, // .pdf
“application/vnd.oasis.opendocument.text”, // .odt
“text/plain” // .txt
});
startActivityForResult(intent, REQUEST_CODE);
复制代码
从旧的存储位置迁移现有文件
如果一个目录既不是特定应用的目录,也不是公开共享目录,那么它就会被视为旧版存储位置。如果您的应用创建或使用位于旧版存储位置的文件,我们建议您将应用的文件迁移至可被分区存储访问的位置,同时对应用进行必要的修改,以使用分区存储中的文件。
保留对旧版存储位置的访问以进行数据迁移
您的应用需要保留对旧版存储位置的访问,以便可以将任何文件迁移至可被分区存储访问的位置。您应该的使用的方法取决于您应用的目标 API 级别。
如果您的应用目标平台为 Android 11
- 使用
preserveLegacyExternalStorage
标志来 保留旧版存储模型,这样您的应用就可以在用户将应用升级为目标平台为 Android 11 的新版本时迁移用户数据。
注意: 如果您使用 preserveLegacyExternalStorage ,保持旧存储模型的效果只会在用户卸载应用之前有效。如果用户在运行 Android 11 的设备上安装或重装您的应用,则无论 preserveLegacyExternalStorage 的值是什么,您的应用都无法停用分区存储模型。
- 继续 停用分区存储,以便您的应用可以继续访问运行 Android 10 的设备上旧版存储位置中的文件。
如果您的应用目标平台为 Android 10
停用分区存储,以便您可以更轻松地在多个 Android 版本间保持应用行为不变。
迁移应用数据
当您的应用已经做好迁移的准备时,使用以下方法:
- 检查您应用在工作中是否使用了位于
/sdcard/
目录或其任何子目录中的文件; - 将应用的所有私有文件从现在的
/sdcard/
下的目录中移动至getExternalFilesDir()
) 方法所返回的目录中; - 将所有共享的非媒体文件从现在的
/sdcard/
下的目录中移动至/sdcard/
目录下的一个应用专用子目录;
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则近万的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:Android)

最后
希望本文对你有所启发,有任何面试上的建议也欢迎留言分享给大家。
好了,今天的分享就到这里,如果你对在面试中遇到的问题,或者刚毕业及工作几年迷茫不知道该如何准备面试并突破现状提升自己,对于自己的未来还不够了解不知道给如何规划,来看看同行们都是如何突破现状,怎么学习的,来吸收他们的面试以及工作经验完善自己的之后的面试计划及职业规划。
好了~如果你看到了这里,觉得文章写得不错就给个赞呗?如果你觉得那里值得改进的,请给我留言。一定会认真查询,修正不足。谢谢。
为什么某些人会一直比你优秀,是因为他本身就很优秀还一直在持续努力变得更优秀,而你是不是还在满足于现状内心在窃喜!希望读到这的您能点个小赞和关注下我,以后还会更新技术干货,谢谢您的支持!
《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!
持续努力变得更优秀,而你是不是还在满足于现状内心在窃喜!希望读到这的您能点个小赞和关注下我,以后还会更新技术干货,谢谢您的支持!
《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!