android存儲(chǔ)分區(qū)和android11填坑

android的物理存儲(chǔ)劃分

安卓設(shè)備的物理存儲(chǔ) 分為兩大塊淑趾,內(nèi)部存儲(chǔ)和外部存儲(chǔ)

  • 內(nèi)部存儲(chǔ)
    設(shè)備中每一個(gè)安裝的 App莉炉,系統(tǒng)都會(huì)在內(nèi)部存儲(chǔ)空間的 data/data 目錄下以應(yīng)用包名為名字自動(dòng)創(chuàng)建與之對(duì)應(yīng)的文件夾梳虽,這個(gè)文件夾也用來(lái) 存放SharedPreferences 和 SQLiteDatabase 的數(shù)據(jù)假瞬, App 中的 WebView 緩存頁(yè)面信息也在這文件夾下义郑;
    但是 當(dāng)app被卸載的時(shí)候肝断,這個(gè)文件夾 會(huì)被刪除掉杈曲。
    開發(fā)過(guò)程中,可通過(guò) Context對(duì)象提供的 API 讀取操作 內(nèi)部存儲(chǔ)中的文件
//內(nèi)部存儲(chǔ)
            /**
             * Environment.getDataDirectory() : /data
             * context.getFilesDir() : /data/user/0/com.e.dk_wd/files
             * context.getCacheDir() : /data/user/0/com.e.dk_wd/cache
             * context.getDataDir() : /data/user/0/com.e.dk_wd
             */
            Log.i("----", "Environment.getDataDirectory() : " + Environment.getDataDirectory().absolutePath)
            Log.i("----", "context.getFilesDir() : " + this.filesDir!!.absolutePath)
            Log.i("----", "context.getCacheDir() : " + this.cacheDir!!.absolutePath)
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
                Log.i("----", "context.getDataDir() : " + this.dataDir!!.absolutePath)
            }
  • 外部存儲(chǔ)
    一般的手機(jī)設(shè)備都有會(huì)內(nèi)置 SD 卡胸懈,同時(shí)也提供 SD 卡的拓展担扑,可能對(duì)應(yīng)路徑的目錄名有所差異。
    所說(shuō)的外部存儲(chǔ)趣钱,就是手機(jī)設(shè)備內(nèi)置的SD卡和擴(kuò)展的SD卡 提供的存儲(chǔ)空間涌献;
    外部存儲(chǔ) 也會(huì)為 安裝的app 提供一塊區(qū)域(文件夾) ,用來(lái)存放私有的文件
    通常的路徑是:/storage/emulated/0/Android/data/包名/

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

存儲(chǔ)分區(qū)首有,是android系統(tǒng)對(duì)APP訪問(wèn)外部存儲(chǔ) 添加了限制燕垃;開啟存儲(chǔ)分區(qū)后 APP只能訪問(wèn)自己目錄下的文件和公共文件,
需要特別指出的是android 10 雖支持存儲(chǔ)分區(qū) 但可不開啟井联,對(duì)于android11 來(lái)說(shuō)卜壕,必須開啟存儲(chǔ)分區(qū),android11必須使用存儲(chǔ)分區(qū)烙常,
即使設(shè)置 android:requestLegacyExternalStorage="true" 也無(wú)效

//android10(包括android10)以下 可在清單文件中聲明 android:requestLegacyExternalStorage="true" 來(lái)不啟用存儲(chǔ)分區(qū)
<application
    ...
        android:requestLegacyExternalStorage="true">

開啟存儲(chǔ)分區(qū)后對(duì)文件訪問(wèn)的影響

對(duì)原來(lái)的內(nèi)部存儲(chǔ)沒有什么影響轴捎,但是對(duì)外部存儲(chǔ)有影響;
外部 存儲(chǔ)有兩個(gè)區(qū)域 app私有區(qū)域和app共享區(qū)域蚕脏;

  • app私有區(qū)域
    文件目錄在/android/data/app包名 下侦副,APP自身 不需要讀寫權(quán)限 就可以進(jìn)行讀寫,其他的app是無(wú)法訪問(wèn)這一區(qū)域的(自android7.0起)蝗锥;開啟存儲(chǔ)分區(qū)后 無(wú)變化
  • app共享區(qū)域
    只要有讀寫權(quán)限 每個(gè)app都可以讀寫跃洛,文件目錄有DCIM、Pictures终议,Download等在/storage/emulated/0 下的文件夾及文件;開啟存儲(chǔ)分區(qū)后汇竭,無(wú)法直接通過(guò)File 訪問(wèn)共享區(qū)域的文件,需要使用FileProvider或者M(jìn)ediaStore 來(lái)進(jìn)行訪問(wèn)穴张。

例如:在android 10以下的手機(jī)設(shè)備上 調(diào)起相機(jī)拍照细燎,使用 Uri.fromFile 的方式來(lái)創(chuàng)建照片文件是 沒有問(wèn)題的,但是 android11上皂甘,即使調(diào)起了相機(jī)拍照后 也無(wú)法成功保存照片

   if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
      //android7開始 就支持FileProvider,所以這里判斷大于android7
       mCurrentPhotoUri = FileProvider.getUriForFile(mContext,
                            "com.xx.fileprovider", photoFile);
 } else {
         mCurrentPhotoUri = Uri.fromFile(photoFile);
  }

