Android 內部和外部儲存 - 術語說明
Android 開發人員(主要是初學者)對內部和外部儲存術語感到困惑。Stackoverflow 上有很多關於它的問題。這主要是因為根據 Google /官方 Android 文件的術語與普通 Android OS 使用者的術語完全不同。因此,我認為記錄這將有所幫助。
我們的想法 - 使用者術語(UT)
內部儲存(UT) | 外部儲存(UT) |
---|---|
手機的內建記憶體 | 可移動安全數字(SD)卡或 micro SD 儲存 |
示例: Nexus 6P 的 32 GB 記憶體。 | 示例: 供應商提供的可移動 SD 卡中的儲存空間,如三星,sandisk,strontium,beyondnd 等 |
但是,根據 Android 文件/指南 - 谷歌的術語(GT)
內部儲存(GT):
預設情況下,儲存到內部儲存的檔案對應用程式是私有的,而其他應用程式無法訪問它們(使用者也無法訪問)。
外部儲存(GT):
這可以是可移動儲存介質(例如 SD 卡)或內部(不可移動)儲存。
外部儲存(GT)可分為兩種型別:
主外部儲存 | 二級外部儲存或可移動儲存(GT) |
---|---|
這與手機的內建記憶體(或)內部儲存(UT)相同 | 這與可移動微型 SD 卡儲存(或)外部儲存(UT)相同 |
示例: Nexus 6P 的 32 GB 記憶體。 | 示例: 供應商提供的可移動 SD 卡中的儲存空間,如三星,sandisk,strontium,beyondnd 等 |
通過 USB 電纜將手機連線到 PC 並在 USB 選項通知中選擇攝像頭(PTP) ,可以在 Windows PC 上訪問此類儲存。 | 通過 USB 電纜將手機連線到 PC 並在 USB 選項通知中選擇檔案傳輸,可以在 Windows PC 上訪問此類儲存。 |
簡而言之,
外部儲存(GT)=內部儲存(UT)和外部儲存(UT)
可移動儲存(GT)=外部儲存(UT)
內部儲存(GT)沒有 UT 的術語
讓我解釋清楚,
內部儲存(GT): 預設情況下,儲存到內部儲存的檔案對你的應用程式是私有的,而其他應用程式無法訪問它們。你的應用使用者也無法使用檔案管理器訪問它們; 甚至在檔案管理器中啟用顯示隱藏檔案選項後。要訪問內部儲存(GT)中的檔案,你必須使用 Android 手機。此外,當使用者解除安裝你的應用程式時,將刪除/刪除這些檔案。
所以內部儲存(GT) 不是我們認為的 Nexus 6P 的 32/64 GB 記憶體
通常,內部儲存(GT)位置為:/data/data/your.application.package.appname/someDirectory/
外部儲存(GT):
每個 Android 相容裝置都支援可用於儲存檔案的共享外部儲存。儲存到外部儲存器的檔案是世界可讀的,當使用者啟用 USB 海量儲存器在計算機上傳輸檔案時,可以對其進行修改。
外部儲存(GT)位置: 它可以位於內部儲存(UT)或可移動儲存(GT)中的任何位置,即 micro SD 卡。這取決於你手機的 OEM 以及 Android OS 版本。
要在外部儲存(GT)上讀取或寫入檔案,你的應用必須獲取 READ_EXTERNAL_STORAGE
或 WRITE_EXTERNAL_STORAGE
系統許可權。
例如:
<manifest ...>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
...
</manifest>
如果你需要同時讀取和寫入檔案,那麼你只需要請求
WRITE_EXTERNAL_STORAGE
許可權,因為它也隱含地要求讀取許可權。
在外部儲存(GT)中,你還可以儲存 app-private 檔案 ****
但,
當使用者解除安裝你的應用程式時,將刪除此目錄及其所有內容。
你何時需要在外部儲存(GT)中儲存應用程式專用的檔案? ****
如果你正在處理不適合其他應用程式使用的檔案(例如僅由你的應用程式使用的圖形紋理或聲音效果),則應在外部儲存上使用專用儲存目錄
從 Android 4.4 開始,在應用程式的私人目錄中讀取或寫入檔案不需要
READ_EXTERNAL_STORAGE
或WRITE_EXTERNAL_STORAGE
許可權。因此,你可以通過新增maxSdkVersion
屬性來宣告僅在較低版本的 Android 上請求許可權:
<manifest ...>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"
android:maxSdkVersion="18" />
...
</manifest
儲存在內部儲存(GT)中的方法:
這兩種方法都存在於 Context 類中
File getDir (String name, int mode)
File getFilesDir ()
儲存在主外部儲存中的方法,即內部儲存(UT):
File getExternalStorageDirectory ()
File getExternalFilesDir (String type)
File getExternalStoragePublicDirectory (String type)
在開始的時候,每個人都使用 Environment.getExternalStorageDirectory()
,其中指出,根的主要外部儲存。因此,主外部儲存充滿了隨機內容。
後來,增加了這兩種方法:
-
在
Context
類中,他們新增了getExternalFilesDir()
,指向主外部儲存上的特定於應用程式的目錄。解除安裝應用程式時,將刪除此目錄及其內容。 -
Environment.getExternalStoragePublicDirectory()
用於儲存著名檔案型別(如照片和電影 ) 的集中位置。解除安裝應用程式時,不會刪除此目錄及其內容。
儲存在可移動儲存(GT)中的方法,即微型 SD 卡
在 API 級別 19 之前,沒有正式的方法儲存在 SD 卡中。但是,許多人可以使用非官方庫或 API 來實現。
正式地,在 API 級別 19(Android 版本 4.4 - Kitkat)的 Context
類中引入了一種方法。
File[] getExternalFilesDirs (String type)
它返回應用程式可以放置其擁有的持久檔案的所有共享/外部儲存裝置上的特定於應用程式的目錄的絕對路徑。這些檔案是應用程式的內部檔案,通常不會被使用者視為媒體。
這意味著,它將返回兩種型別的外部儲存(GT) - 內部儲存器和 Micro SD 卡的路徑。通常,第二路徑將是微 SD 卡的儲存路徑(但並非總是如此)。因此,你需要通過使用此方法執行程式碼來檢查它。
程式碼段示例:
我用空活動建立了一個新的 android 專案,裡面寫了下面的程式碼
protected void onCreate(Bundle savedInstanceState)
方法
File internal_m1 = getDir("custom", 0);
File internal_m2 = getFilesDir();
File external_m1 = Environment.getExternalStorageDirectory();
File external_m2 = getExternalFilesDir(null);
File external_m2_Args = getExternalFilesDir(Environment.DIRECTORY_PICTURES);
File external_m3 = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES);
File[] external_AND_removable_storage_m1 = getExternalFilesDirs(null);
File[] external_AND_removable_storage_m1_Args = getExternalFilesDirs(Environment.DIRECTORY_PICTURES);
執行上面的程式碼後,
輸出:
internal_m1: /data/data/your.application.package.appname/app_custom
internal_m2: /data/data/your.application.package.appname/files
external_m1: /storage/emulated/0
external_m2: /storage/emulated/0/Android/data/your.application.package.appname/files
external_m2_Args: /storage/emulated/0/Android/data/your.application.package.appname/files/Pictures
external_m3: /storage/emulated/0/Pictures
external_AND_removable_storage_m1 (first path):
/storage/emulated/0/Android/data/your.application.package.appname/files
external_AND_removable_storage_m1 (second path):
/storage/sdcard1/Android/data/your.application.package.appname/files
external_AND_removable_storage_m1_Args (first path):
/storage/emulated/0/Android/data/your.application.package.appname/files/Pictures
external_AND_removable_storage_m1_Args (second path): /storage/sdcard1/Android/data/your.application.package.appname/files/Pictures
注意: 我已將手機連線到 Windows PC; 啟用了開發人員選項,USB 除錯,然後執行此程式碼。如果你沒有連線手機 ; 但是在 Android 模擬器上執行它,你的輸出可能會有所不同。我的手機型號是 Coolpad Note 3 - 在 Android 5.1 上執行
我手機上的儲存位置:
Micro SD 儲存位置 :/storage/sdcard1
內部儲存(UT)位置 :/storage/sdcard0
。
請注意,/sdcard
&/storage/emulated/0
也指向內部儲存(UT)。但這些是/storage/sdcard0
的符號連結。
要清楚地瞭解 Android 中的不同儲存路徑,請仔細閱讀此答案
免責宣告: 上面提到的所有儲存路徑都是我手機上的路徑。你的檔案可能不會儲存在相同的儲存路徑中。因為,儲存位置/路徑可能會因其他手機而異,具體取決於你的供應商,製造商和不同版本的 Android 作業系統。