为了提高文件的规整程度并让用户可以更好地控制他们的文件,Android 10 为应用引入了名为 "分区存储" 的新范式。分区存储改变了应用在外置存储中保存和访问文件的方式,为了帮您迁移应用并支持分区存储,我们概括了常见用例的最佳实践并分享给大家。本文分为上下两篇,分别为您介绍处理媒体文件和非媒体文件的用例和最佳实践,供您参考。

  • 分区存储

    https://developer.android.google.cn/training/data-storage#scoped-storage

处理媒体文件

这部分内容描述了处理媒体文件 (如视频、图片、音频文件) 的一些常见用例,并概要说明了应用可以使用的方法。我们制作了一个简单的图片,列出了每种用例以及其在不同系统版本的实践总结:

展示多个文件夹中的图片和视频文件

使用 query() API 查询媒体集合。您可以通过调整 projection、 selection、 selectionArgs 与 sortOrder 参数来对媒体文件进行过滤和排序。

  • query()https://developer.android.google.cn/reference/android/content/ContentResolver#query(android.net.Uri,%20java.lang.String%5B%5D,%20java.lang.String,%20java.lang.String%5B%5D,%20java.lang.String,%20android.os.CancellationSignal)
  • 查询媒体集合https://developer.android.google.cn/training/data-storage/shared/media#query-collection

展示特定文件夹内的文件和视频使用以下方法:

  1. 使用 "请求应用权限" 一文中描述的最佳实践来请求 READ_EXTERNAL_STORAGE 权限。

  2. 使用 MediaColumns.DATA 中的值来检索媒体文件,其中包含了磁盘中媒体文件的绝对文件系统路径。

  • 请求应用权限https://developer.android.google.cn/training/permissions/requesting
  • READ_EXTERNAL_STORAGEhttps://developer.android.google.cn/reference/android/Manifest.permission#READ_EXTERNAL_STORAGE
  • MediaColumns.DATAhttps://developer.android.google.cn/reference/kotlin/android/provider/MediaStore.MediaColumns#data

访问照片内的位置信息

如果您的应用使用了分区存储,可以遵循媒体存储指南中的 "照片中的位置信息" 部分进行操作。

注意: 就算您选择停用分区存储,在使用 MediaStoreAPI 访问图像并读取未修改的位置信息时,您也需要请求 ACCESS_MEDIA_LOCATION权限。

  • 照片中的位置信息https://developer.android.google.cn/training/data-storage/shared/media#location-info-photos
  • MediaStorehttps://developer.android.google.cn/reference/android/provider/MediaStore
  • ACCESS_MEDIA_LOCATIONhttps://developer.android.google.cn/reference/android/Manifest.permission#ACCESS_MEDIA_LOCATION

在单个操作中修改或删除多个媒体文件

您需要根据运行应用的 Android 版本来整合逻辑。

在 Android 11 上运行

使用以下方法:

  1. 使用 MediaStore.createWriteRequest() 或 MediaStore.createTrashRequest() 为应用的写入或删除请求创建待定 intent,然后通过调用该 intent 提示用户授予修改一组文件的权限。

  2. 评估用户的响应:

  • 如果获得了权限,执行修改或删除操作;

  • 如果未能获得权限,向用户解释为什么您的应用需要此权限。

详细了解如何使用 Android 11 引入的这些方法执行批量操作。

  • MediaStore.createWriteRequest()https://developer.android.google.cn/reference/android/provider/MediaStore#createWriteRequest(android.content.ContentResolver,%20java.util.Collection%3Candroid.net.Uri%3E)
  • MediaStore.createTrashRequest()https://developer.android.google.cn/reference/android/provider/MediaStore#createTrashRequest(android.content.ContentResolver,%20java.util.Collection%3Candroid.net.Uri%3E,%20boolean)
  • 执行批量操作https://developer.android.google.cn/preview/privacy/storage#media-batch-operations

在 Android 10 上运行

如果您的应用目标 API 为 Android 10 (API level 29),请停用分区存储并继续使用 Android 9 及更低版本所使用的方法来执行这类操作。

  • 请停用分区存储https://developer.android.google.cn/training/data-storage/use-cases#opt-out-scoped-storage

在 Android 9 及更低版本上运行

使用以下方法:

  1. 使用 "请求应用权限" 一文中描述的最佳实践来请求 WRITE_EXTERNAL_STORAGE 权限。

  2. 使用 MediaStore API 来修改和删除媒体文件。

  • WRITE_EXTERNAL_STORAGEhttps://developer.android.google.cn/reference/android/Manifest.permission#WRITE_EXTERNAL_STORAGE

