Android支援外部存儲(case-insensitive filesystem with immutable POSIX permission classes and modes)。
外部存儲可以通過實體媒體提供(如SD卡),也可以通過将内部存儲中的一部分封裝而成,裝置可以有多個外部存儲執行個體。
從Android 1.0開始,寫操作受權限WRITE_EXTERNAL_STORAGE保護。
從Android 4.1開始,讀操作受權限READ_EXTERNAL_STORAGE保護。
從Android 4.4開始,應用可以管理在它外部存儲上的特定包名目錄,而不用擷取WRITE_EXTERNAL_STORAGE權限。
比如,一個包名為com.example.foo的應用,可以自由通路外存上的Android/data/com.example.foo/目錄。
外部存儲對資料提供的保護較少,是以系統不應該存儲敏感資料在外部存儲上。
特别地,配置和log檔案應該存儲在内部存儲中,這樣它們可以被有效地保護。
對于多使用者的情況,一般每個使用者都會有自己獨立的外部存儲,應用僅對目前使用者的外部存儲有通路權限。
還有多使用者或者多外部存儲的情況,此文不再讨論。
為了不污染使用者的根命名空間,一般不會直接使用這個外部存儲的根目錄。
從Android 4.4這兩個方法不需要讀寫權限,是針對于本應用來說,如果要通路其他應用的相關目錄,還是需要聲明讀寫權限。
Android 4.4之前的版本要通路的話還是要聲明讀寫權限的,如果沒有在manifest中寫權限,上面兩個get方法都會傳回null。
與上面兩個方法形成對比的是下面兩個方法:
這兩個方法得到的是記憶體上的目錄。
這些目錄都是屬于應用的,當應用被解除安裝的時候,裡面的内容都會被移除,但是不要依賴于系統的操作。
在MI 2S上輸出Log:

在三星S5660上(API Level 9,注釋掉了兩個方法):
android.os.Environment
External Storage Technical Information
Context