Android 11 文件適配

compileSDKversion
這個是編譯期間你所使用的api版本,一般越高越好,越高表示開發時可以
使用的api越新,并且可以避免使用被拋棄的sdk。

minSdkVersion
這個是支持的最小SDK版本,很好理解,在小于minSdkVersion的手機系統上無法安裝

targetSdkVersion
為兼容而生,使開發的app在各個版本的手機系統上表現一致,如果實際手機系統低于開發時定義的targetAPI,那么會以系統api版本為準。而如果實際手機系統的api版本高于開發時定義的targetApi,則會以targetSDK版本為準,缺點就是這樣會放棄了新版本的一些特性

在Android 10之前的版本上,我們在做文件的操作時都會申請存儲空間的讀寫權限。但是這些權限完全被濫用,造成的問題就是手機的存儲空間中充斥著大量不明作用的文件,并且應用卸載后它也沒有刪除掉。
為了解決這個問題,Android 10 中引入了Scoped Storage 的概念,通過添加外部存儲訪問限制來實現更好的文件管理。

存儲基本知識

首先明確一個概念,外部儲存和內部儲存。

  • 內部儲存:/data 目錄。
    獲取本應用的內部儲存路徑,讀寫該路徑下的文件不需要申請儲存空間讀寫權限,且卸載應用時會自動刪除。
一般我們使用getFilesDir()  方法,對應的目錄:`//data/data/com.face.myapplication/files`

 getCacheDir() 方法,對應的目錄`/data/user/0/com.face.myapplication/cache` 
  • 外部儲存:/storage 或 /mnt 目錄。一般我們使用getExternalStorageDirectory()方法獲取的路徑來存取文件。
外部存儲 App私有目錄 (App卸載的時候,會被清除。)

Android/data/--->存儲各個App的外部私有目錄
與內部存儲類似,命名方式是:Android/data/xx------>xx指應用的包名。
如:/sdcard/Android/data/com.fish.myapplication

讀寫App外部私有目錄

    private void testAppDir(Context context) {
        //4個基本方法
        File fileDir = context.getExternalFilesDir(null);
        //API>=19
        File[] fileList = context.getExternalFilesDirs(null);

        File cacheDir = context.getExternalCacheDir();
        //API>=19
        File[] cacheList = context.getExternalCacheDirs();

        //指定目錄,自動生成對應的子目錄
        File fileDir2 = context.getExternalFilesDir(Environment.DIRECTORY_DCIM);
    }


只要拿到根目錄,就可以遍歷尋找其它子目錄/文件。

    private void testOtherDir(Context context) {
        File rootDir = Environment.getExternalStorageDirectory();
    }
   返回的rootDir路徑:/storage/emulated/0/。
其它目錄

比如各個App在/sdcard/目錄下創建的目錄,如支付寶創建的目錄:alipy/,微博創建的目錄: com.sina.weibo/,qq創建的目錄:com.tencent.mobileqq/等。

image.png

以下目錄無需存儲權限即可訪問:
1、App自身的內部存儲
2、App自身的自帶外部存儲-私有目錄

剩下的都需要申請存儲權限,Android 10.0前后對于存儲作用域訪問的區別就體現在如何訪問剩余這些目錄內的文件。

其中比較容易混淆的是: 內部存儲與外部存儲里的App私有目錄,兩者命名風格很像。

不同點:
/data/data/com.fish.myapplication/ 位于內部存儲,一般用于存儲容量較小的,私密性較強的文件。而/sdcard/Android/data/com.fish.myapplication/ 位于外部存儲,作為App私有目錄,一般用于存儲容量較大的文件,即使刪除了也不影響App正常功能。

相同點:
屬于App專屬,App自身訪問兩者無需任何權限。
2、App卸載后,兩者皆被刪除。
3、兩者目錄下增加的文件最終會被統計到"設置->存儲和緩存"里。

因為不同廠商、系統版本的原因,所以上述的方法并沒有一個固定的文件路徑。了解了上面的概念,那我們所說的外部儲存訪問限制,可以認為是針對getExternalStorageDirectory()路徑下的文件。

Android 10.0 ( targetSdkVersion 改為 29)訪問方式變更

在Android 10 之前 ,用戶可以隨意在SD 卡創建文件目錄,比如我們能夠直接在/sdcard/目錄下創建目錄/文件。事實上,很多App就是這么干的,目錄結構很亂,而且App卸載后,對應的目錄并沒有刪除,于是就是遺留了很多"垃圾"文件,久而久之不處理,用戶的存儲空間越來越小。
總結弊端如下:
1、在設置里"Clear storage"或者"Clear cache"并不能刪除該目錄下的文件
2、卸載App也不能刪除該目錄下的文件
3、App可以隨意修改其它目錄下的文件,如修改別的App創建的文件等,不安全

好處:
1、此處新建的目錄不會被設置里的App存儲用量統計,讓用戶"看起來"自己的App占用的存儲空間很小
2、方便操作文件

面對眾多App隨意新建目錄/文件的現象,Google在Android 10.0上重拳出擊了引入Scoped Storage、分區存儲,原理如下:

  • App訪問自身內部存儲空間與 訪問外部存儲空間的App私有目錄不需要任何權限(這個與Android 10.0之前一致)

  • 外部存儲空間-共享存儲空間、外部存儲空間-其它目錄 App無法通過路徑直接訪問,不能新建、刪除、修改目錄/文件等, 需要通過Uri訪問

適配

最簡單粗暴的方法就是在 AndroidManifest.xml 中添加 android:requestLegacyExternalStorage="true" 來請求使用舊的存儲模式。但是我不推薦此方法。因為在下一個版本的Android中,此條配置將會失效

  • requestLegacyExternalStorage 是什么?通過翻查官方文檔,大概知道了這個屬性的意思:在配置targetSdk >= 29,應用搭載在Android 10及以上版本的手機運行時,可以暫時停用「分區存儲」
在AndroidManifest.xml 里application標簽下添加:
<application
  android:requestLegacyExternalStorage="true"
  ...>
微信圖片_20220601173049.jpg

參考文章

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,533評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,055評論 3 414
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 175,365評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,561評論 1 307
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,346評論 6 404
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 54,889評論 1 321
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 42,978評論 3 439
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,118評論 0 286
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,637評論 1 333
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,558評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,739評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,246評論 5 355
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 43,980評論 3 346
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,362評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,619評論 1 280
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,347評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,702評論 2 370

推薦閱讀更多精彩內容