Environment.getExternalStorageDirectory()是Android 2.x时代的产物,那时Android主流设备只有很小的内置存储器,然后都会外置一张sd卡,那时这个方法返回的就是外置sd卡的根路径。

但随着Android进入4.x时代,大部分Android设备都已经内置一个较大存储卡,甚至不提供外置存储卡插槽了,此时Environment.getExternalStorageDirectory()返回的路径其实是由内置存储卡虚拟出来的一个目录,用户在这一目录下有全部权限。
按理说Android应该继续提供其他的方法来返回其他的外置存储卡的路径,但这一次Android却没有,因为Android系统开发者们发现之前直接允许程序任意访问sd卡的做法导致sd卡上垃圾文件的不可管理性,尤其在程序被卸载后,由于不知道那些文件是由这一程序创建的,所以无法关联删除,因此Android 4.0并不给程序开发者提供外置存储卡的路径,而是提供了诸如getExternalFilesDirs()和getExternalCacheDirs()这样的方法,直接给开发者提供一个限制内的存储文件的空间,这个空间是与程序关联的,因此在卸载程序时这两个目录下的文件也会被关联删除。

闲话到此,主要是为了说明Android 4.0之后,系统不希望开发者直接访问sd卡,所以也没有提供查询多sd卡路径的方法(在2.x和3.x时代末期我们都以为4.0会提供这样的查询接口)。

但是,Android系统不提供并不意味着就没有办法了,Android说到底还是Linux系统,因此外置sd卡必然是按照Linux的挂载方式挂载到系统中的。因此目前比较主流的方法就是绕过Android直接去读取Linux底层的挂载文件来找到系统中挂载的外置存储器。

// 读取mount节点public static List<String> getAllStorageLocationsList() {    List<String> mMounts = new ArrayList<String>();    try {        File mountFile = new File("/proc/mounts");        if (mountFile.exists()) {            Scanner scanner = new Scanner(mountFile);            while (scanner.hasNext()) {                String line = scanner.nextLine();                if (line.startsWith("/dev/block/vold/")) {                    String[] lineElements = line.split(" ");                    String element = lineElements[1];                    mMounts.add(element);                }            }        }    } catch (Exception e) {        e.printStackTrace();    }    return mMounts;}

更多相关文章

  1. android uiautomator自己主动化測试
  2. android media库中external的读取
  3. use '@foo' to launch a virtual device named 'foo'
  4. ClassLoader解析——Android篇
  5. Mono For Android(安卓)中重要的命名空间
  6. android环境搭建及改变默认avd路径
  7. Android4开发入门经典 之 第一部分:Android入门基础
  8. Android(安卓)使用 OpenCV (JNI 实现)
  9. Mac下配置Android(安卓)NDK环境并搭建Cocos2d-x环境并Eclipse正

随机推荐

  1. Dart语言和Android:访问手机的相机
  2. 如何使用Array.filter而不是传统的循环-O
  3. 如何在javascript函数中将URL编码为参数?
  4. 如何使用Angular.js从json文件中使用id获
  5. 在批处理文件中使用JSMin
  6. 前端笔记之JavaScript(十)深入JavaScript节
  7. Dojo:不能在AccordionContainer.js中读取
  8. 可以访问Stackoverflow的自动建议标记系
  9. JQuery系列(7) - JQuery最佳实践
  10. 在HTML上绘制画布并在屏幕大小上保留Aspe