Android 10 分区存储

源码 2024-9-18 11:25:49 89 0 来自 中国
配景

从前,Android 开辟者风俗在根目次建一个自己应用的文件夹,用于存放应用的数据。如许会导致用户卸载后,应用数据不会随之删除。导致手机文件特殊杂乱,长期占用空间,而且容易走漏用户隐私。
实在 Android 早就提供了 getCacheDir()、getFilesDir()、getExternalFilesDir()、getExternalCacheDir() 等 API 供开辟者利用,但是开辟者为了方便,没有去用。
为了办理这个标题,从 Android 10 开始,Google 添加了一个新特性 Scoped Storage,我们称之为分区存储,也可以称为沙盒。
在 Android 10 上,仍然可以通过以下两种本领避开分区存储:

  • targetSdkVersion 设成 29 以下
  • 在 manifest 中设置 android:requestLegacyExternalStorage="true"
在 Android 11 上,requestLegacyExternalStorage 会失效,没有用果。但是又增长了 preserveLegacyExternalStorage 属性,对于覆盖安装的应用还能继承用,但是新应用不能用。
至于 targetSdkVersion,上传到 Google Play 的应用,Google 要求必须设成 30 及以上。
分区存储目次


  • 沙盒目次
    通过 getExternalFilesDir() 等获取到的目次,随着 App 卸载会被删除。
    不外可以在 manifest 中设置 android:hasFragileUserData="true" 让用户选择是否删除。
  • 公共目次
    DCIM、Photos、Images、Videos、Audio、Downloads 等目次, App 卸载后会保存。
访问公共目次

重点说下公共目次,沙盒目次就不详细先容了,沙盒目次可以通过系统提供的接口直接获取,可以直接通过路径读写,也不须要界说任何读写权限,很简单。
访问公共目次须要通过 MediaStore 大概 Storage Access Framework(以下简称 SAF)。媒体文件(图片,音频,视频)能通过 MediaStore 和 SAF 两种方式访问,非媒体文件只能通过 SAF 访问。
MediaStore

关于 READ_EXTERNAL_STORAGE 和 WRITE_EXTERNAL_STORAGE 读写权限,MediaStore 访问应用自身存放到公共目次下的文件不须要申请权限(但是假如应用卸载后重装,之前生存的文件将不属于本应用创建的文件),而假如要访问其他应用生存到公共目次下的文件则须要申请权限
MediaStore 通过 Uri 利用文件。
各个目次的 Uri 如下:
范例UriUri 常量默认路径Imagecontent://media/external/images/mediaMediaStore.Images.Media.EXTERNAL_CONTENT_URIPicturesVideocontent://media/external/video/mediaMediaStore.Video.Media.EXTERNAL_CONTENT_URIMoviesAudiocontent://media/external/audio/mediaMediaStore.Audio.Media.EXTERNAL_CONTENT_URIMusicDownloadcontent://media/external/downloadsMediaStore.Downloads.EXTERNAL_CONTENT_URIDownloadFilecontent://media/external/MediaStore.Files.getContentUri(“external”)Documents写文件
您需要登录后才可以回帖 登录 | 立即注册

Powered by CangBaoKu v1.0 小黑屋藏宝库It社区( 冀ICP备14008649号 )

GMT+8, 2024-12-18 09:48, Processed in 0.189082 second(s), 33 queries.© 2003-2025 cbk Team.

快速回复 返回顶部 返回列表