Android10+分區(qū)存儲(chǔ)適配

什么是分區(qū)存儲(chǔ):


為了讓用戶更好地控制自己的文件并減少混亂,Android 10 針對(duì)應(yīng)用推出了一種新的存儲(chǔ)范例袱巨,稱為分區(qū)存儲(chǔ)金抡。分區(qū)存儲(chǔ)改變了應(yīng)用在設(shè)備的外部存儲(chǔ)設(shè)備中存儲(chǔ)和訪問文件的方式沪羔。以 Android 10(API 級(jí)別 29)及更高版本為目標(biāo)平臺(tái)的應(yīng)用在默認(rèn)情況下被授予了對(duì)外部存儲(chǔ)空間的分區(qū)訪問權(quán)限(即分區(qū)存儲(chǔ))臣镣。此類應(yīng)用只能訪問外部存儲(chǔ)空間上的應(yīng)用專屬目錄谣膳,以及本應(yīng)用所創(chuàng)建的特定類型的媒體文件净神。

適配背景:由于app需要到google play上架何吝,由于第一次提交該應(yīng)用,google play認(rèn)為是新應(yīng)用鹃唯,要求target sdk版本必須>=30(google play上的老應(yīng)用沒有這個(gè)限制)爱榕。于是把target sdk由28升到了30,又沒有及時(shí)對(duì)分區(qū)存儲(chǔ)進(jìn)行適配坡慌,引發(fā)了一些問題黔酥。

目前谷歌對(duì)分區(qū)存儲(chǔ)給了一個(gè)過渡期,由于國內(nèi)應(yīng)用市場并未對(duì)targetsdk版本做限制洪橘,網(wǎng)上適配也多以降級(jí)targetsdk的方式來解決跪者。

Android 存儲(chǔ)分區(qū)情況


Android 中存儲(chǔ)可以分為兩大類:專屬存儲(chǔ)和共享存儲(chǔ)

專屬存儲(chǔ) (Private Storage) : 每個(gè)應(yīng)用在都擁有自己的專屬目錄,其它應(yīng)用看不到熄求,彼此也無法訪問到該目錄:

  • 內(nèi)部專屬目錄 (/data/data/packageName/) 渣玲;
  • 外部專屬目錄 (/sdcard/Android/data/packageName/),

共享存儲(chǔ) (Shared Storage) : 存儲(chǔ)其他應(yīng)用可訪問文件抡四, 包含媒體文件柜蜈、文檔文件以及其他文件,對(duì)應(yīng)設(shè)備DCIM指巡、Pictures淑履、Alarms、Music藻雪、Notifications秘噪、Podcasts、Ringtones勉耀、Movies指煎、Download等目錄。

分區(qū)存儲(chǔ)在不同API上表現(xiàn)區(qū)別:

  • 當(dāng)設(shè)置targetSdk<29時(shí)便斥,分區(qū)存儲(chǔ)不會(huì)開啟至壤;
  • 當(dāng)設(shè)置targetsdk>=29時(shí),在android10機(jī)型上枢纠,谷歌新增android:requestLegacyExternalStorage="true"屬性可用于關(guān)閉分區(qū)存儲(chǔ)像街,不過此時(shí)在android11及以上機(jī)型上面,系統(tǒng)會(huì)忽略 requestLegacyExternalStorage 標(biāo)記,強(qiáng)制開啟分區(qū)存儲(chǔ)

當(dāng)targetSdk設(shè)置為>=29時(shí)镰绎,在android10上脓斩,在應(yīng)用非專有目錄上,比如mkdir畴栖,mkdirs随静,createNewFile等api都會(huì)受到影響,即使是在共享目錄DCIM吗讶,Pictures燎猛,Movies等下也無法使用這些api,必須使用MediaStore API創(chuàng)建或訪問关翎,但在android11及以上Google基于這些問題對(duì)分區(qū)存儲(chǔ)進(jìn)行了優(yōu)化扛门,這些api又可以正常使用了,Goole也已經(jīng)說明:如果您的應(yīng)用以 Android 10(API 級(jí)別 29)為目標(biāo)平臺(tái)纵寝,請(qǐng)停用分區(qū)存儲(chǔ)论寨,繼續(xù)使用適用于 Android 9 及更低版本的方法來執(zhí)行此操作。因此只要你的targetSdk一旦設(shè)置為29以上爽茴,務(wù)必添加android:requestLegacyExternalStorage="true"屬性葬凳。讓android10及以下機(jī)型繼續(xù)使用舊存儲(chǔ)模型。

Android 10(Q) :


Android 10 中主要對(duì)共享目錄進(jìn)行了權(quán)限詳細(xì)的劃分室奏,不再能通過絕對(duì)路徑訪問火焰。

受影響的接口:


