[英]Android /storage/emulated/0 and /data/media/0 different permissions
[英]`/storage/emulated/legacy/` vs `/storage/emulated/0/` vs `data/data/myApp'
我想在我的应用程序中保存一个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'
从历史上看,内部和外部存储之间的差异如下......
内部: 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()
那么您将访问私有分配给您的应用程序的内部存储的根目录,并且只能访问您的应用程序(尽管如我所提到的,根电话可以访问私有/内部存储)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.