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_STORAGEWRITE_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_STORAGEWRITE_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() ,其中指出,主要外部儲存。因此,主外部儲存充滿了隨機內容。

後來,增加了這兩種方法:

  1. Context 類中,他們新增了 getExternalFilesDir() ,指向主外部儲存上的特定應用程式的目錄。解除安裝應用程式時,將刪除此目錄及其內容。

  2. 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 作業系統。