- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我正在尝试添加 OBB 文件支持,但遇到了一个奇怪的情况。当我调用 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()
在我的设备上无效。知道为什么会这样,以及如何在不对 /mnt/sdcard/
进行硬编码的情况下找到 OBB 文件?
编辑:
我刚刚进行了一些进一步的测试:
Works - stat( "/sdcard/Android/obb" );
Fails - stat( "/sdcard/Android/obb/uk.co.mycomp.myapp" );
shell@android:/mnt/shell $ ls -ald /sdcard/Android/obb/
drwxrwxr-x root sdcard_rw 2013-12-18 16:42
shell@android:/mnt/shell $ ls -ald /sdcard/Android/obb/uk.co.mycomp.myapp
drwxrwxr-x root sdcard_rw 2013-12-18 18:36
如您所见,这两个目录是相同的,但我只能访问父目录。这可能与我的问题无关...
最佳答案
在最近的 Android 版本中,对于不同的用户 ID,挂载实际上是不同的,这使您尝试调查此问题的方式无效。
您调查存储路径的尝试因最近的 Android 版本利用 Linux 内核的“每进程命名空间”功能为不同的进程祖先提供不同的装载集而受挫。这可能与支持多个(人类)用户帐户的努力有关,包括外部存储的独特和共享子部分。
当您运行 adb shell 时,您会获得一组从 adbd 继承的挂载。
但相比之下,应用程序运行的代码(无论是在它的进程中还是在子进程中)得到一组不同的挂载,显然是从 zygote 继承的,或者是随后通过进程差异化配置的将新萌芽的受精卵转变为您的应用进程的代码。
要了解您的应用看到的挂载情况,请安装类似 connectbot
的东西,您可以使用它来获取从应用程序进程派生的本地 shell,然后运行 mount 命令或任何其他调查出于兴趣。例如:
u0_a99@build:/ $ mount
/dev/fuse /storage/emulated/0 fuse rw....
/dev/fuse /storage/emulated/legacy fuse rw.....
相比之下,从 adb shell 检查:
shell@build:/mnt $ mount
/dev/fuse /mnt/shell/emulated fuse rw.....
令人困惑,因为挂载是由进程的祖先而不是用户 id 决定的,使用 run-as
来自 adb 的工具不会为您提供与应用程序进程或其子进程相同的 View ,而是为您提供 adb 的 View 。
但是,如果您有正在运行的应用进程的 pid,则可以使用 run-as 查看它的 /proc/pid##/mounts
文件,而不必实际获取 shell源自应用程序。
关于Android getExternalStorageDirectory() 返回无效目录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20663220/
假设我有一个类似记事本的应用程序,您可以在其中创建和保存文本文档。 我希望我的用户能够访问这些文件(例如,以便他们可以将它们复制到计算机上)。 在 API 29 之前,getExternalStora
我目前使用 Environment.getExternalStorageDirectory() 获取一个位置,我可以在其中临时存储一些数据,然后在使用后将其删除。此数据的范围为 1-100MB。 这工
我正在尝试添加 OBB 文件支持,但遇到了一个奇怪的情况。当我调用 getExternalStorageDirectory() 时,它返回的路径在我的设备上不存在。 我在我的应用开始时调用它: Log
使用一些非常简单的 android 代码,我试图根据以下逻辑访问文件夹: public void try_to_navigate_local_dir(){ Environment e = ne
我试图通过 Environment.getExternalStorageDirectory() 从 SD 卡获取所有文件列表,但我从硬件存储中获取了返回列表。我试过硬编码,但结果是一样的。知道是什么原
在 SDK 29 (Aka Android_Q) 中,使用 Environment.getExternalStorageDirectory() 方法访问外部存储已弃用,不再返回可访问的文件。 getE
我正在编写一个 Android 应用程序,它可以拍摄一些照片,并希望将它们全部保存在与我的应用程序关联的唯一目录中。 此目录应该可以从标准图库访问,以便用户稍后(当应用程序不一定运行时)检查拍摄的图片
我正在尝试在手机的外部存储(SD 卡)中创建文件。 文件 F = new File(Environment.getExternalStorageDirectory() + File.separator
我有下一种情况:Android 4.1,设备没有外部 SD 卡。以下代码: File dir = new File( Environment.getExternalStorageDirectory()
我再次需要你的帮助。我有简单照片应用程序的代码,但此代码将编辑后的图像保存在 SD 卡上,但我想更改此代码以将图像保存在手机的内存中。 private File captureImage() {
我对 getExternalStorageDirectory () 和 getExternalStorageState () 之间的区别有点困惑。 对于 getExternalStorageState
当我使用 Environment.getExternalStorageDirectory(); 打印 SD 存储路径时,它返回 storage/emulated/0但是当我使用 DDMS 浏览 SD
所以,基本上我有这段代码(所有功劳都归功于 mburhman 的文件资源管理器 - https://github.com/mburman/Android-File-Explore): private
我是 android 编程的新手。 我正在尝试使用 getExternalStorageDirectory() 获取我的 Nexus 设备上文件的路径但它根本不返回任何文件 代码: File path
我想在我的应用程序中读取图像并将图像写入外部存储。根据我的阅读,以下是获取目录句柄的正确方法。 File externalStorageDir = Environment.getExternalSt
从 API 级别 8 开始,Android 似乎重新定义了“外部”存储是什么。通读http://developer.android.com/reference/android/os/Environme
如何使用 Environment.getExternalStorageDirectory() 从 SD 卡读取存储的图像,或者有更好的方法吗? 最佳答案 Environment.getExternal
这个问题在这里已经有了答案: getExternalStoragePublicDirectory deprecated in Android Q (7 个答案) 关闭 2 年前。 在 android
我正在尝试模拟函数 getExternalStorageDirectory,但总是返回错误: “UnsupportedError(不支持的操作:功能仅在 Android 上可用)” 我正在使用 set
我正在尝试获取 Android 设备的内部存储路径。 由于大多数设备延迟关闭使用 Environment.getExternalStorageDirectory().getPath(); 返回内部存储
我是一名优秀的程序员,十分优秀!