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

分区存储https://developer.android.google.cn/training/data-storage#scoped-storage

这部分内容描述了处理非媒体文件的一些常见用例,并概要说明了应用可以使用的方法。我们对下述各种用例在不同系统版本的实践也做了一个小结图片,供您参考:

打开文档文件

使用 ACTION_OPEN_DOCUMENT intent 来要求用户通过系统选择器选择需要打开的文件。如果您想要过滤系统选择器展示给用户的文件类型,可以使用 setType() 或 EXTRA_MIME_TYPES。

ACTION_OPEN_DOCUMENT:https://developer.android.google.cn/reference/android/content/Intent#ACTION_OPEN_DOCUMENTsetType():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

举例来说,您可以通过以下代码找到所有的 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

  1. 使用 preserveLegacyExternalStorage 标志来保留旧版存储模型,这样您的应用就可以在用户将应用升级为目标平台为 Android 11 的新版本时迁移用户数据。注意: 如果您使用 preserveLegacyExternalStorage,保持旧存储模型的效果只会在用户卸载应用之前有效。如果用户在运行 Android 11 的设备上安装或重装您的应用,则无论 preserveLegacyExternalStorage 的值是什么,您的应用都无法停用分区存储模型。
  2. 继续停用分区存储,以便您的应用可以继续访问运行 Android 10 的设备上旧版存储位置中的文件。
保留旧版存储模型:https://developer.android.google.cn/preview/privacy/storage#migrate-data-for-scoped-storage停用分区存储:https://developer.android.google.cn/training/data-storage/use-cases#opt-out-scoped-storage

如果您的应用目标平台为 Android 10

停用分区存储,以便您可以更轻松地在多个 Android 版本间保持应用行为不变。

迁移应用数据

当您的应用已经做好迁移的准备时,使用以下方法:

  1. 检查您应用在工作中是否使用了位于 /sdcard/ 目录或其任何子目录中的文件;
  2. 将应用的所有私有文件从现在的 /sdcard/ 下的目录中移动至 getExternalFilesDir() 方法所返回的目录中;
  3. 将所有共享的非媒体文件从现在的 /sdcard/ 下的目录中移动至 Downloads/ 目录下的一个应用专用子目录;
  4. 从 /sdcard/ 目录移除应用程序的旧存储目录。
getExternalFilesDir() https://developer.android.google.cn/reference/android/content/Context#getExternalFilesDir(java.lang.String)

与其他应用共享内容

您可以使用 FileProvider 分享应用的文件给某个其他应用。而对于那些需要互相之间分享文件的所有应用,我们推荐为每一个应用使用内容提供程序,然后在将应用添加到集合中时同步数据。

使用 FileProviderhttps://developer.android.google.cn/training/secure-file-sharing内容提供程序https://developer.android.google.cn/guide/topics/providers/content-provider-basics

缓存非媒体文件

您应使用的方法取决于需要缓存的文件类型。

小型文件或者包含敏感信息的文件: 使用 Context#getCacheDir()https://developer.android.google.cn/reference/android/content/Context#getCacheDir()大型文件或者不包含敏感信息的文件: 使用 Context#getExternalCacheDir()https://developer.android.google.cn/reference/android/content/Context#getExternalCacheDir()

暂时停用分区存储

在您的应用完全兼容分区存储之前,您可以通过以下方法之一停用分区存储:

  • 目标平台设置为 Android 9 (API level 28) 或更低。
  • 如果您的目标平台为 Android 10 (API level 29) 或者更高版本,将您应用 manifest 中的 requestLegacyExternalStorage 属性设置为 "true":
      ...  

注意: 在您将应用的目标 API 更新为 Android 11 (API level 30) 后,如果应用运行在 Android 11 的设备上,系统会忽略 requestLegacyExternalStorage 属性。所以您的应用必须为支持分区存储做好准备,并为使用该设备的用户迁移数据。

系统会忽略 requestLegacyExternalStorage 属性https://developer.android.google.cn/preview/privacy/storage#scoped-storage迁移数据https://developer.android.google.cn/training/data-storage/use-cases#migrate-legacy-storage

为了测试目标 API 为 Android 9 及更低版本的应用在使用分区存储时的行为,您可以通过设置 requestLegacyExternalStorage 的值设置为 false 来使应用选择启用行为。如果要在 Android 11 设备上进行测试,则还可以使用应用兼容性标志在使用或不使用分区存储的情况下测试应用的行为。

应用兼容性标志https://developer.android.google.cn/preview/privacy/storage#test-scoped-storage

了解有关 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

文章转载自:CSDN博主【谷歌开发者】原创文章

