百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 编程字典 > 正文

干货分享 | Android 存储空间的最佳实践 (上)

toyiye 2024-07-06 23:50 18 浏览 0 评论

为了提高文件的规整程度并让用户可以更好地控制他们的文件,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_STORAGE
https://developer.android.google.cn/reference/android/Manifest.permission#READ_EXTERNAL_STORAGE
MediaColumns.DATA
https://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-photos
MediaStore
https://developer.android.google.cn/reference/android/provider/MediaStore
ACCESS_MEDIA_LOCATION
https://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_STORAGE
https://developer.android.google.cn/reference/android/Manifest.permission#WRITE_EXTERNAL_STORAGE

导入已存在的单个图片

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

提供您自己的用户界面

使用以下方法:

  1. 使用 "请求应用权限" 一文中描述的最佳实践来请求 READ_EXTERNAL_STORAGE 权限。
  2. 使用 query() API 查询媒体集合。
  3. 将结果显示到您的 UI 上。

使用系统选择器

使用 ACTION_GET_CONTENT intent 来要求用户选择要导入的图片。如果您希望过滤系统选择器向用户展示的图片类型,可以使用 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_CAPTURE intent 来要求用户使用设备的相机拍摄一张照片。系统会将拍摄的照片存储于 MediaStore.Images 表中。

ACTION_IMAGE_CAPTURE
https://developer.android.google.cn/reference/android/provider/MediaStore#ACTION_IMAGE_CAPTURE
MediaStore.Images
https://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 存储用例和最佳做法 - Android 官方中文文档
https://developer.android.google.cn/training/data-storage/use-cases?hl=zh-CN

相关推荐

为何越来越多的编程语言使用JSON(为什么编程)

JSON是JavascriptObjectNotation的缩写,意思是Javascript对象表示法,是一种易于人类阅读和对编程友好的文本数据传递方法,是JavaScript语言规范定义的一个子...

何时在数据库中使用 JSON(数据库用json格式存储)

在本文中,您将了解何时应考虑将JSON数据类型添加到表中以及何时应避免使用它们。每天?分享?最新?软件?开发?,Devops,敏捷?,测试?以及?项目?管理?最新?,最热门?的?文章?,每天?花?...

MySQL 从零开始:05 数据类型(mysql数据类型有哪些,并举例)

前面的讲解中已经接触到了表的创建,表的创建是对字段的声明,比如:上述语句声明了字段的名称、类型、所占空间、默认值和是否可以为空等信息。其中的int、varchar、char和decimal都...

JSON对象花样进阶(json格式对象)

一、引言在现代Web开发中,JSON(JavaScriptObjectNotation)已经成为数据交换的标准格式。无论是从前端向后端发送数据,还是从后端接收数据,JSON都是不可或缺的一部分。...

深入理解 JSON 和 Form-data(json和formdata提交区别)

在讨论现代网络开发与API设计的语境下,理解客户端和服务器间如何有效且可靠地交换数据变得尤为关键。这里,特别值得关注的是两种主流数据格式:...

JSON 语法(json 语法 priority)

JSON语法是JavaScript语法的子集。JSON语法规则JSON语法是JavaScript对象表示法语法的子集。数据在名称/值对中数据由逗号分隔花括号保存对象方括号保存数组JS...

JSON语法详解(json的语法规则)

JSON语法规则JSON语法是JavaScript对象表示法语法的子集。数据在名称/值对中数据由逗号分隔大括号保存对象中括号保存数组注意:json的key是字符串,且必须是双引号,不能是单引号...

MySQL JSON数据类型操作(mysql的json)

概述mysql自5.7.8版本开始,就支持了json结构的数据存储和查询,这表明了mysql也在不断的学习和增加nosql数据库的有点。但mysql毕竟是关系型数据库,在处理json这种非结构化的数据...

JSON的数据模式(json数据格式示例)

像XML模式一样,JSON数据格式也有Schema,这是一个基于JSON格式的规范。JSON模式也以JSON格式编写。它用于验证JSON数据。JSON模式示例以下代码显示了基本的JSON模式。{"...

前端学习——JSON格式详解(后端json格式)

JSON(JavaScriptObjectNotation)是一种轻量级的数据交换格式。易于人阅读和编写。同时也易于机器解析和生成。它基于JavaScriptProgrammingLa...

什么是 JSON:详解 JSON 及其优势(什么叫json)

现在程序员还有谁不知道JSON吗?无论对于前端还是后端,JSON都是一种常见的数据格式。那么JSON到底是什么呢?JSON的定义...

PostgreSQL JSON 类型:处理结构化数据

PostgreSQL提供JSON类型,以存储结构化数据。JSON是一种开放的数据格式,可用于存储各种类型的值。什么是JSON类型?JSON类型表示JSON(JavaScriptO...

JavaScript:JSON、三种包装类(javascript 包)

JOSN:我们希望可以将一个对象在不同的语言中进行传递,以达到通信的目的,最佳方式就是将一个对象转换为字符串的形式JSON(JavaScriptObjectNotation)-JS的对象表示法...

Python数据分析 只要1分钟 教你玩转JSON 全程干货

Json简介:Json,全名JavaScriptObjectNotation,JSON(JavaScriptObjectNotation(记号、标记))是一种轻量级的数据交换格式。它基于J...

比较一下JSON与XML两种数据格式?(json和xml哪个好)

JSON(JavaScriptObjectNotation)和XML(eXtensibleMarkupLanguage)是在日常开发中比较常用的两种数据格式,它们主要的作用就是用来进行数据的传...

取消回复欢迎 发表评论:

请填写验证码