0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看威廉希尔官方网站 视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

Android(Q)10 上的分区外部存储访问

jf_78858299 来源:GSYTech 作者:恋猫de小郭 2023-05-26 11:00 次阅读

Android(API 29)10 发布至今已经有不少设备完成升级,如:***小米9、Redmi K20pro、华为 P30pro/Mate30pro 、荣耀 v30/v20、Oppo Reno、ONnePlus 7T、谷歌 Pixel ***等都已经升级到 Android 10 的支持,不少应用市场也要求应用需要针对 Android 10 进行适配,其中最大的变更之一就是 scoped storage。

在针对目前 小米、华为、Pixel 的几台 Android 10 手机做了测试,在不设置 requestLegacyExternalStorage 的前提下得到结论(官方还没完全开启限制的前提):

  • 1、targetSDK 用 28 编译的在 Android 10 上还是可以读取到全部文件, 之后覆盖安装一个使用 targetSDK 29 的,还能继续可以访问全路径。
  • 2、卸载后直接用 targetSDK 29 编译的会读取不到。

图片

而官方明确表示:

明年(2020),主要平台版本将要求所有应用都使用分区存储,无论应用的目标 SDK 级别是多少。因此,您应该提前确保您的应用能够使用分区存储。为此,请确保针对搭载 Android 10(API 级别 29)及更高版本的设备启用了该行为。

所以不管是使用 requestLegacyExternalStorage 还是降低 targetSDK 都无法在接下来2020 年的 Android(API 29)10 新版更新中被豁免。

虽然作为 Android 开发会因为无法对用户存储目录“为所欲为”而头痛,但是作为用户却是感觉欣喜的。

因为长期以来 Android 用户的本地存储目录都十分杂乱,开发者只要申请一次权限就可以“为所欲为”地创建和读取本地存储,虽然谷歌在 Android 4.4(API 19))引入了存 SAF(Storage Access Framework) , 但是开发者大部分时候都选择无视。

我甚至想要一个系统标志出这个文件是谁创建的 API ,因为最近遇到这个问题却没有头绪: 为什么相册里总是多出一张空白图片,删了后不久又重现?

官方解读

为了让用户更好地管理自己的文件并减少混乱,Android 10(API 29)开始应用在默认情况下会被要求使用 scoped storage(即分区存储),也就是说应用只能看到自己专有的目录(Context.getExternalFilesDir())以及特定类型的媒体文件。

注意这个是强制性的,但是会有缓冲期,官方明确额表示,除非你的应用真的有强烈需要访问专有目录以及 MediaStore 之外的文件,否则最好使用分区存储。

使用分区存储的应用对自己创建的文件始终拥有读/写权限,无论文件是否位于应用的专有目录内 。这说明了默认分区存储内的文件也只有应用自己能看到,就像是沙盒内,同时 getExternalFilesDir()下的文件会随着应用卸载而清除。

也就是说应用可以无需申请任何权限使用 getExternalFilesDir()MediaStoreSAF 读写文件, 当然如果使用 MediaStore 读取其他应用的媒体集合时,是需要 READ_EXTERNAL_STORAGE

MediaStore 中支持的类型有:

  • 照片:存储在 MediaStore.Images 中。
  • 视频:存储在 MediaStore.Video 中。
  • 音频文件:存储在 MediaStore.Audio 中。

另外还有其他的限制,比如:

  • 应用没有 ACCESS_MEDIA_LOCATION 权限,那么访问到的媒体资源中的 Exif 元数据会被修改.
  • 使用 MediaStore.Files 也仅显示照片、视频和音频文件,例如不会显示表中的 PDF 文件。

总结起来结论就是:

  • 1、获取系统相册、视频,图片等需要通过 SAF ,利用 ContentResolverCursor 来提供。
  • 2、访问公有目录也需要通过 MediaStoreContentResolver ,比如保存图片到外部公共存储,拷贝文件到 Download 目录等等。
  • 3、比如 new File(path).createNewFile(); 等的判断在公共目录下不能再用了。

简单来说就是:应用在自己的沙盒内可以“为所欲为”,通过 MediaStore 可以分类整理文件,通过 SAF 可以访问其他应用的公共媒体文件。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • Android
    +关注

    关注

    12

    文章

    3936

    浏览量

    127385
  • 华为
    +关注

    关注

    216

    文章

    34433

    浏览量

    251686
  • API
    API
    +关注

    关注

    2

    文章

    1499

    浏览量

    61991
