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

Ela*_*nda 16 storage android

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

Squ*_*onk 28

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

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

外部:在许多情况下,SD卡没有安全限制,即所有应用程序都可以访问"外部"存储的所有区域.

随着Android的新版本的出现以及新设备内部闪存越来越多,内部和外部之间的差异正在变得模糊.例如,我的Nexus 7没有SD卡插槽.

对于没有真正外部存储的设备,Android仍然需要提供模拟的外部存储,以便与旧版应用保持兼容.换句话说,RAM在物理上是内部的(不可移动的),但是它的一部分被分区,并且Android文件系统API将该分区视为"外部"并且是世界可读的.

至于你看到的外部存储路径,如...

/storage/emulated/0/myApp/file1.tmp
/storage/emulated/legacy/myApp/file1.tmp
Run Code Online (Sandbox Code Playgroud)

...这些中的一个或另一个(可能两者)是到模拟外部目录和文件的相同部分的重定向或"虚拟"路径.

这就是为什么必须始终使用正确的API调用来访问文件和目录而不是假设硬编码路径,因为它可能因设备而异.

如果您使用Environment.getExternalStorageDirectory(),您可以确信任何其他同样的应用程序都可以访问您在那里创建的任何文件.

如果您使用,getFilesDir()那么您将访问私有分配给您的应用程序的内部存储的根目录,并且只能访问您的应用程序(尽管如我所提到的,根电话可以访问私人/内部存储).

  • 还有一点需要注意:从KitKat开始(4.4)Android不允许下载的应用程序写入SD卡上的任意路径.他们只能写入`/ Android/data/*appname*/files`,如果该目录存在(如果没有,app将无法创建它).系统应用程序仍可照常访问SD卡.参考:[\*1\*](https://metactrl.com/docs/sdcard-on-kitkat/),[2](http://www.androidcentral.com/kitkat-sdcard-changes),[ 3](http://forum.xda-developers.com/xposed/modules/app-handleexternalstorage-t2693521) (5认同)