android - `/storage/emulated/legacy/` 对比 `/storage/emulated/0/` 对比 `data/data/myApp'

原文 标签 android storage

我想在我的应用程序中保存一个 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'

最佳答案

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

内部: Android 设备的内部闪存,用于为每个应用分配私有(private)存储空间。分配的存储受到保护,以防止任何其他应用程序访问(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()那么您正在访问私有(private)分配给您的应用程序的内部存储的根目录,并且只能由您的应用程序访问(尽管,正如我提到的,有根电话可以访问私有(private)/内部存储)。

关于android - `/storage/emulated/legacy/` 对比 `/storage/emulated/0/` 对比 `data/data/myApp',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23625104/

相关文章:

android - 如何使用MyLocationOverlay在MapView上绘制当前GPS位置?

javascript - 浏览器标签存储?

java - Android-在项目根目录中存储和加载文件

database - 使用HDF5进行深度学习的计算优势

java - 如何将具有运算符的字符串解析为整数?

android - Cordova - "config.xml"解析失败

Android运行时异常: Unable to instantiate activity componentInfo?

java - java.util.zip.ZipException:重复的条目?

ubuntu - 如何通过安装在 Ubuntu 上的 block 设备删除存储在 Ceph 中的文件?

Android 存储位置