2013-12-18 35 views
5

我想添加OBB文件的支持,我遇到了bizare的情况。当我拨打getExternalStorageDirectory()时,它会返回我的设备上不存在的路径。Android的getExternalStorageDirectory()返回无效的目录

我把这个在我的应用程序的启动:

Log.i(LOG_ID, "XXXXXXXXXXXXXXXX <--- "+Environment.getExternalStorageDirectory().getAbsolutePath()); 

它返回:

XXXXXXXXXXXXXXXX <--- /storage/emulated/0 

但是当我通过adb -d shell连接和运行ls -al /storage/emulated我得到:

lrwxrwxrwx root  root    2013-12-04 15:17 legacy -> /mnt/shell/emulated/0 

正如你所看到的,返回的路径getExternalStorageDirectory()在我的de上无效副。任何想法,为什么这将是我怎么能找到没有硬编码的OBB文件/mnt/sdcard/

编辑:

我刚刚运行一些进一步的测试:

Works - stat("/sdcard/Android/obb"); 
Fails - stat("/sdcard/Android/obb/uk.co.mycomp.myapp"); 

[email protected]:/mnt/shell $ ls -ald /sdcard/Android/obb/       
drwxrwxr-x root  sdcard_rw   2013-12-18 16:42 
[email protected]:/mnt/shell $ ls -ald /sdcard/Android/obb/uk.co.mycomp.myapp 
drwxrwxr-x root  sdcard_rw   2013-12-18 18:36 

正如你可以看到两个目录是相同的但我只能访问父。这可能与我的问题没有任何关系......

+0

您是否在您的清单中声明了所需的权限? –

+0

您是否真的尝试过使用代码来访问文件?或者你只是假设它不起作用 – dymmeh

+0

我认为我有正确的权限,但要清楚哪些应该找我? –

回答

7

在最近的Android版本中,对于不同的用户标识,这些挂载实际上是不同的,这会使您尝试调查此问题的方式失效。

由于最近的Android版本利用Linux内核的“Per-process namespaces”功能为不同的进程血统提供了不同的坐骑组,所以试图调查存储路径受挫。这可能与支持多个(人类)用户帐户的努力相关,同时具有唯一的和共享的外部存储子部分。

运行adb shell时,会得到一组从adbd继承的挂载。

但相比之下,代码由应用程序运行(或者在它的过程中,或子进程)得到一个不同组安装,显然无论是从合子遗传性或通过所述方法分化码把一个配置在此后不久的新近发芽zygote到您的应用程序的过程。

要了解您的应用可以看到什么样的安装,请安装connectbot这样的东西,您可以使用它来获取应用进程后来的本地shell,然后运行mount命令或任何其他感兴趣的调查。例如:

[email protected]:/ $ mount 

/dev/fuse /storage/emulated/0 fuse rw.... 
/dev/fuse /storage/emulated/legacy fuse rw..... 

相比较而言,从ADB介面检查:

[email protected]:/mnt $ mount 

/dev/fuse /mnt/shell/emulated fuse rw..... 

混淆,因为安装件是由过程的祖先确定,而不是它的用户标识,使用run-as工具从adb 不会让你一样作为应用程序进程或它的孩子,而是会给你adb的视图。

但是,如果您有正在运行的应用程序进程的pid,则可以使用run-as查看其文件/proc/pid##/mounts,而无需实际获取来自应用程序的shell。

+0

这完全解释发生了什么事,并安装了一个shell应用程序,我可以看到路径确实存在应用程序空间。不过,我上面关于访问OBB子目录的编辑仍然存在。这有什么关系? –

+1

原来是这个问题。 'adb -d push'看到与shell相同的挂载空间,与应用程序不一样。所以OBB推送上传到错误的位置。感谢您的帮助... –

+0

是的,我希望你会得到所有adb命令相同的坐骑。我没有意识到你正在试图模拟OBB。 –