写点什么

Android 存储空间的最佳实践,【金九银十】

发布于: 2 小时前

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




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


展示特定文件夹内的文件和视频




使用以下方法:


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

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


访问照片内的位置信息




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


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


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




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


在 Android 11 上运行




使用以下方法:


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

  2. 评估用户的响应:


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

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


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


在 Android 10 上运行




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


在 Android 9 及更低版本上运行




使用以下方法:


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

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


导入已存在的单个图片




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


提供您自己的用户界面




使用以下方法:


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

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

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


使用系统选择器




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


拍摄单张图片




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


与其他应用共享媒体文件




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


与特定应用共享媒体文件




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


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




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


在 Android 11 上运行




使用以下方法:


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

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


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


在 Android 10 上运行




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


在 Android 9 及更低版本上运行




使用以下方法:


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

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


打开文档文件




使用?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

评论

发布
暂无评论
Android 存储空间的最佳实践,【金九银十】