Android 内部存储外部存储 及 读写权限

Android 内部存储外部存储 及 读写权限,第1张

Android 使用 VFS (Virtual File System) 虚拟文件系统。VFS提供了供存储设备挂载的节点,同一存储设备经过分区后,不同的分区可以挂载到不同的节点上,如手机的内置存储卡

内置存储卡 / 外置SD卡

内部存储 / 外部存储

VFS 的目录以 / 为根节点,根节点下面又有不同的节点。物理存储设备就是挂载到这些节点上。

内部存储卡/外置SD卡 内部存储/外部存储

首先明确, 内置存储卡/外置SD卡 是在 物理层面 相对于 手机大众用户 来说的。

外置SD卡:可手动插拔的SD卡。

内置存储卡:焊接在手机内部不可拆卸的存储卡。

而, 内部存 /外部存储 是在 文件系统逻辑层面 相对于 开发者 来说的,指具体的路径。

一般针对某个应用而言的,属于该应用的存储路径叫内部存储,反之为外部存储。

路径: /data/data/package_name

/data/data/ 下都是已安装应用的目录,该目录下包含的文件都是以包名作为文件名的目录,例如 /data/data/comsankuaimeituan

获取内部存储的方式如下:

其中,参数 mode 指创建模式,一种 4 种

注意: Android 70 以上 androidosBuildVERSIONSDK_INT>=BuildVERSION_CODESN 使用3/4 常量时,将会导致SecurityException,这意味着 不能通过名称共享私有文件

尝试共享 file://URI URI将会导致FileUriExposedException,StrictMode API政策禁止在您的应用外部公开file://URL。如果您的应用需要与其他应用共享私有文件,则可以使用 FileProvider 与 FLAG_GRANT_READ_URI_PERMISSION 配合使用。 Android 70 行为变更 通过FileProvider在应用间共享文件吧

外部存储,可以是 外置SD卡 或 内置存储卡的部分分区。

外部存储,分为 公共目录 和 私有目录

获取方式

检查可用性的方法:

Android 43 以下,只能通过 Context#getExternalFilesDir(type) 来获取外部存储在内置存储卡分区的私有目录,无法获取外置SD卡。

Android 43 开始,可以通过 Context#getExternalFilesDirs(type) 获取一个File数组,包含了内置存储卡分区和外置SD的私有目录地址。

可以使用兼容库的静态方法 ContextCompategetExternalFilesDirs() 兼容 43。

感谢以下文章作者

解析Android内部存储、外部存储的区别

1、必须是Android系统开发人员,否则你无法修改initrc等文件。 2、你的应用程序必须要获得system权限

在应用层 你要想用代码获得系统文件权限,除非你手机root了

要么你自己坐rom。。。。 自己修改 init,rc

具体可以参考这篇博文:>

有时候我们的应用需要读写sd卡,就需要androidpermissionWRITE_EXTERNAL_STORAGE权限,但是它属于危险型权限。光在Manifest中配置还不够,你还需要运行时请求去用它们。

以下就以MainfestpermissionWRITE_EXTERNAL_STORAGE为例,

1)检测是否拥有权限

2)如果没有权限就请求权限

requestPermission()是个异步请求方法,调用它之后,Android会d出系统权限授权对话框要求用户反馈。

为响应用户 *** 作,还需要重写onRequestPermissionResult()响应方法,用户点击 允许 或 拒绝 按钮后,Android就会调用这个方法。

然后我们在这个方法里检测是否拥有权限,如果有权限,就。

如果你点击了 允许 按钮给予权限,除非卸载或关闭权限,应用会一直拥有该权限。如果选了拒绝,应用的授权只是暂时被否。下次要获取读写文件的话,可以继续用requestPermission()来请求权限。

默认情况下,如果应用以 Android Q 为目标平台,则在访问外部存储设备中的文件时会进入过滤视图。应用可以使用 ContextgetExternalFilesDir() 将专用于自己的文件存储在特定于自己的目录中。

1 临时停用分区存储行为:

2 如何实现隔离存储:

21 ApplicationInfo新增PRIVATE_FLAG_REQUEST_LEGACY_EXTERNAL_STORAGE标记

PackageParserjava:

ApplicationInfojava:

22 grantRuntimePermission()重新挂载视图

apk启动时默认挂载runtime/default视图,grantRuntimePermission()时如果是READ_EXTERNAL_STORAGE或WRITE_EXTERNAL_STORAGE,则会获取挂载模式重新挂载对应视图。

PermissionManagerServicejava:

获取挂载模式这块android10有修改,没有设置Legacy标志的话,总是获取default挂载模式,没有读写权限。

android 10会设置属性[persistsysisolated_storage]: [true],因此走到if(ENABLE_ISOLATED_STORAGE)中的getMountMode()。

正常模式下hasLegacy=false,走到if判断的DEFAULT分支;legacy模式hasLegacy=true,与之前保持一致,有write权限就走到WRITE模式分支。

23 Legacy Storage属性对权限的影响

安装apk时,就会根据requestLegacyExternalStorage属性来对ops state进行设置,修改OP_LEGACY_STORAGE的默认状态。

PermissionPolicyService启动时首先进行权限变化监听:

APK安装时,会根据requestLegacyExternalStorage属性来通知storage权限变化,调用关系如下:

最终调用到PermissionPolicyService的监听函数synchronizePackagePermissionsAndAppOpsForUser(),进行默认权限获取和设置。

当apk安装时,声明了requestLegacyExternalStorage="true"属性,并且声明了READ_EXTERNAL_STORAGE、WRITE_EXTERNAL_STORAGE,那么addOpIfRestricted()就会将LEGACY_STORAGE设置为allow模式。

3 sdcard路径权限说明:

/mnt/runtime/default:

/mnt/runtime/read:

/mnt/runtime/write:

/sdcard/Android/data:

4 sdcard文件存储示例:

41 getExternalFilesDir()随卸载而删除

42 媒体文件

媒体文件使用MediaStore *** 作,卸载后不会删除。

访问其他应用生成的照片、视频、音频,需要READ_EXTERNAL_STORAGE权限。

43 存储访问框架(SAF)

访问其他应用创建的文件,例如"Download"目录,必须使用存储访问框架,用户通过框架选择特定文件。

44 照片中的位置信息

需要ACCESS_MEDIA_LOCATION权限,才能获取元数据中的位置信息。

以上就是关于Android 内部存储/外部存储 及 读写权限全部的内容,包括:Android 内部存储/外部存储 及 读写权限、Android应用程序怎样获取读取系统文件的权限、安卓请求权限等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/9877062.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-02
下一篇2023-05-02

发表评论

登录后才能评论

评论列表(0条)

    保存