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



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

我希望"Google+ cropper应用程序"使用它。

但后者打开另一个图像。

我猜是权限问题。

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

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

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

为什么有区别?

我应该用这个地方吗?这是外接存储器吗?

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

从历史上看,内部存储和外部存储的区别如下…

Internal: Android设备的内部闪存,用于为每个应用分配私有存储空间。分配的存储空间被保护,以防止任何其他应用访问(除了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(),那么你访问的是内部存储的根分配给你的应用程序,只有你的应用程序可以访问(尽管,正如我提到的根手机可以访问私有/内部存储)。

最新更新