`/storage/emulated/legacy/`与`/storage/emulated/0/`与`data/data/myApp`的区别。

16
我想在我的应用程序中保存一个imageFile。
我想使用 "Google+剪裁器应用程序" 进行操作。
但是后者打开了另一张图片。
我猜这是权限问题。
在我的代码中,我在这里保存:
这是外部存储器吗? Environment.getExternalStorageDirectory().getAbsolutePath() 会返回:/storage/emulated/0/myApp/file1.tmp 使用 adb shell 可以看到文件实际上被保存在 /storage/emulated/legacy/myApp/file1.tmp 中。
为什么会有差异?
我应该使用这个地方吗?这是外部存储器吗?
getAppContext().getFilesDir().getParent() 返回 `data/data/myApp'
1个回答

29

历史上,内部存储和外部存储的区别如下:

内部存储:安卓设备的内部闪存存储器用于为每个应用程序分配私有存储空间。所分配的存储空间受到保护,以防止任何其他应用程序访问(除非是在已root的设备上)。

外部存储:在许多情况下,SD卡没有安全限制,即所有应用程序都可以访问“外部”存储的所有区域。

随着Android的新版本推出和新设备内置闪存存储越来越多,内部存储和外部存储之间的差异正在变得模糊。例如,我的Nexus 7没有SD卡插槽。

对于没有真正外部存储的设备,Android仍然需要提供模拟的外部存储,以保持与旧应用程序的兼容性。换句话说,RAM物理上是内部的(不可移动的),但其中的一部分被划分为Android文件系统API将该分区视为“外部”且可全球读取。

至于您在外部存储中看到的路径,例如...

/storage/emulated/0/myApp/file1.tmp
/storage/emulated/legacy/myApp/file1.tmp

......其中一项或两项(可能都有)是重定向或“虚拟”路径,指向模拟的外部目录和文件的相同部分。

这就是为什么始终使用正确的API调用来访问文件和目录非常重要,而不是假设硬编码路径,因为它可能因设备而异。

如果您使用Environment.getExternalStorageDirectory(),则可以确信任何其他执行相同操作的应用程序都能够访问您在那里创建的任何文件。

如果您使用getFilesDir(),则正在访问专门为您的应用程序私有分配的内部存储的根目录,仅可由您的应用程序访问(尽管如我所提到的,已经取得root权限的手机可以访问私有/内部存储)。


谷歌+裁剪器为何无法访问/storage/emulated/0/myApp/file1.tmp中捕获的图像,而照片库裁剪器可以找到并访问此照片呢?感谢。 - Elad Benda
@EladBenda:不知道他们是如何编写代码的,所以很难说。你可以尝试在使用时监控logcat,并查看是否会出现任何错误/异常,例如文件未找到或访问被拒绝。 - Squonk
5
还有一件事需要注意:从KitKat(4.4)开始,Android不允许下载的应用程序向SD卡上任意路径写入。它们只能写入/Android/data/*appname*/files目录,如果该目录存在(如果不存在,则应用程序将无法创建它)。系统应用程序仍然可以像往常一样访问SD卡。参考:*1*23 - LogicDaemon
换句话说,RAM是物理上内置的(不可移除)吗? - Marian Paździoch

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