为了提高文件的规整程度并让用户可以更好地控制他们的文件,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
展示特定文件夹内的文件和视频
使用以下方法:
请求应用权限https://developer.android.google.cn/training/permissions/requestingREAD_EXTERNAL_STORAGEhttps://developer.android.google.cn/reference/android/Manifest.permission#READ_EXTERNAL_STORAGEMediaColumns.DATAhttps://developer.android.google.cn/reference/kotlin/android/provider/MediaStore.MediaColumns#data
访问照片内的位置信息
如果您的应用使用了分区存储,可以遵循媒体存储指南中的 "照片中的位置信息" 部分进行操作。
注意: 就算您选择停用分区存储,在使用 MediaStore API 访问图像并读取未修改的位置信息时,您也需要请求 ACCESS_MEDIA_LOCATION 权限。
照片中的位置信息https://developer.android.google.cn/training/data-storage/shared/media#location-info-photosMediaStorehttps://developer.android.google.cn/reference/android/provider/MediaStoreACCESS_MEDIA_LOCATIONhttps://developer.android.google.cn/reference/android/Manifest.permission#ACCESS_MEDIA_LOCATION
在单个操作中修改或删除多个媒体文件
您需要根据运行应用的 Android 版本来整合逻辑。
在 Android 11 上运行
使用以下方法:
详细了解如何使用 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 及更低版本上运行
使用以下方法:
WRITE_EXTERNAL_STORAGEhttps://developer.android.google.cn/reference/android/Manifest.permission#WRITE_EXTERNAL_STORAGE
导入已存在的单个图片
如果您想要导入一张已存在的图片 (例如将照片用于用户个人资料),您的应用可以使用自己的 UI 或者系统图片选择器来执行这一操作。
提供您自己的用户界面
使用以下方法:
使用系统选择器
使用 ACTION_GET_CONTENT intent 来要求用户选择要导入的图片。如果您希望过滤系统选择器向用户展示的图片类型,可以使用 setType() 或 EXTRA_MIME_TYPES。
ACTION_GET_CONTENThttps://developer.android.google.cn/reference/android/content/Intent#ACTION_GET_CONTENTsetType()https://developer.android.google.cn/reference/android/content/Intent#setType(java.lang.String)EXTRA_MIME_TYPEShttps://developer.android.google.cn/reference/android/content/Intent#EXTRA_MIME_TYPES
拍摄单张图片
当您想要拍摄一张图片并用于您的应用时 (例如将照片用于用户个人资料),使用ACTION_IMAGE_CAPTURE intent 来要求用户使用设备的相机拍摄一张照片。系统会将拍摄的照片存储于 MediaStore.Images 表中。
ACTION_IMAGE_CAPTUREhttps://developer.android.google.cn/reference/android/provider/MediaStore#ACTION_IMAGE_CAPTUREMediaStore.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 上运行
使用以下方法:
详细信息,请参阅 "使用原始路径访问文件"。
使用原始路径访问文件https://developer.android.google.cn/preview/privacy/storage#media-files-raw-paths
在 Android 10 上运行
如果您的应用目标 API 为 Android 10 (API level 29),请停用分区存储并继续使用 Android 9 及更低版本所使用的方法来执行这类操作。
在 Android 9 及更低版本上运行
使用以下方法:
了解有关 Android 平台文件存储与访问的详细信息,请参阅以下资源:
数据和文件存储概览https://developer.android.google.cn/training/data-storage
如果您想了解更多最新关于使用存储空间的最佳实践,请在 Android 官方中文文档网站或点击阅读原文查看。
Android 存储用例和最佳做法 - Android 官方中文文档https://developer.android.google.cn/training/data-storage/use-cases?hl=zh-CN