收藏 人收藏

    评论

    相关推荐

    如何在Ubuntu Linux释放/boot分区中的空间

    在Ubuntu Linux,/boot分区是用于存储启动相关的文件的。随着时间的推移,这个分区可能会变满,导致系统无法安装新的内核和更新。本文将介绍如何释放/boot
    的头像 发表于 11-28 10:04 901次阅读

    Android中数据存储的介绍和使用

    APP 在外部存储的目录,其目录为 Android/data//。在访问该目录时, app 不需要申请读写
    发表于 09-19 09:05

    如何选择DSP芯片的外部存储器?

    如何选择DSP芯片的外部存储器?DSP的速度较快,为了保证DSP的运行速度,外部存储器需要具有一定的速度,否则DSP访问
    发表于 04-07 08:45 1914次阅读

    Android手机的轻量级访问控制

    以A ndroid 手机为平台, 提出了一种适用于Android 手机的访问控制方法, 该方法在Android手机的内核中增加访问控制模块, 并根据手机用户定制的
    发表于 04-17 15:06 44次下载
    <b class='flag-5'>Android</b>手机的轻量级<b class='flag-5'>访问</b>控制

    解读片RAM和外部RAM访问速度的差异问题

    有些威廉希尔官方网站 ,比如总线,看起来它和一般程序员关系不大。但它却串联起很多问题:为什么片RAM和外部RAM访问速度有差异;为什么CPU访问外部RA
    发表于 10-31 14:17 6503次阅读

    简述 Stratix 10 外部存储器接口作用

    Stratix 10外部存储器接口指南
    的头像 发表于 06-20 04:46 2581次阅读
    简述 Stratix <b class='flag-5'>10</b> <b class='flag-5'>外部</b><b class='flag-5'>存储</b>器接口作用

    什么是Swap分区 NVMe如何使用Swap分区

    NVMe是固态存储时代的下一个阶段,它提高了SSD和网络其他存储设备的性能。如今,越来越多的服务器开始支持NVMe,IT人员是时候考虑Swap分区(交换区)的使用问题,来最大限度地利
    发表于 03-03 11:27 4153次阅读

    Google官方宣布:将推出的Android Q 将被命名为 Android 10

    PingWest品玩8月23日讯,今日,Google官方宣布,将结束以“甜点”命名Android系统的方式,即将推出的Android Q 将被命名为 Android
    的头像 发表于 08-23 10:27 3016次阅读

    访问外部SDRAM为例来说明降低外部存储系统功耗的方法

    为了降低DSP外部SDRAM存储系统的功耗,针对DSP访问片外SDRAM的功耗来源特点,提出了基于总线利用率动态监测的读写归并方案。该方案动态监测外部
    发表于 12-02 15:50 913次阅读
    以<b class='flag-5'>访问</b><b class='flag-5'>外部</b>SDRAM为例来说明降低<b class='flag-5'>外部</b><b class='flag-5'>存储</b>系统功耗的方法

    MySQL分区表的类型及原理

    那么在分区的操作是怎样进行的呢?其实常规的CRUD操作以及返回结果和普通表没有任何区别。具体分区层实现是先打开并锁定所有底层表,优化器先判断是否可以过滤部分分区,然后调用对应的
    的头像 发表于 03-29 13:58 974次阅读
    MySQL<b class='flag-5'>分区</b>表的类型及原理

    Android 11的外部存储权限申请流程分享

    Android 11对应的API为30,从这个版本起要想对外部存储进行写入操作的话需要比以往的操作多几个步骤,这里简单归纳下,具体的原因我就不多话了,具体步骤如下以供参考
    的头像 发表于 05-26 11:29 6606次阅读
    <b class='flag-5'>Android</b> 11的<b class='flag-5'>外部</b><b class='flag-5'>存储</b>权限申请流程分享

    外部存储和内部存储的区别

    Android中根据数据是否为应用私有、是否需要给外部应用暴露以及数据的大小可以有以下几种选择: * Shared Preferences * 内部存储 * 外部
    的头像 发表于 05-26 11:30 1732次阅读
    <b class='flag-5'>外部</b><b class='flag-5'>存储</b>和内部<b class='flag-5'>存储</b>的区别

    SD卡外部存储使用方法

    Android`设备支持外部存储,比如`SD`卡等,保存在外部存储的数据具有全局可读性,可供在其他设备比如电脑
    的头像 发表于 05-26 11:32 1075次阅读
    SD卡<b class='flag-5'>外部</b><b class='flag-5'>存储</b>使用方法

    8位PIC单片机上的存储访问分区

    电子发烧友网站提供《8位PIC单片机上的存储访问分区.pdf》资料免费下载
    发表于 09-25 14:50 0次下载
    8位PIC单片机上的<b class='flag-5'>存储</b>器<b class='flag-5'>访问</b><b class='flag-5'>分区</b>

    外部存储器有哪些

    外部存储器是指用于存储数据的独立设备,它们通常与计算机或其他电子设备连接,并提供额外的存储空间,允许用户在不改变主设备内部存储的情况下保存和
    的头像 发表于 09-05 10:42 2211次阅读