1. 程式人生 > >是時候弄清楚getExternalStorageDirectory()和getExternalFilesDir()的區別了

是時候弄清楚getExternalStorageDirectory()和getExternalFilesDir()的區別了

之前看到一位網友的吐槽:當我把手機連線到電腦上時,在SD卡根目錄看到了成百上千個各種應用程式建立的資料夾,拜託了各位開發者,你真的認為我的手機上只安裝你一個app嗎?你認為你的app是世界上最重要的app嗎?你應該將你的應用資料寫到這個路徑下!/Android/data/< package name >/files/…

作為一個開發者,我們的確不應該將我們應用的資料直接存到SD卡的根目錄下,當手機安裝了大量的app時,SD卡根目錄會迅速變得雜亂不堪。

這篇文章將帶大家區分一下什麼樣的資料應該存放到什麼樣的路徑下。

App專屬檔案 vs App獨立檔案

app專屬檔案就是那些只有該app才可以使用的檔案,例如專屬格式的電子書,app獨立檔案就是那些不依賴於某特定app的檔案,例如照片。

App獨立檔案

這類檔案當我們刪除應用之後,還應該保留在手機上的,例如拍照的照片,不應該隨著刪除應用而被刪除掉。對於這類檔案,Android給我們提供了特定的目錄,這些目錄都是以DIRECTORY開頭的,例如:DIRECTORY_MUSIC , DIRECTORY_PICTURES.

訪問這些資料夾有兩種方式:

第一種:

File sdCard = Environment.getExternalStorageDirectory();

這個sdCard的路徑為mnt/sdcard/ 即為SD卡根路徑,我們可以指定訪問的資料夾名

File sdCard = Environment.getExternalStorageDirectory();
File directory_pictures = new
File(sdCard, "Pictures"); Log.i(TAG,"directory_pictures="+directory_pictures);

得到的路徑如下:
這裡寫圖片描述

第二種:

File directory_pictures = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES);
Log.e(TAG, "directory_pictures="+directory_pictures);

得到的路徑如下:
這裡寫圖片描述

第二種方法是一個更加方便的訪問Android給我們提供好的一些公共目錄的方法,第一種方式更加靈活,可以自己指定目錄。

App專屬檔案

這類檔案應該是隨著app刪除而一起刪除的,它們可以被儲存在兩個地方:internal storage 和 external storage 。 internal storage就是手機自帶的一塊儲存區域,通常很小;external storage就是通常所說的SD卡,通常很大,有16GB,32GB等。

internal storage很小,所以你就應該很正確的使用它,因為SD卡有可能會被使用者卸下,換成新的,所以SD卡不是任何時間都可用的,因此我們必須將一些重要的資料庫檔案以及一些使用者配置檔案存放在internal storage中。將一些大的圖片或檔案等快取放到external storage中。

儲存在internal storage

這是你app私有的目錄,你的shared preference檔案,資料庫檔案,都儲存在這裡。目錄為data/data/< package name >/files/
訪問方法為:

 File filesDir = getFilesDir();
 Log.i(TAG,"file_dir="+filesDir);

這裡寫圖片描述

儲存在external storage

這類檔案不應該存在SD卡的根目錄下,而應該存在mnt/sdcard/Android/data/< package name >/files/…這個目錄下。這類檔案應該隨著App的刪除而一起刪除。例如一種格式的電子書,只有該app才可以開啟,如果使用者刪除了該app,那麼留下來的電子書就成為了一種無法開啟的垃圾檔案,所以應該隨著該app一起刪除掉。

獲得這個路徑的方法:

 File externalFilesDir = getExternalFilesDir(null);
 Log.i(TAG, "externalFileDir = "+externalFilesDir);

我們看一下log中的內容為null,這是由於我們沒有新增許可權
這裡寫圖片描述

新增許可權:

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>

再看一下log:
這裡寫圖片描述這樣路徑就訪問到了,我們注意到上面的getExternalFilesDir(null)引數傳入的為null,這樣預設訪問的是files資料夾,我們可以指定子資料夾

 File externalFilesDir = getExternalFilesDir("Caches");
 Log.i(TAG, "externalFileDir = "+externalFilesDir);

這裡寫圖片描述

有些時候我們的手機沒有安裝SD卡,所以我們使用前需要判斷一下:

if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
        //SD卡已裝入
    }

相關推薦

是時候清楚getExternalStorageDirectory()getExternalFilesDir()的區別

之前看到一位網友的吐槽:當我把手機連線到電腦上時,在SD卡根目錄看到了成百上千個各種應用程式建立的資料夾,拜託了各位開發者,你真的認為我的手機上只安裝你一個app嗎?你認為你的app是世界上最重要的app嗎?你應該將你的應用資料寫到這個路徑下!/Android/

android,getExternalStorageDirectory()getExternalFilesDir()的區別

轉載地址:https://blog.csdn.net/nugongahou110/article/details/48154859 之前看到一位網友的吐槽:當我把手機連線到電腦上時,在SD卡根目錄看到了成百上千個各種應用程式建立的資料夾,拜託了各位開發者,你真的認為我的手機上只安裝你一個app嗎?你認為你的

不要再問芝士乳酪有什麼區別!一次解釋清楚

 在西方,乳酪絕對是全民食物,無論男女老少,很多都是“沒乳酪會死星人”。兩位世界知名大佬都曾對它發表過經典言論,丘吉爾在二戰時說,一個為世界提供300種以上乳酪的國家是不應該滅亡的。而戴高樂總統的看法則是:“要統治一個擁有600種乳酪的國家,是很困難的。”      