什么是FileProvider?

android 7 后支持 應(yīng)用之間共享文件玻驻,這就是FileProvider的作用;
使用FileProvider 需要在清單文件中 聲明,注意一下 android:authorities指定的屬性值璧瞬,盡可能的保證唯一性 一般以".fileProvider" 結(jié)尾

<provider
            android:name="androidx.core.content.FileProvider"
            android:authorities="${applicationId}.fileProvider"
            android:exported="false"
            android:grantUriPermissions="true"
            tools:replace="android:authorities">
            <meta-data
                android:name="android.support.FILE_PROVIDER_PATHS"
                <!--這個(gè)file_paths文件在 Resource/xml 下-->
                android:resource="@xml/file_paths"
                tools:replace="android:resource" />
</provider>
       

其中 file_paths文件在 Resource/xml 下,原來(lái)指定共享的 文件路徑户辫;

<?xml version="1.0" encoding="utf-8"?>
<paths>
    <files-path
        name="file_path"
        path="." />
    <cache-path
        name="cache_path"
        path="." />
    <external-path
        name="external_path"
        path="." />
    <external-files-path
        name="external_files_path"
        path="." />
    <external-cache-path
        name="external_cache_path"
        path="." />
    <!--
    每個(gè)節(jié)點(diǎn)都支持兩個(gè)屬性:name+path;
    //path:需要臨時(shí)授權(quán)訪問(wèn)的路徑(.代表所有路徑)
    //name:就是你給這個(gè)訪問(wèn)路徑起個(gè)名字
    例如:
    <root-path name="root" path="" /> //代表設(shè)備的根目錄new File("/");
    <files-path name="files" path="" /> //context.getFilesDir()
    <cache-path name="cache" path="" /> //context.getCacheDir()
    <external-path name="external" path="" /> //Environment.getExternalStorageDirectory()
    <external-files-path name="name" path="path" /> //context.getExternalFilesDirs()
    <external-cache-path name="name" path="path" /> //getExternalCacheDirs()
    -->
</paths>

然后使用FileProvider API 來(lái)生成File的Uri路徑;

FileProvider.getUriForFile(mContext,"com.xx.fileprovider", photoFile);

這個(gè)"com.xx.fileprovider" 就是 授權(quán)認(rèn)證的信息嗤锉,如果填寫的和清單文件中的不一致 會(huì) 導(dǎo)致文件讀寫時(shí) 錯(cuò)誤渔欢;

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市瘟忱,隨后出現(xiàn)的幾起案子奥额,更是在濱河造成了極大的恐慌,老刑警劉巖访诱,帶你破解...
    沈念sama閱讀 210,978評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件垫挨,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡触菜,警方通過(guò)查閱死者的電腦和手機(jī)九榔,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,954評(píng)論 2 384
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)玫氢,“玉大人帚屉,你說(shuō)我怎么就攤上這事⊙浚” “怎么了攻旦?”我有些...
    開封第一講書人閱讀 156,623評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)生逸。 經(jīng)常有香客問(wèn)我牢屋,道長(zhǎng),這世上最難降的妖魔是什么槽袄? 我笑而不...
    開封第一講書人閱讀 56,324評(píng)論 1 282
  • 正文 為了忘掉前任烙无,我火速辦了婚禮,結(jié)果婚禮上遍尺,老公的妹妹穿的比我還像新娘截酷。我一直安慰自己,他們只是感情好乾戏,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,390評(píng)論 5 384
  • 文/花漫 我一把揭開白布迂苛。 她就那樣靜靜地躺著,像睡著了一般鼓择。 火紅的嫁衣襯著肌膚如雪三幻。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,741評(píng)論 1 289
  • 那天呐能,我揣著相機(jī)與錄音念搬,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛朗徊,可吹牛的內(nèi)容都是我干的首妖。 我是一名探鬼主播,決...
    沈念sama閱讀 38,892評(píng)論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼爷恳,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼悯搔!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起舌仍,我...
    開封第一講書人閱讀 37,655評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎通危,沒想到半個(gè)月后铸豁,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,104評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡菊碟,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,451評(píng)論 2 325
  • 正文 我和宋清朗相戀三年节芥,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片逆害。...
    茶點(diǎn)故事閱讀 38,569評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡头镊,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出魄幕,到底是詐尸還是另有隱情相艇,我是刑警寧澤,帶...
    沈念sama閱讀 34,254評(píng)論 4 328
  • 正文 年R本政府宣布纯陨,位于F島的核電站坛芽,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏翼抠。R本人自食惡果不足惜咙轩,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,834評(píng)論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望阴颖。 院中可真熱鬧活喊,春花似錦、人聲如沸量愧。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,725評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)侠畔。三九已至结缚,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間软棺,已是汗流浹背红竭。 一陣腳步聲響...
    開封第一講書人閱讀 31,950評(píng)論 1 264
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人茵宪。 一個(gè)月前我還...
    沈念sama閱讀 46,260評(píng)論 2 360
  • 正文 我出身青樓最冰,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親稀火。 傳聞我的和親對(duì)象是個(gè)殘疾皇子暖哨,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,446評(píng)論 2 348

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