一、内部存储和外部存储的区别关系
根据android 版本不同 其外部存储含义不同
4.4 之前 没有SD卡就没有外部存储
而4.4及以后的系统外部存储包括两部分,getExternalFilesDir(“”)和getExternalCacheDir()获取的是机身存储的外部存储部分,也即4.4及以后的系统你不插SD卡,它也有外部存储,既然getExternalFilesDir(“”)和getExternalCacheDir()获取的是机身存储的外部存储部分,那么怎么获取SD卡的存储路径呢,还是通过上面提到的getExternalFilesDirs(Environment.MEDIA_MOUNTED)方法来获取了
/data目录下的文件物理上存放在我们通常所说的内部存储里面
/storage目录下的文件物理上存放在我们通常所说的外部存储里面
/system用于存放系统文件,/cache用于存放一些缓存文件,物理上它们也是存放在内部存储里面的
参考:
彻底搞懂Android文件存储---内部存储,外部存储以及各种存储路径解惑
https://blog.csdn.net/s13383754499/article/details/82910704
二、文件权限申请及使用
1.工程构建过程中几个参数
- compileSdkVersion : SDK编译版本
- minSdkVersion :应用可以运行的最低要求
- targetSdkVersion : targetSdkVersion 是 Android 提供向前兼容的主要依据,在应用的 targetSdkVersion 没有更新之前系统不会应用最新的行为变化。这允许你在适应新的行为变化之前就可以使用新的 API ,简单的说,真正选择生效的SDK版本
三者之间的关系是:
minSdkVersion <= targetSdkVersion <=compileSdkVersion
2.权限的申请
文件读写相关权限声
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
由权限静态声明可知,针对的是外部存储的
这里的OS指的是targetSdkVersion ,也就是生效版本
-
os<6.0之前 在mainfest中声明即可,
-
10> os >=6.0 需要动态申请权限
-
10<= os
情况一:
android:requestLegacyExternalStorage="true"
使用这条可以使用10之前的文件存储策略,则无需对10之前的文件策略改动
情况二:
如果不使用这条,则需要针对10之后的机型兼容沙盒策略;
默认情况下,对于以 Android 10 及更高版本为目标平台的应用,其访问权限范围限定为外部存储,即分区存储。此类应用可以查看外部存储设备内以下类型的文件,无需请求任何与存储相关的用户权限:
特定于应用的目录中的文件(使用 getExternalFilesDir() 访问)。
应用创建的照片、视频和音频片段(通过媒体库访问)。
公开文件:应可供其他应用和用户自由访问的文件。在用户卸载您的应用后,这些文件应该仍然可供用户使用。例如,您的应用拍摄的照片应保存为公开文件。
私有文件:存储在特定于应用的目录中的文件(使用 Context.getExternalFilesDir() 来访问)。这些文件在用户卸载您的应用时会被清除。尽管这些文件在技术上可被用户和其他应用访问(因为它们存储在外部存储上),但它们不能为应用之外的用户提供价值。可以使用此目录来存储您不想与其他应用共享的文件。
为了让用户更好地管理自己的文件并减少混乱,以 Android 10(API 级别 29)及更高版本为目标平台的应用在默认情况下被赋予了对外部存储设备的分区访问权限(即分区存储)。此类应用只能看到本应用专有的目录(通过 Context.getExternalFilesDir() 访问)以及特定类型的媒体。除非您的应用需要访问存放在应用的专有目录以及 MediaStore 之外的文件,否则最好使用分区存储。
文件位置 | 所需权限 | 访问方法 (*) | 卸载应用时是否移除文件? |
---|---|---|---|
特定于应用的目录 | 无 | getExternalFilesDir() | 是 |
媒体集合(照片、视频、音频) | READ_EXTERNAL_STORAGE(仅当访问其他应用的文件时) | MediaStore | 否 |
下载内容(文档和电子书籍) | 无 | 存储访问框架(加载系统的文件选择器) | 否 |
三、SDK需求的
UUID等设备唯一识别号是通过获取设备内部信息拼接生成的,且在首次安装集成SDK的App时生成,需要本地持久保存且不随卸载移除,需要使用到非"特定于应用的目录"。根据android 10的权限描述可不再申请额外的文件读写权限,只需要对文件保存路径进行适配
网友评论