草庐IT

Android getExternalStorageDirectory() 返回无效目录

coder 2023-12-11 原文

我正在尝试添加 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/

有关Android getExternalStorageDirectory() 返回无效目录的更多相关文章

  1. ruby - 为什么 4.1%2 使用 Ruby 返回 0.0999999999999996?但是 4.2%2==0.2 - 2

    为什么4.1%2返回0.0999999999999996?但是4.2%2==0.2。 最佳答案 参见此处:WhatEveryProgrammerShouldKnowAboutFloating-PointArithmetic实数是无限的。计算机使用的位数有限(今天是32位、64位)。因此计算机进行的浮点运算不能代表所有的实数。0.1是这些数字之一。请注意,这不是与Ruby相关的问题,而是与所有编程语言相关的问题,因为它来自计算机表示实数的方式。 关于ruby-为什么4.1%2使用Ruby返

  2. ruby-on-rails - active_admin 目录中的常量警告重新声明 - 2

    我正在使用active_admin,我在Rails3应用程序的应用程序中有一个目录管理,其中包含模型和页面的声明。时不时地我也有一个类,当那个类有一个常量时,就像这样:classFooBAR="bar"end然后,我在每个必须在我的Rails应用程序中重新加载一些代码的请求中收到此警告:/Users/pupeno/helloworld/app/admin/billing.rb:12:warning:alreadyinitializedconstantBAR知道发生了什么以及如何避免这些警告吗? 最佳答案 在纯Ruby中:classA

  3. ruby - 检查字符串是否包含散列中的任何键并返回它包含的键的值 - 2

    我有一个包含多个键的散列和一个字符串,该字符串不包含散列中的任何键或包含一个键。h={"k1"=>"v1","k2"=>"v2","k3"=>"v3"}s="thisisanexamplestringthatmightoccurwithakeysomewhereinthestringk1(withspecialcharacterslike(^&*$#@!^&&*))"检查s是否包含h中的任何键的最佳方法是什么,如果包含,则返回它包含的键的值?例如,对于上面的h和s的例子,输出应该是v1。编辑:只有字符串是用户定义的。哈希将始终相同。 最佳答案

  4. ruby-on-rails - Rails 5 Active Record 记录无效错误 - 2

    我有两个Rails模型,即Invoice和Invoice_details。一个Invoice_details属于Invoice,一个Invoice有多个Invoice_details。我无法使用accepts_nested_attributes_forinInvoice通过Invoice模型保存Invoice_details。我收到以下错误:(0.2ms)BEGIN(0.2ms)ROLLBACKCompleted422UnprocessableEntityin25ms(ActiveRecord:4.0ms)ActiveRecord::RecordInvalid(Validationfa

  5. ruby - Ruby 中的隐式返回值是怎么回事? - 2

    所以我开始关注ruby​​,很多东西看起来不错,但我对隐式return语句很反感。我理解默认情况下让所有内容返回self或nil但不是语句的最后一个值。对我来说,它看起来非常脆弱(尤其是)如果你正在使用一个不打算返回某些东西的方法(尤其是一个改变状态/破坏性方法的函数!),其他人可能最终依赖于一个返回对方法的目的并不重要,并且有很大的改变机会。隐式返回有什么意义?有没有办法让事情变得更简单?总是有返回以防止隐含返回被认为是好的做法吗?我是不是太担心这个了?附言当人们想要从方法中返回特定的东西时,他们是否经常使用隐式返回,这不是让你组中的其他人更容易破坏彼此的代码吗?当然,记录一切并给出

  6. ruby-on-rails - ruby 日期方程不返回预期的真值 - 2

    为什么以下不同?Time.now.end_of_day==Time.now.end_of_day-0.days#falseTime.now.end_of_day.to_s==Time.now.end_of_day-0.days.to_s#true 最佳答案 因为纳秒数不同:ruby-1.9.2-p180:014>(Time.now.end_of_day-0.days).nsec=>999999000ruby-1.9.2-p180:015>Time.now.end_of_day.nsec=>999999998

  7. ruby - 从 String#split 返回的零长度字符串 - 2

    在Ruby1.9.3(可能还有更早的版本,不确定)中,我试图弄清楚为什么Ruby的String#split方法会给我某些结果。我得到的结果似乎与我的预期相反。这是一个例子:"abcabc".split("b")#=>["a","ca","c"]"abcabc".split("a")#=>["","bc","bc"]"abcabc".split("c")#=>["ab","ab"]在这里,第一个示例返回的正是我所期望的。但在第二个示例中,我很困惑为什么#split返回零长度字符串作为返回数组的第一个值。这是什么原因呢?这是我所期望的:"abcabc".split("a")#=>["bc"

  8. ruby-on-rails - 如何在 Gem 中获取 Rails 应用程序的根目录 - 2

    是否可以在应用程序中包含的gem代码中知道应用程序的Rails文件系统根目录?这是gem来源的示例:moduleMyGemdefself.included(base)putsRails.root#returnnilendendActionController::Base.send:include,MyGem谢谢,抱歉我的英语不好 最佳答案 我发现解决类似问题的解决方案是使用railtie初始化程序包含我的模块。所以,在你的/lib/mygem/railtie.rbmoduleMyGemclassRailtie使用此代码,您的模块将在

  9. ruby - 为什么 Integer.respond_to?( :even? ) 返回 false? - 2

    我一直在研究RubyKoans,我发现about_open_classes.rbkoan很有趣。特别是他们修改Integer#even?方法的最后一个测试。我想尝试一下这个概念,所以我打开了Irb并尝试运行Integer.respond_to?(:even?),但令我惊讶的是我得到了错误。然后我尝试了Fixnum.respond_to?(:even?)并得到了错误。我还尝试了Integer.respond_to?(:respond_to?)并得到了true,当我执行2.even?时,我也得到了true。我不知道发生了什么。谁能告诉我缺少什么? 最佳答案

  10. ruby-on-rails - 没有这样的文件或目录 - 用 Mini Magick 识别 - 2

    在我让另一个人重做我的前端UI之前,我的Rails应用程序运行平稳。我已经尝试解决此错误3天了。这是错误:Nosuchfileordirectory-identifyExtractedsource(aroundline#59):575859606162@post=Post.find(params[:id])authorize@postif@post.update_attributes(post_params)flash[:notice]="Postwasupdated."redirect_to[@topic,@post]else{"utf8"=>"✓","_method"=>"patc

随机推荐