android raw获取uri_Android 存储进化:分区存储

一 分区存储概述

Android 10之前,Android的文件存储现象就像个垃圾桶,但凡app取得了存储空间的读写权限WRITE_EXTERNAL_STORAGE,就可以肆意创建文件,难以管理。用户体验也特别差,打开文件管理器,会发现,想找个具体的文件根本无从下手。

1.1 分区存储原则

为了更好地管理自己的文件并减少混乱,加强隐私保护,Android Q开始引入了分区存储机制。外部存储空间被重新设计,按应用私有和公用共享划分。应用只能访问到自己私有空间,或者通过MediaStore API 和Storage Access Framework去访问共享的资源目录。

分区存储主要遵循了三大原则对文件存储进行重新设计:

  1. 记录文件来源:系统会记录文件由哪个应用创建,应用不需要权限就可以对自己创建的文件进行读写;

    MediaStore数据库增加owner_package_name字段记录文件属于哪个应用, 应用卸载后owner_package_name字段会置空,也就是说,卸载重装后,之前创建的文件,已不属于应用创建的了,需要相关存储权限才能再次读写

  2. 应用数据的保护:对外部存储空间进行了访问限制,应用只能访问自身的私有空间或共享空间,即使获得了读写权限,也是无法访问其他应用的私有空间的;

  3. 用户数据保护:当用户下载了一些文件,比如带有敏感信息的邮件附件,这些文件应该对其他应用不可见。添加了pdf、office、doc等文件的访问限制,用户即使申请了存储权限也不能通过MediaStore访问其他应用创建的pdf、office、doc等文件,需要通过Storage Access Framework 框架,由用户参与选择,才能获得访问权限

Android 系统的版本越新,就越依赖于文件的用途而不是位置来确定应用对文件的访问能力

1.2 关于存储方式的兼容和判断

  1. 当targetSdk <= 28时,应用使用传统存储方式;
  2. 当targetSdk <= 29时,可以通过在应用清单的application标签中添加android:requestLegacyExternalStorage="true" ,从而关闭分区存储功能,继续使用传统访问方式。
  3. 当targetSdk>>=30时,Android会强制执行分区存储,无法关闭。
  4. 可以通过Environment.isExternalStorageLegacy()判断应用存储的运行方式,true表示以传统的兼容方式运行,false表示以分区存储运行

注意:当修改了requestLegacyExternalStorage属性的值,必须要卸载掉旧APK,重新安装才会生效

二 存储空间的影响

Android 提供了两类物理存储位置内部存储空间和外部存储空间。在大多数设备上,内部存储空间小于外部存储空间。不过,所有设备上的内部存储空间都是始终可用的,因此在存储应用所依赖的数据时更为可靠。

可移除卷(例如 SD 卡)在文件系统中属于外部存储空间。空间较大,现在的智能机基本都配有,但为了兼容性,也可在使用相关api时检查该空间是否处于可用状态。Environment.getExternalStorageState()

// 是否可读写
fun isExternalStorageWritable(): Boolean {
    return Environment.getExternalStorageState() == Environment.MEDIA_MOUNTED
}

// 是否可读
fun isExternalStorageReadable(): Boolean {
     return Environment.getExternalStorageState() in
        setOf(Environment.MEDIA_MOUNTED, Environment.MEDIA_MOUNTED_READ_ONLY)
}
复制代码
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值