内部存储、外部存储、SD卡和可移动存储之间有哪些区别?

60
根据官方文档

使用外部存储

每个兼容Android的设备都支持一个共享的“外部存储”,您可以用它来保存文件。这可以是可移动的存储介质(如SD卡)或内部(不可移动)存储...

我对这个主题非常困惑。从我的理解来看,使用外部存储并不一定意味着使用可拆卸的卡,我对吗?然而,当谈到外部存储时,它总是被称为“SD卡”。
我正在开发一个从互联网下载.mp3文件的应用程序。我想将这些文件保存在手机内存中(不想使用任何可移动设备),但根据我所学,这些文件必须保存在外部存储器中。然而,我希望提供从可移动设备导入文件的可能性。我应该在哪里以及如何保存这些文件?
谢谢。

参考文献:https://developer.android.com/guide/topics/data/data-storage.html 和 https://developer.android.com/training/basics/data-storage/files.html - greg7gkb
这个链接:https://dev59.com/2W445IYBdhLWcg3wAFcC#38700948 可能会解决你的困惑。 - AnV
6个回答

53

内部存储:指除通过已安装的应用程序(或通过rooting设备)之外,用户无法访问的存储。例如:data/data/app_packageName。

外部存储有两种类型:

主要外部存储:内置的共享存储器,可以通过连接USB电缆并将其作为驱动器挂载到主机计算机上来“由用户访问”。例如:当我们说Nexus 5 32 GB时。

次要外部存储:可移动存储器。例如:SD卡。


KitKat会使你的SD卡变得完全无用:根据Android API规范,应用程序不能再将文件写入您的SD卡。 - M at

42

当构建一个使用内部存储的应用时,Android操作系统会创建一个唯一的文件夹,只有该应用可以访问它,因此其他应用程序甚至用户都无法看到该文件夹中的内容。

外部存储更像是一个公共存储空间,所以现在它是SD卡,但也可以变成任何其他类型的存储(远程硬盘或其他)。

内部存储应仅用于应用数据(偏好设置文件和设置、音频或图像媒体以使应用程序正常工作)。如果您打算下载许多MP3,建议将它们保存到外部存储中,因为外部存储通常更大。此外,将数据存储在内部存储中可能会阻止用户安装其他应用程序。


6
首先,非常感谢您的快速回答。所以好的,但是当您谈论外部存储时,它不是可拆卸的卡,对吗?我的做法是:首选项保存在内部存储器上,.mp3文件保存在外部存储器上(称为sdcard?),此外,我想使用可移动卡让用户将文件导入应用程序。这是否可能? - carlos
目前来说,外部存储通常指SD卡,因此这是可能的。 - neteinstein
1
SD卡被称为“外部存储”,以便与其他独立于系统的存储方式兼容。因此,SD卡和外部存储是相同的。您需要做的是为您的mp3创建一个特定的文件夹,并扫描外部存储(或让用户浏览)以查找他自己的文件。 - XGouchet
1
只有通过应用程序才能访问,因此没有其他应用程序,甚至用户可以访问。您可以在“设置>存储>文件>Android>数据>包名>文件”下访问getFilesDir()中的文件。所以,您说的不正确。 - Farid

39
根据Google/官方Android文档,内部存储和外部存储的术语与我们所想的不同。
根据官方Android文档:
- 内部存储:默认情况下,保存在内部存储中的文件是应用私有的,其他应用程序无法访问。当用户卸载您的应用程序时,这些文件将被删除。即使在文件管理器中启用“显示隐藏文件”选项,您的应用用户也无法访问它们。要访问内部存储中的文件,您必须root您的Android手机。因此,这并不是我们所认为的手机内存的内部存储 - Nexus 5的32GB内部存储。
- 外部存储:这可以是可移动存储介质(例如SD卡)或内部(不可移动)存储。
这意味着,像Nexus 6P的64GB内部存储和我们插入手机卡槽的可移动microSD卡这两种存储类型都被视为外部存储。
"可移动存储"指的仅是microSD卡存储,而非内部存储。
要将应用程序文件存储在SD卡中,您可以使用Context类中的`File[] getExternalFilesDirs(String type)`方法。通常,第二个返回的路径将是microSD卡的存储路径(如果有的话)。
注意:在@Tunaki的评论后,我进行了编辑 - 使我的答案更有用。

3
当应用被卸载时,Context.getExternalFilesDirs() 返回的文件目录将被删除。 - Doopy

16
开发者文档中可以得知,所有的安卓设备都有两个文件存储区域:"内部"和"外部"存储。这些名称来源于安卓早期,当时大多数设备都提供了内置非易失性内存(内部存储),以及一个可移除的存储介质(如micro SD卡)(外部存储)。一些设备将永久存储空间分成“内部”和“外部”分区,因此即使没有可移动存储介质,也始终存在两个存储空间,并且API行为无论外部存储是否可移除均相同。

6
我认为在操作系统中,外部存储是指与实际的操作系统文件结构无关的任何内容。如果您还记得,当您写入“内部存储”时,Android会为您的应用程序私下创建一个文件夹。因此,如果这是某种隐藏文件夹,那么外部存储可以指任何不被操作系统自动隐藏或直接管理的内容。这意味着智能手机制造商可以定义内部存储的概念,因为他们可以在内部闪存上有两个分区,其中一个分区用于保持操作系统,另一个分区则让您存储在手机上的所有内容。

基本上我想说的是:这更多是一个硬件相关的事情,而“外部存储”的概念甚至可以扩展到制造商添加的额外的内部存储(闪存)。您甚至可以将用户定义的存储选项视为“外部存储”。


1
如果设备同时拥有内部分区和SD卡作为“外部存储”,您是否可以选择在这两个位置之间存储文件,还是操作系统会自动将文件存储到外部存储设备上? - trusktr

0

这是最新的Android(目前为Android 13)的更新答案。

内部存储以前指的是手机的内部存储器,外部存储则指插入的SD卡等其他设备。现在,情况已经不再如此,因为手机不再有SD卡了。没有SD卡插槽的手机仍然从应用程序的角度拥有“外部存储”(例如Environment.getExternalStorageDirectory()仍然返回一个有效的位置),但它是模拟的 - 这意味着它实际上是内部存储的一部分。

这意味着外部和内部存储之间的一个重要区别 - 外部存储速度较慢但容量更大,而内部存储速度快但容量较小 - 不再成立。

自Android 11以来,外部存储已经被限定范围。这意味着应用程序获得了一个只能由它们自己读取且其他任何应用程序无法读取的文件夹(尽管请参见下文)。他们可以在没有权限的情况下访问此文件夹。同样,这使得外部存储与内部存储保持一致。(请注意,限定范围实际上出现在Android 10中,但自Android 11以来才得到执行)。

但是内部存储和外部存储之间仍然存在差异。

一个重大的区别在于应用程序仍然可以获得读写所有外部存储的权限(MANAGE_EXTERNAL_STORAGE)。 这很难获得-用户需要手动进入设置来启用它,而实现它的应用程序在Play Store上受到严格限制。

但是这意味着写入外部存储的数据比写入内部存储的数据不太安全。 其他应用程序可能会窃听外部存储。

以上是TL; DR,但还有更多内容。 这是一篇好文章:https://medium.com/@tdcolvin/demystifying-internal-vs-external-storage-in-modern-android-c9c31cb8eeec


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接