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 操作系统。