一、內(nèi)部存儲和外部存儲的區(qū)別關(guān)系
根據(jù)android 版本不同 其外部存儲含義不同
4.4 之前 沒有SD卡就沒有外部存儲
而4.4及以后的系統(tǒng)外部存儲包括兩部分,getExternalFilesDir(“”)和getExternalCacheDir()獲取的是機身存儲的外部存儲部分,也即4.4及以后的系統(tǒng)你不插SD卡,它也有外部存儲,既然getExternalFilesDir(“”)和getExternalCacheDir()獲取的是機身存儲的外部存儲部分,那么怎么獲取SD卡的存儲路徑呢,還是通過上面提到的getExternalFilesDirs(Environment.MEDIA_MOUNTED)方法來獲取了
/data目錄下的文件物理上存放在我們通常所說的內(nèi)部存儲里面
/storage目錄下的文件物理上存放在我們通常所說的外部存儲里面
/system用于存放系統(tǒng)文件,/cache用于存放一些緩存文件,物理上它們也是存放在內(nèi)部存儲里面的
參考:
徹底搞懂Android文件存儲---內(nèi)部存儲,外部存儲以及各種存儲路徑解惑
https://blog.csdn.net/s13383754499/article/details/82910704
二、文件權(quán)限申請及使用
1.工程構(gòu)建過程中幾個參數(shù)
- compileSdkVersion : SDK編譯版本
- minSdkVersion :應用可以運行的最低要求
- targetSdkVersion : targetSdkVersion 是 Android 提供向前兼容的主要依據(jù),在應用的 targetSdkVersion 沒有更新之前系統(tǒng)不會應用最新的行為變化。這允許你在適應新的行為變化之前就可以使用新的 API ,簡單的說,真正選擇生效的SDK版本
三者之間的關(guān)系是:
minSdkVersion <= targetSdkVersion <=compileSdkVersion
2.權(quán)限的申請
文件讀寫相關(guān)權(quán)限聲
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
由權(quán)限靜態(tài)聲明可知,針對的是外部存儲的
這里的OS指的是targetSdkVersion ,也就是生效版本
os<6.0之前 在mainfest中聲明即可,
10> os >=6.0 需要動態(tài)申請權(quán)限
10<= os
情況一:
android:requestLegacyExternalStorage="true"
使用這條可以使用10之前的文件存儲策略,則無需對10之前的文件策略改動
情況二:
如果不使用這條,則需要針對10之后的機型兼容沙盒策略;
默認情況下,對于以 Android 10 及更高版本為目標平臺的應用,其訪問權(quán)限范圍限定為外部存儲,即分區(qū)存儲。此類應用可以查看外部存儲設備內(nèi)以下類型的文件,無需請求任何與存儲相關(guān)的用戶權(quán)限:
特定于應用的目錄中的文件(使用 getExternalFilesDir() 訪問)。
應用創(chuàng)建的照片、視頻和音頻片段(通過媒體庫訪問)。
公開文件:應可供其他應用和用戶自由訪問的文件。在用戶卸載您的應用后,這些文件應該仍然可供用戶使用。例如,您的應用拍攝的照片應保存為公開文件。
私有文件:存儲在特定于應用的目錄中的文件(使用 Context.getExternalFilesDir() 來訪問)。這些文件在用戶卸載您的應用時會被清除。盡管這些文件在技術(shù)上可被用戶和其他應用訪問(因為它們存儲在外部存儲上),但它們不能為應用之外的用戶提供價值??梢允褂么四夸泚泶鎯δ幌肱c其他應用共享的文件。
為了讓用戶更好地管理自己的文件并減少混亂,以 Android 10(API 級別 29)及更高版本為目標平臺的應用在默認情況下被賦予了對外部存儲設備的分區(qū)訪問權(quán)限(即分區(qū)存儲)。此類應用只能看到本應用專有的目錄(通過 Context.getExternalFilesDir() 訪問)以及特定類型的媒體。除非您的應用需要訪問存放在應用的專有目錄以及 MediaStore 之外的文件,否則最好使用分區(qū)存儲。
| 文件位置 | 所需權(quán)限 | 訪問方法 (*) | 卸載應用時是否移除文件? |
|---|---|---|---|
| 特定于應用的目錄 | 無 | getExternalFilesDir() | 是 |
| 媒體集合(照片、視頻、音頻) | READ_EXTERNAL_STORAGE(僅當訪問其他應用的文件時) | MediaStore | 否 |
| 下載內(nèi)容(文檔和電子書籍) | 無 | 存儲訪問框架(加載系統(tǒng)的文件選擇器) | 否 |
三、SDK需求的
UUID等設備唯一識別號是通過獲取設備內(nèi)部信息拼接生成的,且在首次安裝集成SDK的App時生成,需要本地持久保存且不隨卸載移除,需要使用到非"特定于應用的目錄"。根據(jù)android 10的權(quán)限描述可不再申請額外的文件讀寫權(quán)限,只需要對文件保存路徑進行適配