Android 內(nèi)部存儲(chǔ)/外部存儲(chǔ) 及 讀寫權(quán)限

摘要

Android 使用 VFS (Virtual File System) 虛擬文件系統(tǒng)鱼响。VFS提供了供存儲(chǔ)設(shè)備掛載的節(jié)點(diǎn)鸣剪,同一存儲(chǔ)設(shè)備經(jīng)過(guò)分區(qū)后,不同的分區(qū)可以掛載到不同的節(jié)點(diǎn)上丈积,如手機(jī)的內(nèi)置存儲(chǔ)卡筐骇。

關(guān)鍵字

內(nèi)置存儲(chǔ)卡 / 外置SD卡
內(nèi)部存儲(chǔ) / 外部存儲(chǔ)

目錄結(jié)構(gòu)

VFS 的目錄以 / 為根節(jié)點(diǎn),根節(jié)點(diǎn)下面又有不同的節(jié)點(diǎn)江滨。物理存儲(chǔ)設(shè)備就是掛載到這些節(jié)點(diǎn)上铛纬。

目錄結(jié)構(gòu)

  • /data/data
    該節(jié)點(diǎn)是用戶應(yīng)用的安裝目錄,如百度地圖的安裝路徑是 /data/data/com.baidu.com唬滑,該目錄需要root權(quán)限
  • /system
    該節(jié)點(diǎn)是系統(tǒng)應(yīng)用的安裝目錄
  • /storage
    該節(jié)點(diǎn)是內(nèi)置存儲(chǔ)卡外置SD卡的掛載點(diǎn)
    外置SD卡掛載節(jié)點(diǎn):/storage/sdcard1
    內(nèi)置存儲(chǔ)卡掛載節(jié)點(diǎn):/storage/emulated/0
    不同的設(shè)備掛載節(jié)點(diǎn)不同告唆,有的可能在 /mnt下

內(nèi)部存儲(chǔ)和外部存儲(chǔ)

內(nèi)部存儲(chǔ)卡/外置SD卡 內(nèi)部存儲(chǔ)/外部存儲(chǔ)

首先明確,內(nèi)置存儲(chǔ)卡/外置SD卡 是在物理層面相對(duì)于手機(jī)大眾用戶來(lái)說(shuō)的晶密。
外置SD卡:可手動(dòng)插拔的SD卡擒悬。
內(nèi)置存儲(chǔ)卡:焊接在手機(jī)內(nèi)部不可拆卸的存儲(chǔ)卡。

而稻艰,內(nèi)部存 /外部存儲(chǔ) 是在文件系統(tǒng)邏輯層面相對(duì)于開發(fā)者來(lái)說(shuō)的懂牧,指具體的路徑。
一般針對(duì)某個(gè)應(yīng)用而言的尊勿,屬于該應(yīng)用的存儲(chǔ)路徑叫內(nèi)部存儲(chǔ)僧凤,反之為外部存儲(chǔ)。

內(nèi)部存儲(chǔ)

路徑:/data/data/package_name

/data/data/ 下都是已安裝應(yīng)用的目錄元扔,該目錄下包含的文件都是以包名作為文件名的目錄躯保,例如/data/data/com.sankuai.meituan

  1. 內(nèi)部存儲(chǔ)的文件是應(yīng)用的私有文件,其他應(yīng)用不能訪問(wèn)澎语。
  2. 應(yīng)用訪問(wèn)自己的內(nèi)部存儲(chǔ)不需要權(quán)限途事,訪問(wèn)外部存儲(chǔ)需要申請(qǐng)權(quán)限。
  3. 應(yīng)用卸載后咏连,這些文件也會(huì)被移除盯孙。

獲取內(nèi)部存儲(chǔ)的方式如下:

Context
File getDir(String name, String mode) ;
// /data/data/com.sankuai.meituan

File getFilesDir();
// /data/data/com.sankuai.meituan/files

File getCacheDir()
// /data/data/com.sankuai.meituan/cache

String getApplicationInfo().dataDir;
// /data/data/com.sankuai.meituan

