Android_TRY
Android_TRY
  • 发布:2019-07-26 17:43
  • 更新:6 天前
  • 阅读:312020

适配Android10+设备注意事项

分类:uni-app

名词介绍: Android 10+ 表示android系统版本大于等于10 既包括android 10以及android 11的系统统称

Android 10+ 概述

Android 10系统开始 进一步增强了平台功能,为外部存储设备上的应用和用户数据提供了更好的保护。作为这项工作的一部分,平台引入了进一步的改进,以简化向分区存储的转换。
为了让用户更好地控制自己的文件,保护用户隐私数据,并限制文件混乱情况,Android 11在分区存储基础上限制了应用访问其他应用的文件。

分区存储

先说一下为什么会有分区存储这个机制出现。

在分区存储之前,某些应用中,即使功能很简单,大部分都不需要这么宽泛的权限。
这就使得某些应用程序

1、乱占空间 :各种各样的文件散布在磁盘的各个地方,当用户卸载应用之后,这些被遗弃的文件被滞留在原地,无人管理,占用了磁盘空间,最终结果就会导致磁盘不足
2、随意读取用户的数据
3、随意读取应用的数据

因此分区存储诞生了,限制了过于宽泛的 存储权限。

什么是分区存储?

Google针对外部存储引入了一个新特性,它的名字叫:Scoped Storage,Google官方对它的翻译为分区存储,我们也可以把它叫做沙盒存储。
更明确了空间的归属,也就是对目录有一个更明确的所有权结构。

分区存储是一种安全机制,用于防止应用读取其他应用的数据。

  • 每个应用程序都有自己的存储空间。
  • 应用程序不能翻过自己的目录,去访问公共目录。
  • 应用程序请求的数据都要通过权限检测,不符合要求不会被放行。

分区存储机制下uni-app/5+ 开发者的影响

android 9及以下系统未做分区存储,除其他应用的内部存储空间不可以读写,其他任意存储目录下的资源文件都可以正常读写操作。
android 10仅对targetSdkVersion>=29则会开启分区存储。targetSdkVersion小于29则不会有任何限制与android9及以下同理。
andorid 11强制执行分区存储。不允许应用读写操作非应用沙盒目录和系统公共目录下的资源文件。

dcloud已对分区存储机制做了适配工作。但也增加了开发者对文件目录操作的规则。在分区存储的环境下分出两个可操文件数据目录系统公共目录应用沙盒目录.

系统公共目录:Downloads、Documents、Pictures 、DCIM、Movies、Music、Ringtones等

  • 公共目录的文件在App卸载后,不会删除
  • 通过plus.gallery.pick获取
  • 拥有权限,也能通过路径直接访问

公共目录对照表:

  • Downloads 对应的绝对路径 file:///storage/emulated/0/Download
  • Documents 对应的绝对路径 file:///storage/emulated/0/Documents
  • Pictures 对应的绝对路径 file:///storage/emulated/0/Pictures
  • DCIM 对应的绝对路径 file:///storage/emulated/0/DCIM
  • Movies 对应的绝对路径 file:///storage/emulated/0/Movies
  • Music 对应的绝对路径 file:///storage/emulated/0/Music
  • Ringtones 对应的绝对路径 file:///storage/emulated/0/Ringtones

系统公共目录缺陷:

  • 系统公共目录仅支持读取媒体文件 如:音频文件、视频文件、图片文件。其他类型文件不支持!!!!
  • 系统公共目录下创建的文件是公用的,你需要确保你的文件命名是惟一的。否则会出现名称对应不上的问题。多数重命名会文件名尾部(i++)处理
  • 系统公共目录不可随意删减。该文件谁创建的谁才有权限删除修改。如果不是当前应用创建的文件是无权权限删改的。
  • 系统公共目录删减文件会被系统认为恶意操作。将会弹通知栏。告诫手机用户当前XXX应用删除了什么文件。

系统公共目录地址的获取来源是哪里:

这里多数是通过plus.gallery.pick获取到的媒体文件。如图片视频等。多数是DCIM、Pictures、Movies等。其他Ringtones、Documents仅提供绝对路径让开发者对比,实际业务中可能并不会获取到相关路径目录的。

目前业务逻辑会用到系统公共目录多数为分享。需要将图片等资源拷贝到系统公共目录下。别的三方应用才有权读取该文件。进行操作业务逻辑。

应用沙盒目录(应用专属目录)

  • 应用沙盒目录只能自己直接访问
  • App卸载,数据会清除。

应用沙盒目录分为:

  • 内部存储空间目录

    • plus.io.PRIVATE_WWW 对应绝对路径 file:///data/user/0/%PACKAGENAME%/files/apps/%APPID%/www

    • plus.io.PRIVATE_DOC 对应绝对路径 file:///data/user/0/%PACKAGENAME%/files/apps/%APPID%/doc

  • 外部存储空间目录

    • plus.io.PUBLIC_DOCUMENTS 对应绝对路径 file:///storage/emulated/0/Android/data/%PACKAGENAME%/.%APPID%/documents

    • plus.io.PUBLIC_DOWNLOADS 对应绝对路径 file:///storage/emulated/0/Android/data/%PACKAGENAME%/.%APPID%/downloads

