遍历Android Marshmallow中的文件系统

时间:2016-01-11 22:56:49

标签: android filesystems

我的应用程序中有一个非常粗略但有效的文件系统浏览器,它直到最近才发现(我假设直到我,更糟糕的是,我的用户,更新到Marshmallow)。

它的基本工作非常简单:我让用户从SD卡(我从Environment.getExternalStorageDirectory()获得)开始,然后在浏览器中显示相关文件和所有目录,人为添加..目录用于向上导航树,除非当前目录不是/

正如我所说,它工作得很好,并且有很多非常理想的属性:

  1. 它允许非常全面地浏览 文件系统:用户可以访问几乎所有的东西,只有一些相当小的例外(比如一些系统目录和/data/data目录)
  2. 很容易从SD卡转到/文件系统,然后回到(可能是不同的)SD卡
  3. 它非常类似于已经习惯的用户(FileMangers,Finders,Midnight Commander,你给他们命名......)。
  4. 现在它不再起作用了,这不是运行时权限的问题(我确实检查过那个部分)。

    发生的情况如下:

    1. 在我的Nexus 5上,存储空间位于/storage/emulated/0
    2. 我可以很好地浏览存储子目录(我有权限),但我不能达到/storage/emulated ,因此我不能到达/文件系统
    3. 从'2'开始,我无法从一张SD卡转到另一张(!!!)
    4. /开始也没有帮助,因为/storage/emulated仍然无法从/storage列出(不是我原本期望的不同),因此我被隔离了根文件系统。

      问题1 :有没有办法可以从这个类似于Windows的C: / D: / E:公牛来恢复... Os开发人员误导人为地将我们降级,并取回(美丽的)POSIX文件系统,这是真正的Android的与生俱来的权利?

      问题2 :如果没有,是否至少有办法获取所有SD卡位置的列表,以便能够模拟以前的行为?

      谢谢!

1 个答案:

答案 0 :(得分:1)

  

我让用户从SD卡开始(我从Environment.getExternalStorageDirectory()获得)

External storage在大多数Android设备上都不是removable storage

  

然后我在浏览器中显示相关文件和所有目录,人工添加..目录以向上导航树,除非当前目录不是/已经。

不要求应用程序可以读取getExternalStorageDirectory()之类的方法返回的目录之上的目录。通常,正如POSIX文件系统的用户可以证明的那样,仅仅因为您有权访问目录并不意味着您可以访问父目录或对等目录。

  

我可以很好地导航存储子目录(我有权限),但是我无法进入/ storage / emulated,因此,我无法访问/ filesystem

这不是您的Nexus 5和Android 6.0所独有的。你会遇到这样的问题,因为你假设你对父目录有读访问权,而且这个假设并不普遍有效。例如,在Android 4.2+平板电脑和Android 5.0+手机上,辅助用户帐户对于Environment.getExternalStorageDirectory()等内容的路径将与您习惯使用的路径不同。

  

从'2'开始,我无法从一张SD卡转到另一张SD卡(!!!)

您在Android 4.4及更高版本上无权访问removable storage

  

问题1:有没有办法从这个类似C的窗口恢复:/ D:/ E:公牛......这些开发人员误导并人为地将我们降级,并取回(漂亮的)POSIX文件系统是真正的Android的与生俱来的权利吗?

您可以对设备进行root操作,然后安排以超级用户权限分叉进程,这些进程具有对文件系统所有方面的读访问权。

否则,与其他POSIX文件系统一样,您无权访问所有内容。

  

问题2:如果没有,是否至少有办法获得所有SD卡位置的列表,以便能够模拟以前的行为?

没有。首先,如前所述,由于POSIX文件系统权限,您之前的行为已经不可靠。其次,由于文件系统权限,您无法再次访问可移动存储。

欢迎您在getExternalFilesDirs()上调用Context(注意复数)等方法。如果设备具有可移动存储,则这些方法返回的第二个和后续File对象将指向可读取和写入的可移动存储上的位置。但是,您将无法访问可移动存储上的父目录或其他随机位置。