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