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)分配给您的应用程序并且只能由您的应用程序访问的内部存储的根目录(尽管,正如我提到的, Root手机可以访问私有(private)/内部存储)。

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

相关文章:

android - 关闭 Android CameraDevice 很慢并挂起应用程序

Android:在线测试推送通知(Google Cloud Messaging)

android - 如何检查我的项目中使用了哪个 Gradle Android 插件版本?

api - 不想在移动设备上存储 secret 的 Facebook/Twitter API key ,设计模式?

ios - 如何在 iOS 中检索存储信息

android - FFmpeg:如何使输出视频与输入视频具有相同的宽度、高度和 SAR

android - 将触摸传递给下的 View

php - 每周将 XML 文件保存到数据库

flutter - Flutter Android 11 (R) 如何申请允许管理所有文件权限

Azure 自定义扩展 Blob 返回 403 Forbidden