其中,參數(shù) mode 指創(chuàng)建模式祟滴,一種 4 種

  1. MODE_PRIVATE振惰,設(shè)為私有文件
  2. MODE_APPEND,openFileOutput垄懂,文件存在則追加內(nèi)容
  3. MODE_WORLD_READABLE骑晶,API 17 廢棄
  4. MODE_WORLD_WRITEABLE痛垛,API 17 廢棄

注意: Android 7.0 以上android.os.Build.VERSION.SDK_INT>=Build.VERSION_CODES.N 使用3/4 常量時(shí),將會(huì)導(dǎo)致SecurityException桶蛔,這意味著不能通過(guò)名稱共享私有文件匙头。
嘗試共享 file://URI URI將會(huì)導(dǎo)致FileUriExposedException,StrictMode API政策禁止在您的應(yīng)用外部公開file://URL仔雷。如果您的應(yīng)用需要與其他應(yīng)用共享私有文件蹂析,則可以使用 FileProvider 與 FLAG_GRANT_READ_URI_PERMISSION 配合使用。Android 7.0 行為變更 通過(guò)FileProvider在應(yīng)用間共享文件吧

外部存儲(chǔ)

外部存儲(chǔ)碟婆,可以是 外置SD卡 或 內(nèi)置存儲(chǔ)卡的部分分區(qū)电抚。

外部存儲(chǔ),分為 公共目錄 和 私有目錄

版本 存儲(chǔ)位置 是否需要讀寫權(quán)限
Android 4.4以前 外部存儲(chǔ)(公共目錄和私有目錄) 需要
Android 4.4以后 外部存儲(chǔ)(公共目錄) 需要
Android 4.4以后 外部存儲(chǔ)(私有目錄) 不需要

外部存儲(chǔ) - 私有目錄

  1. 屬于應(yīng)用私有竖共,但是這些私有數(shù)據(jù)可以被其他應(yīng)用訪問(wèn)和修改(通過(guò)私有目錄的地址)
  2. 應(yīng)用卸載時(shí)蝙叛,此目錄及其內(nèi)容將被刪除。
  3. 系統(tǒng)媒體掃描程序不會(huì)讀取這些目錄的文件公给,因此不能從MediaStore內(nèi)容提供程序訪問(wèn)這些文件

獲取方式

Context
File getExternalCacheDir()
// /storage/emulated/0/Android/data/com.sankuai.meituan/cache

File getExternalFilesDir(String type)
// /storage/emulated/0/Android/data/com.sankuai.meituan/files

外部存儲(chǔ)注意事項(xiàng)

  1. 使用前先檢查文件狀態(tài)
    外部存儲(chǔ)的文件借帘,所有的應(yīng)用和用戶都能移除和修改這些權(quán)限。
    在使用外部存儲(chǔ)執(zhí)行工作之前淌铐,應(yīng)該使用 getExternalStorageState() 檢查介質(zhì)是否可用肺然,介質(zhì)可能已經(jīng)裝載到設(shè)備,處于缺失腿准、只讀或其他某種狀態(tài)狰挡。

檢查可用性的方法:

String status = Environment.getExternalStorageState();
boolean mounted = status.equals(Environment.MEDIA_MOUNTED)
                    || status.equals(Environment.MEDIA_MOUNTED_READ_ONLY);
return mounted;
  1. 對(duì)于支持外插SD卡的設(shè)備,外部存儲(chǔ)包括兩部分:內(nèi)置存儲(chǔ)卡和外置SD卡释涛;

Android 4.3 以下,只能通過(guò)Context#getExternalFilesDir(type) 來(lái)獲取外部存儲(chǔ)在內(nèi)置存儲(chǔ)卡分區(qū)的私有目錄倦沧,無(wú)法獲取外置SD卡唇撬。

Android 4.3 開始,可以通過(guò)Context#getExternalFilesDirs(type) 獲取一個(gè)File數(shù)組展融,包含了內(nèi)置存儲(chǔ)卡分區(qū)和外置SD的私有目錄地址窖认。

可以使用兼容庫(kù)的靜態(tài)方法 ContextCompate.getExternalFilesDirs() 兼容 4.3。

