`/ storage / emulated / legacy /`vs` / storage / emulated / 0 /`vs`data / data / myApp'

时间:2014-05-13 07:25:47

标签: android storage

我想在我的应用中保存一个imageFile

我希望“Google+ cropper app”能够使用它。

但是后来打开了另一张图片。

我猜这是权限问题。

在我的代码中,我保存在这里:

这是外置存储吗? Environment.getExternalStorageDirectory().getAbsolutePath()返回:/storage/emulated/0/myApp/file1.tmp

使用adb shell看到该文件实际保存在:/storage/emulated/legacy/myApp/file1.tmp

为什么会有区别?

我应该使用这个地方吗? 这是外部存储吗?

getAppContext().getFilesDir().getParent()返回:`data / data / myApp'

1 个答案:

答案 0 :(得分:28)

历史上,内部和外部存储之间的区别如下......

内部: Android设备的内部闪存,用于为每个应用分配私有存储空间。分配的存储受到保护,以防止任何其他应用程序访问(根设备除外)。

外部:在许多情况下,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(),那么你正在访问私下分配给你的应用程序的内部存储的根目录,只能访问你的应用程序(尽管如我所提到的,根电话可以访问私人/内部存储)。 / p>