导入已存在的单个图片

如果您想要导入一张已存在的图片 (例如将照片用于用户个人资料),您的应用可以使用自己的 UI 或者系统图片选择器来执行这一操作。

提供您自己的用户界面

使用以下方法:

  1. 使用 "请求应用权限" 一文中描述的最佳实践来请求 READ_EXTERNAL_STORAGE 权限。

  2. 使用 query() API 查询媒体集合。

  3. 将结果显示到您的 UI 上。

使用系统选择器

使用 ACTION_GET_CONTENTintent 来要求用户选择要导入的图片。如果您希望过滤系统选择器向用户展示的图片类型,可以使用 setType()或 EXTRA_MIME_TYPES。

  • ACTION_GET_CONTENT

    https://developer.android.google.cn/reference/android/content/Intent#ACTION_GET_CONTENT

  • setType()

    https://developer.android.google.cn/reference/android/content/Intent#setType(java.lang.String)

  • EXTRA_MIME_TYPES

    https://developer.android.google.cn/reference/android/content/Intent#EXTRA_MIME_TYPES

拍摄单张图片

当您想要拍摄一张图片并用于您的应用时 (例如将照片用于用户个人资料),使用 ACTION_IMAGE_CAPTUREintent 来要求用户使用设备的相机拍摄一张照片。系统会将拍摄的照片存储于 MediaStore.Images表中。

  • ACTION_IMAGE_CAPTUREhttps://developer.android.google.cn/reference/android/provider/MediaStore#ACTION_IMAGE_CAPTURE
  • MediaStore.Imageshttps://developer.android.google.cn/reference/android/provider/MediaStore.Images

与其他应用共享媒体文件

使用 insert()方法将记录直接加入 MediaStore。详细信息,可以参阅媒体存储指南中 "添加项目" 部分。

  • insert()

    https://developer.android.google.cn/reference/android/content/ContentResolver#insert(android.net.Uri,%20android.content.ContentValues)

  • 添加项目

    https://developer.android.google.cn/training/data-storage/shared/media#add-item

与特定应用共享媒体文件

使用 Android FileProvider组件,相关内容在 "设置文件分享" 指南中有描述。

  • 设置文件分享

    https://developer.android.google.cn/training/secure-file-sharing/setup-sharing

从代码或依赖库中使用直接文件路径访问文件

您需要根据运行应用的 Android 版本来整合逻辑。

在 Android 11 上运行

使用以下方法:

  1. 使用 "请求应用权限" 一文中描述的最佳实践来请求 READ_EXTERNAL_STORAGE 权限。

  2. 使用直接文件路径访问文件。

详细信息,请参阅 "使用原始路径访问文件"。

  • 使用原始路径访问文件https://developer.android.google.cn/preview/privacy/storage#media-files-raw-paths

在 Android 10 上运行

如果您的应用目标 API 为 Android 10 (API level 29),请停用分区存储并继续使用 Android 9 及更低版本所使用的方法来执行这类操作。在 Android 9 及更低版本上运行使用以下方法:

  1. 使用 "请求应用权限" 一文中描述的最佳实践来请求 WRITE_EXTERNAL_STORAGE 权限。
  2. 使用直接文件路径访问文件。

了解有关 Android 平台文件存储与访问的详细信息,请参阅以下资源:

  • 数据和文件存储概览

    https://developer.android.google.cn/training/data-storage

  • Android 存储用例和最佳做法 - Android 官方中文文档

    https://developer.android.google.cn/training/data-storage/use-cases?hl=zh-CN

  推荐阅读:

  Android自定义View基础

Android自定义View-视图动画

Android自定义View-属性动画

Android自定义View-路径动画

Android自定义View-SVG动画

欢迎关注微信公众号:Android技术堆栈