android api文档中文版_干货分享 | Android 存储空间的最佳实践 (下)相关推荐

  1. android api文档中文版_什么骚操作,用Android能写后台服务?

    事情是这样子的, 前段时间在浏览github的时候,偶然间发现了一个有趣的项目AndServer,说是能够用Android写一个可运行的后台服务,并且写法还和当前最流行的SpringBoot很类似,于 ...

  2. Java API文档中文版

    Java API文档中文版 Sun 公司提供的Java API Docs是学习和使用Java语言中最经常使用的参考资料之一.但是长期以来此文档只有英文版,对于中国地区的Java开发者来说相当的不便.目 ...

  3. android api文档_【粉丝投稿】无需额外注解的 SpringBoot API文档生成工具

    点击上方"蓝字"关注我们吧! JApiDocs是一个无需额外注解.开箱即用的SpringBoot接口文档生成工具. 编写和维护API文档这个事情,对于后端程序员来说,是一件恼人但又 ...

  4. JAVA API文档 中文版

    在学习Java过程中,学会阅读API文档有时候能帮助我们解决不少问题,API文档就像是字典,在我们需要时候可以很方便的进行查找,奈何很多小伙伴的英文可能不是很好,这里分享一个Java 的API文档的中 ...

  5. 查看Android API文档的正确方式

    AS中简单查看API 在AS中我们可以简单查看函数或类的API,选中我们想要查看的函数或类的代码,按快捷键 Ctrl+Q,AS就会弹出一个简单说明的窗口: 但一般我们的是这样: 那是因为AS去访问Go ...

  6. 如何查看Android API文档

    作为Android开发工程师,不管是APP开发还是系统开发,免不了要各种百度 google.但对一个专业程序猿来说,最靠谱的方式还是要查看google官方的API文档.     但这个文档在哪里,应该 ...

  7. JAVA API文档中文版,网盘下载

    JAVA API 1.9文档中文版,网盘下载 链接:https://pan.baidu.com/s/1FKMSg-7xrvNms44W51vR6Q 提取码:4yg4

  8. python 自动化微信小程序_干货 | 微信小程序自动化测试最佳实践(附 Python 源码)...

    原标题:干货 | 微信小程序自动化测试最佳实践(附 Python 源码) 本文为霍格沃兹测试学院测试大咖公开课<微信小程序自动化测试>图文整理精华版. 随着微信小程序的功能和生态日益完善, ...

  9. android api版本 闪退_经验分享:从事 Android 开发六年,我学到的那些事

    你的代码质量应该随着经验的增加而提高,在本文作者基于 Android 开发者六年间,其都学到了什么? 以下为译文: 六年来,我为多家公司编写过各种应用程序.你编写代码或处理代码库的文化和方式会随着你的 ...

  10. android官方文档中文版_最全实至名归,NumPy 官方早有中文教程,结合深度学习,还有防脱发指南...

    点击 机器学习算法与Python学习 ,选择加星标 精彩内容不迷路 本文转自机器之心 在 Github 上一度蝉联最流行的机器学习和数据科学包 NumPy,已经有了非常之系统的中文文档,回想起当初细啃 ...

最新文章

  1. AJAX的表单请求POST请求方式
  2. python logging模块学习
  3. php探针存在xss漏洞
  4. 可视化——matploblib 解决中文显示的问题
  5. SLAM会议笔记(四)Lego-LOAM
  6. 【5分钟 Paper】Deep Recurrent Q-Learning for Partially Observable MDPs
  7. [转]利用处理程序错误攻击(下)
  8. stm32与绝对式编码器的ssi接口进行通信
  9. Diablo2oo2s Universal Patcher(文件补丁工具) 2.18.3 绿色汉化版
  10. 简单的markdown在线解析服务-pro
  11. python列表元素提取_python提取list中的元素
  12. python暑假培训班
  13. EuroLLVM’19 developers’ meeting program
  14. 英特尔多核平台编码优化大赛就顺便试试身手了
  15. WIN10 kernel security check failure蓝屏解决策略
  16. 深入学习理解java虚拟机--1.win10 下构建64位 openJDK8
  17. 【问题小记】“安装打印机驱动后,依然不可打印”故障排除
  18. CodeBlocks 主题美化(编辑器修改主题)
  19. 笔记本未指定打印机服务器,打印机出现在未指定里怎么办?可以这样解决
  20. 关于TPC协议知识汇总

热门文章

  1. 前端笔记之Vue(五)TodoList实战拆分store跨域练习代理跨域
  2. springboot中的controller注解没有生效
  3. 基于腾讯云的Discuz论坛搭建
  4. Open Database causes ORA-600: kcratr_scan_lastbwr
  5. 导入web项目运行报错找不到包
  6. java反射 反射构造函数 报 wrong number of arguments 错误
  7. SpringBoot+jersey实现
  8. Bootstrap Paginator分页插件(mark)
  9. 【原创】大叔案例分享(4)定位分析--见证scala的强大
  10. CentOS 7 配置DHCP服务器