image.png

訪問不同分區(qū)的方式:

  • 專屬目錄:和以前的版本一致,可通過 File() API 訪問胧沫,無需申請(qǐng)權(quán)限昌简。
  • 共享目錄:需要通過MediaStore和Storage Access Framework API 訪問,視具體情況申請(qǐng)權(quán)限绒怨,下面詳細(xì)介紹纯赎。

其中,對(duì)共享目錄的權(quán)限進(jìn)行了細(xì)分:

無需申請(qǐng)權(quán)限的操作:
通過 MediaStore API對(duì)媒體集南蹂、文件集進(jìn)行媒體/文件的添加犬金、對(duì)自身APP 創(chuàng)建的 媒體/文件 進(jìn)行查詢、修改六剥、刪除的操作晚顷。

需要申請(qǐng)READ_EXTERNAL_STORAGE 權(quán)限:
通過 MediaStore API對(duì)所有的媒體集進(jìn)行查詢、修改疗疟、刪除的操作该默。

調(diào)用 Storage Access Framework API :
會(huì)啟動(dòng)系統(tǒng)的文件選擇器向用戶申請(qǐng)操作指定的文件

訪問方式:
image.png

Android 11 (R):


Android 11 (R) 在 Android 10 (Q) 中分區(qū)存儲(chǔ)的基礎(chǔ)上進(jìn)行了調(diào)整

  1. 使用直接文件路徑和原生庫訪問文件

為了幫助您的應(yīng)用更順暢地使用第三方媒體庫,Android 11 允許您使用除 MediaStore API 之外的 API 訪問共享存儲(chǔ)空間中的媒體文件策彤。不過权均,您也可以轉(zhuǎn)而選擇使用以下任一 API 直接訪問媒體文件:
File API顿膨。
原生庫锅锨,例如 fopen()叽赊。

簡單來說就是,可以通過 File() , mkDir() 等API 訪問有權(quán)限訪問的媒體集了必搞。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末必指,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子恕洲,更是在濱河造成了極大的恐慌塔橡,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,968評(píng)論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件霜第,死亡現(xiàn)場離奇詭異葛家,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)泌类,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,601評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門癞谒,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人刃榨,你說我怎么就攤上這事弹砚。” “怎么了枢希?”我有些...
    開封第一講書人閱讀 153,220評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵桌吃,是天一觀的道長。 經(jīng)常有香客問我苞轿,道長茅诱,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,416評(píng)論 1 279
  • 正文 為了忘掉前任搬卒,我火速辦了婚禮瑟俭,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘秀睛。我一直安慰自己尔当,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,425評(píng)論 5 374
  • 文/花漫 我一把揭開白布蹂安。 她就那樣靜靜地躺著椭迎,像睡著了一般。 火紅的嫁衣襯著肌膚如雪田盈。 梳的紋絲不亂的頭發(fā)上畜号,一...
    開封第一講書人閱讀 49,144評(píng)論 1 285
  • 那天,我揣著相機(jī)與錄音允瞧,去河邊找鬼简软。 笑死蛮拔,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的痹升。 我是一名探鬼主播建炫,決...
    沈念sama閱讀 38,432評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼疼蛾!你這毒婦竟也來了肛跌?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,088評(píng)論 0 261
  • 序言:老撾萬榮一對(duì)情侶失蹤察郁,失蹤者是張志新(化名)和其女友劉穎衍慎,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體皮钠,經(jīng)...
    沈念sama閱讀 43,586評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡稳捆,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,028評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了麦轰。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片乔夯。...
    茶點(diǎn)故事閱讀 38,137評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖原朝,靈堂內(nèi)的尸體忽然破棺而出驯嘱,到底是詐尸還是另有隱情,我是刑警寧澤喳坠,帶...
    沈念sama閱讀 33,783評(píng)論 4 324
  • 正文 年R本政府宣布鞠评,位于F島的核電站,受9級(jí)特大地震影響壕鹉,放射性物質(zhì)發(fā)生泄漏剃幌。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,343評(píng)論 3 307
  • 文/蒙蒙 一晾浴、第九天 我趴在偏房一處隱蔽的房頂上張望负乡。 院中可真熱鬧,春花似錦脊凰、人聲如沸抖棘。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,333評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽切省。三九已至,卻和暖如春帕胆,著一層夾襖步出監(jiān)牢的瞬間朝捆,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,559評(píng)論 1 262
  • 我被黑心中介騙來泰國打工懒豹, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留芙盘,地道東北人驯用。 一個(gè)月前我還...
    沈念sama閱讀 45,595評(píng)論 2 355
  • 正文 我出身青樓,卻偏偏與公主長得像儒老,于是被迫代替她去往敵國和親蝴乔。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,901評(píng)論 2 345

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