android文件选择器_Android存储空间的最佳实践(上)相关推荐

  1. android 文件选择器_Android 开发 打开系统文件、图片、视频等 实现单选多选功能...

    在网上搜下,如何实现图片的多选或者文件的多选,令人纳闷的是居然多是moudle.或第三方jar包,当然第三方的工程功能复杂或兼容性比较好,并没有说明Android系统是如何提供多选的. 既然这么多图片 ...

  2. android pick file,Materia风格的Android文件选择器:MaterialFilePicker_Android_移动开发

    一个Materia风格的Android文件选择器. 打开文件选择器: Intent intent = new Intent(this, com.nbsp.materialfilepicker.ui.F ...

  3. Android 文件选择器 DFileSelector

    源码地址:https://github.com/mengzhinan/FileSelector 前段时间准备给朋友做一个手机小工具,需要用到选择文件并读取里面的内容. 这个读扩展卡选择文件的功能呢,其 ...

  4. android服务中定时清理,Android中(Service )服务的最佳实践——后台执行的定时任务...

    Android中的定时任务一般有两种实现方式,一种是使用Java API里提供的Timer类,一种是使用Android的Alarm机制.这两种方式在多数情况下都能实现类似的效果,但Timer有一个明显 ...

  5. 《深入理解Android:Telephony原理剖析与最佳实践》一1.3 Android Telephony框架结构...

    1.3 Android Telephony框架结构 前面对Android手机操作系统整体框架结构及每一层进行了简单的分析和说明,相信大家对Android智能手机操作系统有了一些基本的了解和认识.结合前 ...

  6. android sqlite批量操作,Android: SQLite批量插入数据的最佳实践

    大家都知道,Android里数据库用的是SQLite.在实际开发过程中,我们有时候会遇到批量插入数据的场景.这篇文章给大家分享一个小技巧,让批量插入数据达到最快的目的. 首先,我先创建一个Table, ...

  7. android文件选择器_支付宝小程序设计规范(内附PSD+Sketch源文件)

    小程序已在我们的生活场景中不断应用,在继微信小程序正式推出后,国内互联网巨头都陆续推出了自家的小程序平台,如:支付宝小程序.百度小程序.抖音小程序.头条小程序等:当然每个平台的小程序都有属于自己的设计 ...

  8. Android基础知识 - SQLite数据库的最佳实践(使用事务、升级数据库的最佳写法)

    目录 使用事务 升级数据库的最佳写法 使用事务 SQLite数据库时支持事务的,事务的特性可以保证让某一系列的操作要么全部完成,要么一个都不会完成. 那么在什么情况下才需要使用事务呢? 想象以下场景, ...

  9. 《深入理解Android:Telephony原理剖析与最佳实践》一1.1 智能手机的系统结构

    1.1 智能手机的系统结构 Android手机的基本硬件结构是符合智能手机的基本硬件结构,我们要学习Android移动开发,首先需要了解智能手机的硬件系统基本结构. 随着通信领域的快速发展,移动终端发 ...

最新文章

  1. [shell] 让你提升命令行效率的 Bash 快捷键 [完整版]
  2. 基本数据类型转换 || 自动类型转换与强制类型转换
  3. 什么叫Web前端?web前端HTML5学习方法分享
  4. C# WebBrowser 取 window.open 新窗口 url的方法
  5. yy自动语音接待机器人_人脸签到、发言记录,会议机器人来啦
  6. 中兴c600olt数据配置_中兴天机Axon 10 Pro再掀波澜,4G版3199元起,5G版还有悬念?...
  7. docker快速入门_Docker标签快速入门
  8. 一些算法题,欢迎来改进
  9. 基于 Spring Boot 开发 OA 开源产品
  10. Fedora32升级Fedora33后无线网络无法连接的问题
  11. JS 数字,金额用逗号隔开
  12. RHEL6.1在字符模式下安装图形界面
  13. javascript 原生事件综合查询
  14. linux ntfs 介绍
  15. php上传文件+(中文转换为拼音的类)+ 输入字符提示信息+根据头部信息给出相对应得二维码扫描...
  16. 四川大学计算机学院优秀毕业论文,(完整版)四川大学本科_毕业论文(设计)_有关规定...
  17. NOI国家集训队论文分类整理
  18. 端午节谋定顺应自然-农业大健康·万祥军:根植古代农耕文化
  19. c#的chart标题_C#之Chart篇
  20. opengl导入3DS文件(带纹理)之填坑

热门文章

  1. c语言按行存储数据库,C语言实现按行读写文件
  2. SQL语言之DQL语言学习(三)排序查询
  3. 解决Ubuntu,su: 认证失败
  4. python3函数可变输入参量
  5. Python 常用排序Demo|冒、插、快、希等入门算法
  6. 6种Python字符串反转方式
  7. python递归函数错误使用方式
  8. python-自定义@修饰符
  9. c语言内存拷贝 memcpy()函数
  10. shape的各种获取、更改以及设置方式辨析