總結(jié)

  1. 應(yīng)用使用內(nèi)部存儲(chǔ)不需要權(quán)限告希,內(nèi)部存儲(chǔ)屬于應(yīng)用的私有存儲(chǔ)區(qū)域扑浸,其他應(yīng)用不可訪問(wèn),但應(yīng)用卸載燕偶,內(nèi)部存儲(chǔ)中對(duì)應(yīng)的文件也會(huì)刪除喝噪。
  2. 外部存儲(chǔ)分為公共目錄和私有目錄,外部存儲(chǔ)是可以全局訪問(wèn)的指么,但需要申請(qǐng)讀寫權(quán)限酝惧。Android4.4以后私有目錄不需要申請(qǐng)讀寫權(quán)限榴鼎。
  3. 如果緩存的數(shù)據(jù)量較大,請(qǐng)不要保存到內(nèi)部存儲(chǔ)中晚唇。
  4. 如果想保存可共享給其他應(yīng)用的數(shù)據(jù)巫财,請(qǐng)保存到外部存儲(chǔ)公共目錄中。
  5. clear data 和 clear cache 兩個(gè)都是應(yīng)用的緩存數(shù)據(jù)哩陕,清理的是外部存儲(chǔ)中的私有目錄下的files/cache平项,即 /storage/emulated/0/Android/data/com.sankuai.meituan/cache

參考資料

感謝以下文章作者
解析Android內(nèi)部存儲(chǔ)、外部存儲(chǔ)的區(qū)別

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末悍及,一起剝皮案震驚了整個(gè)濱河市闽瓢,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌并鸵,老刑警劉巖鸳粉,帶你破解...
    沈念sama閱讀 211,042評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異园担,居然都是意外死亡届谈,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,996評(píng)論 2 384
  • 文/潘曉璐 我一進(jìn)店門弯汰,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)艰山,“玉大人,你說(shuō)我怎么就攤上這事咏闪∈锇幔” “怎么了?”我有些...
    開封第一講書人閱讀 156,674評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵鸽嫂,是天一觀的道長(zhǎng)纵装。 經(jīng)常有香客問(wèn)我,道長(zhǎng)据某,這世上最難降的妖魔是什么橡娄? 我笑而不...
    開封第一講書人閱讀 56,340評(píng)論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮癣籽,結(jié)果婚禮上挽唉,老公的妹妹穿的比我還像新娘。我一直安慰自己筷狼,他們只是感情好瓶籽,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,404評(píng)論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著埂材,像睡著了一般塑顺。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上俏险,一...
    開封第一講書人閱讀 49,749評(píng)論 1 289
  • 那天茬暇,我揣著相機(jī)與錄音首昔,去河邊找鬼。 笑死糙俗,一個(gè)胖子當(dāng)著我的面吹牛勒奇,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播巧骚,決...
    沈念sama閱讀 38,902評(píng)論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼赊颠,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了劈彪?” 一聲冷哼從身側(cè)響起竣蹦,我...
    開封第一講書人閱讀 37,662評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎沧奴,沒想到半個(gè)月后痘括,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,110評(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,577評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡翰舌,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出冬骚,到底是詐尸還是另有隱情椅贱,我是刑警寧澤,帶...
    沈念sama閱讀 34,258評(píng)論 4 328
  • 正文 年R本政府宣布只冻,位于F島的核電站庇麦,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏喜德。R本人自食惡果不足惜女器,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,848評(píng)論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望住诸。 院中可真熱鬧,春花似錦涣澡、人聲如沸贱呐。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,726評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)奄薇。三九已至,卻和暖如春抗愁,著一層夾襖步出監(jiān)牢的瞬間馁蒂,已是汗流浹背呵晚。 一陣腳步聲響...
    開封第一講書人閱讀 31,952評(píng)論 1 264
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留沫屡,地道東北人饵隙。 一個(gè)月前我還...
    沈念sama閱讀 46,271評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像沮脖,于是被迫代替她去往敵國(guó)和親金矛。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,452評(píng)論 2 348