PP1指向OO1兩個變量(對象)的地址, 而不是OO1的內容(對象的實際地址)——充分證明@是取變量(對象)的地址,而不是變量裏面的內容,夠清楚

com 告訴 cnblogs src logs es2017 strong bsp html 如圖,為什麽這樣取出來的p,p1的值不一樣呢? 165232328群友庾偉洪告訴我: P和P1指向了O和O1兩個變量(對象)的地址, 而不是O和O1的內容(對象

關於JREJDK的區別,終於知道他們的區別

java,從大三上學期就開始接觸,只是前幾堂課翹掉了。導致,一直弄不明白,JDK和JRE的區別是什麼??經過幾年的“鑽研”,“開悟”,我終於明白了。哦哈哈哈JDK,開發java程式用的開發包,JDK裡面有java的執行環境(JRE),包括client和server端的。需要

明白CMSG1,就靠這一篇

目錄 1 CMS收集器 安全點(Safepoint) 安全區域 2 G1收集器 卡表(Card Table) 3 總結 4

GETPOST區別總結

get 、post 、區別一、GET和POST區別的普遍看法:HTTP 定義了與服務器交互的不同方法,最常用的有4種,Get、Post、Put、Delete,如果我換一下順序就好記了,Put(增),Delete(刪),Post(改),Get(查),即增刪改查,下面簡單敘述一下:1)Get, 它用於獲取信息,註

JS中const、varlet區別

方法 pre 命令 con 使用 它的 comm 作用 影響 在JavaScript中有三種聲明變量的方式:var、let、const。 1.const 聲明創建一個只讀的常量。這不意味著常量指向的值不可變,而是變量標識符的值只能賦值一次,必須初始化。 const b

equals == 的區別

strong 都是 什麽 brush -s 新的 equals方法 實現 繼承 首先 看比較的對象是否為字符串,若為(String)字符串用equals 比較, 比較的是他們的值。相同返回 true ,不相同返回false. package one; p

mybatis中的#$的區別

背景 插入 trac sql註入 -m .com article 參數 -s 1. #將傳入的數據都當成一個字符串,會對自動傳入的數據加一個雙引號。如:order by #user_id#,如果傳入的值是111,那麽解析成sql時的值為order by "111", 如果傳

hibernate中hql語句中listiterate區別

每次 hibernate 寫入 所有 讀取 條件 iter 查詢 hql 1.使用list()方法獲取查詢結果,每次發出一條語句,獲取全部數據。2.使用iterate()方法獲取查詢結果,先發出一條SQL語句用來查詢滿足條件數據的id,然後依次按照這些id查詢記錄,也就是要

docker的存儲結構,以前有很大不同

img docker 發現 container ref url docker容器 str blog 在網上學習這一塊知識點時,有一個URL講得很詳細, docker 鏡像與容器存儲目錄結構精講 http://blog.csdn.net/wanglei_storage/a

java中ArrayListLinkedList區別

插入 list 新的 查找 arr tro 基於 列表 時間復雜度 ArrayList和LinkedList最主要的區別是基於不同數據結構 ArrayList是基於動態數組的數據結構,LinkedList基於鏈表的數據結構,針對這點,從時間復雜度和空間復雜度來看主要區別:

mysql中replicate_wild_do_tablereplicate_do_db區別

lan rep cati mil 多人 pan think lte 避免 使用replicate_do_db和replicate_ignore_db時有一個隱患,跨庫更新時會出錯。 如在Master(主)服務器上設置 replicate_do_db=test(my.conf

2000行之宏中###的區別

ret fun color bsp nbsp urn div def include #include<stdio.h> #define Fun(a,b) a##b int main() { x=‘H‘; y=‘W‘; printf("

就要人開會居然還嘮嗑熱交換看人就好可人家會可人家好看熱計量客人和

火熱進貨款了軟件和認可了集合弱口令幾何人了進而會理解好了認可和坑人了機會了軟件和了認可和人了看見好了認可換了人間和和熱就要和人開會了居然還嘮嗑熱交換看了人就好了可人家會了可人家好看了熱計量和客人和

HTML提交方式postget區別(實驗)

des url action 通過 性別 清除數據 map pass pack HTML提交方式post和get區別(實驗) 一、post和get區別 get提交,提交的信息都顯示在地址欄中。 post提交,提交的信息不顯示地址欄中,顯示在消息體中。 二、客戶端代碼

stringbuffer stringbuilder區別

uil build 線程 區別 單線程 線程安全 多線程操作 buffer 少量數據 stringbuffer 和 stringbuilder速度 小於 線程安全 線程非安全 單線程操作

水晶頭鍍金30U50區別

style 價格 -1 font 質量 穩定性 tex 穩定 size U是厚度單位,1μm≈40u。一般來說鍍金越厚,越耐插播,耐酸堿腐蝕,觸點壽命越長,傳輸穩定性越好,價格越貴。但是事實上,鍍金層的質量,或者說鍍金對水晶頭質量的影響,跟工藝的關系更密切。水晶頭鍍金30U

程序員_你高考隔幾年?

成了 高科技 經典 itl 還記得 是你 ont 開啟 恢復 原文鏈接 高考季又到啦!話說你還記得你當年高考考了幾分嗎?雖然都已經過去N年了,但是總覺得這一生一次的高考要影響我們一生一世了。 你知道嗎?今年是恢復高考的第40年。到現在高考基本上是每個中國人的必經之路。對於