具体请参考文档

以下是针对分区存储机制作出文件操作目录限制的5+API:

以上API设置了不支持的目录部分会返回code =15的错误信息!,部分会返回执行失败的错误回调具体以API为准!

建议

可预见的未来android系统的更新将会对存储数据操作更加严格。推荐广大开发者文件数据操作都在应用本身的沙盒目录下完成。减少未来不必要的适配工作。相对的你的应用也会更加安全可靠。

扩展问题:

Q:分区存储 我的应用那些需要改动?

A: 目前应用多数与文件操作数据都已适配。用户只需关注部分API操作的文件路径是否符合目录限制规则。非应用沙盒目录或非系统公共目录请及时修改或增加判断调整业务逻辑。

Q:我是不是只要targetSdkVersion不设置>=29就可以了?

A: 不是在android11的设备已经强制开启分区存储机制。您必须做出适配。否则在android11的设备上无法正常运行。

Q:我是不是可以将所以之前应用的特殊文件都放入到系统公共目录下不就行了。之后也可以随意操作不需要非要在应用沙盒目录操作文件呀。

A: 首先不推荐这样操作的。这样会导致功系统公共目录下的文件激增导致多应用做操出现的文件名称冲突等问题。`系统公共目录还有个明显缺陷就是不可以随意删除、修改。都会被系统判断为恶意删减或无权限修改。造成业务逻辑错误。

设备位置

推出新的用户选项;只有在前台使用您的应用时,该选项才允许访问设备位置信息。

Android 10开始中如果应用需要在后台时也获得用户位置,则需要申请后台定位权限,uni-app/5+应用会默认申请该权限,其表现为:
targetSdkVersion>=29,用户同意定位权限后,再次弹窗申请后台定位权限。
targetSdkVersion<29,申请定位权限弹窗中会增加“始终允许”选项。

后台应用启动

针对在没有用户互动的情况下从后台启动活动的新限制。

硬件标识符

对设备硬件标识符(如 IMEI、序列号、MAC 和类似数据)访问权限的新限制。
为保护用户隐私,Android 10开始将不会开放众多可以确定设备的唯一标识。因此Android 10+设备中plus.device.getInfo返回的imei、uuid将会为空。

摄像头和连接性

针对完整摄像头元数据的访问权限实施了新限制,并且现在许多连接工作流都需要精确位置权限。

Android 10+新特性官方说明:https://developer.android.google.cn/preview/privacy

2 关注 分享
最光阴 vpanda

要回复文章请先登录注册

p***@163.com

p***@163.com

file:///storage/emulated/0/DCIM读取文件,手机搜索文件里边是有子文件和图片的,但是一直读出来是为空是为什么,还有读取外部sd卡应该用那个,望大佬回复感谢
6 天前
7***@qq.com

7***@qq.com

屮 我说怎么一直失败
6 天前
7***@qq.com

7***@qq.com

下载的东西如何复制到外部目录啊
6 天前
d***@163.com

d***@163.com

Android 10 中 uniapp 不能读写公共目录的非媒体文件。这么说是不是 app 配置信息不能放在公共目录,也就是说卸载后无法找回。。。
2022-09-03 11:23
a***@163.com

a***@163.com

关于分区存储这块。其实uniapp这里的一刀切挺别扭的。
uniapp限制了Android 10及以后版本下,针对公共目录的非媒体文件读取,就比如如果访问微信QQ下载到公共目录的pdf,doc文件,uniapp的getFileInfo和uploadFile都会报错。
在Android 10和Android 11上面,如果原生开发添加了requestLegacyExternalStorage,那么原生开发是可以访问公共目录的非媒体文件的。
Android 11及以后,新增了管理所有文件权限,应用如果申请了这个权限,原生开发和uniapp开发都能直接访问公共目录的非媒体文件了。
但刚好Android 10没有管理所有文件权限,uniapp也不判断requestLegacyExternalStorage,就导致在Android 10上面uniapp无法访问公共目录非媒体文件。转折办法只能是开发个原生插件,选择公共目录的pdf,doc等非媒体文件时,拷贝到沙盒目录下,然后返回拷贝的文件路径给uniapp用。
真操蛋。。。。
2022-05-17 15:57
内账宝app

内账宝app

回复 三月吖 :
还没有
2022-05-12 17:01
内账宝app

内账宝app

回复 内账宝app :
我也遇到这个问题了,不知道为啥,读取文件列表的时候,一直访问失败
2022-05-12 16:07
三月吖

三月吖

回复 内账宝app :
请教大神解决了嘛
2021-11-02 16:09
m***@163.com

m***@163.com

想要获取别的软件的应用沙盒目录下的文件该怎么办?比如QQ下载的文件
2021-10-30 20:27
内账宝app

内账宝app

如果想通过resolveLocalFileSystemURL这个api访问其他非系统公共目录的文件改如何操作呀,想获取手机录音文件却不在系统公共目录中,一直提示访问目录失败
2021-10-20 10:59