Android 11 文件適配

compileSDKversion
這個是編譯期間你所使用的api版本刮吧,一般越高越好蝌焚,越高表示開發(fā)時可以
使用的api越新勾缭,并且可以避免使用被拋棄的sdk高镐。

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

targetSdkVersion
為兼容而生煮仇,使開發(fā)的app在各個版本的手機系統(tǒng)上表現(xiàn)一致,如果實際手機系統(tǒng)低于開發(fā)時定義的targetAPI谎仲,那么會以系統(tǒng)api版本為準浙垫。而如果實際手機系統(tǒng)的api版本高于開發(fā)時定義的targetApi,則會以targetSDK版本為準郑诺,缺點就是這樣會放棄了新版本的一些特性

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

存儲基本知識

首先明確一個概念较店,外部儲存和內(nèi)部儲存士八。

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

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

Android/data/--->存儲各個App的外部私有目錄
與內(nèi)部存儲類似哮翘,命名方式是:Android/data/xx------>xx指應(yīng)用的包名灰粮。
如:/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();

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


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

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

比如各個App在/sdcard/目錄下創(chuàng)建的目錄佩研,如支付寶創(chuàng)建的目錄:alipy/,微博創(chuàng)建的目錄: com.sina.weibo/霞揉,qq創(chuàng)建的目錄:com.tencent.mobileqq/等旬薯。

image.png

以下目錄無需存儲權(quán)限即可訪問:
1、App自身的內(nèi)部存儲
2适秩、App自身的自帶外部存儲-私有目錄

剩下的都需要申請存儲權(quán)限绊序,Android 10.0前后對于存儲作用域訪問的區(qū)別就體現(xiàn)在如何訪問剩余這些目錄內(nèi)的文件。

其中比較容易混淆的是: 內(nèi)部存儲與外部存儲里的App私有目錄秽荞,兩者命名風格很像骤公。

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

相同點:
屬于App專屬朴上,App自身訪問兩者無需任何權(quán)限垒棋。
2、App卸載后痪宰,兩者皆被刪除叼架。
3、兩者目錄下增加的文件最終會被統(tǒng)計到"設(shè)置->存儲和緩存"里酵镜。

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

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

在Android 10 之前 元潘,用戶可以隨意在SD 卡創(chuàng)建文件目錄,比如我們能夠直接在/sdcard/目錄下創(chuàng)建目錄/文件君仆。事實上翩概,很多App就是這么干的,目錄結(jié)構(gòu)很亂返咱,而且App卸載后钥庇,對應(yīng)的目錄并沒有刪除,于是就是遺留了很多"垃圾"文件,久而久之不處理萤晴,用戶的存儲空間越來越小吐句。
總結(jié)弊端如下:
1、在設(shè)置里"Clear storage"或者"Clear cache"并不能刪除該目錄下的文件
2店读、卸載App也不能刪除該目錄下的文件
3嗦枢、App可以隨意修改其它目錄下的文件,如修改別的App創(chuàng)建的文件等裹纳,不安全

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

面對眾多App隨意新建目錄/文件的現(xiàn)象敏储,Google在Android 10.0上重拳出擊了引入Scoped Storage、分區(qū)存儲朋鞍,原理如下:

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

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

適配

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

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

參考文章

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末原杂,一起剝皮案震驚了整個濱河市印颤,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌穿肄,老刑警劉巖年局,帶你破解...
    沈念sama閱讀 218,607評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異咸产,居然都是意外死亡某宪,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,239評論 3 395
  • 文/潘曉璐 我一進店門锐朴,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人蔼囊,你說我怎么就攤上這事焚志。” “怎么了畏鼓?”我有些...
    開封第一講書人閱讀 164,960評論 0 355
  • 文/不壞的土叔 我叫張陵酱酬,是天一觀的道長。 經(jīng)常有香客問我云矫,道長膳沽,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,750評論 1 294
  • 正文 為了忘掉前任让禀,我火速辦了婚禮挑社,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘巡揍。我一直安慰自己痛阻,他們只是感情好,可當我...
    茶點故事閱讀 67,764評論 6 392
  • 文/花漫 我一把揭開白布腮敌。 她就那樣靜靜地躺著阱当,像睡著了一般。 火紅的嫁衣襯著肌膚如雪糜工。 梳的紋絲不亂的頭發(fā)上弊添,一...
    開封第一講書人閱讀 51,604評論 1 305
  • 那天,我揣著相機與錄音捌木,去河邊找鬼油坝。 笑死,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的免钻。 我是一名探鬼主播彼水,決...
    沈念sama閱讀 40,347評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼极舔!你這毒婦竟也來了凤覆?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,253評論 0 276
  • 序言:老撾萬榮一對情侶失蹤拆魏,失蹤者是張志新(化名)和其女友劉穎盯桦,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體渤刃,經(jīng)...
    沈念sama閱讀 45,702評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡拥峦,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,893評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了卖子。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片略号。...
    茶點故事閱讀 40,015評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖洋闽,靈堂內(nèi)的尸體忽然破棺而出玄柠,到底是詐尸還是另有隱情,我是刑警寧澤诫舅,帶...
    沈念sama閱讀 35,734評論 5 346
  • 正文 年R本政府宣布羽利,位于F島的核電站,受9級特大地震影響刊懈,放射性物質(zhì)發(fā)生泄漏这弧。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,352評論 3 330
  • 文/蒙蒙 一虚汛、第九天 我趴在偏房一處隱蔽的房頂上張望匾浪。 院中可真熱鬧,春花似錦卷哩、人聲如沸户矢。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,934評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽梯浪。三九已至,卻和暖如春瓢娜,著一層夾襖步出監(jiān)牢的瞬間挂洛,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,052評論 1 270
  • 我被黑心中介騙來泰國打工眠砾, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留虏劲,地道東北人。 一個月前我還...
    沈念sama閱讀 48,216評論 3 371
  • 正文 我出身青樓,卻偏偏與公主長得像柒巫,于是被迫代替她去往敵國和親励堡。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,969評論 2 355

推薦閱讀更多精彩內(nèi)容