一部分手机将eMMC存储挂载到 /mnt/external_sd 、/mnt/sdcard2 等节点,而将外置的SD卡挂载到 Environment.getExternalStorageDirectory()这个结点。
此时,调用Environment.getExternalStorageDirectory(),则返回外置的SD的路径。

而另一部分手机直接将eMMC存储挂载在Environment.getExternalStorageDirectory()这个节点,而将真正的外置SD卡挂载到/mnt/external_sd、/mnt/sdcard2 等节点。
此时,调用Environment.getExternalStorageDirectory(),则返回内置的SD的路径。

至此就能解释为都是无外置SD卡的情况下,有的手机调用

打印 Environment.getExternalStorageState(),却返回 ”removed“,在其他手机就有可能返回:“mounted”

原因已经知道了,可是如何在无外置SD卡的时候,获取到这个内置eMMC存储的具体路径呢?

既然使用 Environment.getExternalStorageDirectory() 获取到的是外置SD卡路径,但是我又没有插入SD卡,这个时候我想使用内置的eMMC存储来存储一些程序中用到的数据,我怎么去获取这个eMMC存储的路径呢?

答案是:通过扫描系统文件"system/etc/vold.fstab”来实现。

"system/etc/vold.fstab” 只是一个简单的配置文件,它描述了Android的挂载点信息。
我们可以遍历这个文件来获取所有的挂载点:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
     /**
      * 遍历 "system/etc/vold.fstab” 文件,获取全部的Android的挂载点信息
     
      * @return
      */
     private  static  ArrayList<String> getDevMountList() {
         String[] toSearch = FileUtils.readFile( "/etc/vold.fstab" ).split( " " );
         ArrayList<String> out =  new  ArrayList<String>();
         for  ( int  i =  0 ; i < toSearch.length; i++) {
             if  (toSearch[i].contains( "dev_mount" )) {
                 if  ( new  File(toSearch[i +  2 ]).exists()) {
                     out.add(toSearch[i +  2 ]);
                 }
             }
         }
         return  out;
     }

之后,当 Environment.getExternalStorageState()返回“removed”的时候(即,当没有挂载外置SD卡的时候),通过getDevMountList()方法获取一个list,这个list中可以进行写操作的那个就是系统自带的eMMC存储目录了。

判断逻辑:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
     /**
      * 获取扩展SD卡存储目录
     
      * 如果有外接的SD卡,并且已挂载,则返回这个外置SD卡目录
      * 否则:返回内置SD卡目录
     
      * @return
      */
     public  static  String getExternalSdCardPath() {
         if  (SDCardUtils.isMounted()) {
             File sdCardFile =  new  File(Environment.getExternalStorageDirectory().getAbsolutePath());
             return  sdCardFile.getAbsolutePath();
         }
         String path =  null ;
         File sdCardFile =  null ;
         ArrayList<String> devMountList = getDevMountList();
         for  (String devMount : devMountList) {
             File file =  new  File(devMount);
             if  (file.isDirectory() && file.canWrite()) {
                 path = file.getAbsolutePath();
                 String timeStamp =  new  SimpleDateFormat( "ddMMyyyy_HHmmss" ).format( new  Date());
                 File testWritable =  new  File(path,  "test_"  + timeStamp);
                 if  (testWritable.mkdirs()) {
                     testWritable.delete();
                 else  {
                     path =  null ;
                 }
             }
         }
         if  (path !=  null ) {
             sdCardFile =  new  File(path);
             return  sdCardFile.getAbsolutePath();
         }
         return  null ;
     }

android 手机获取外置SD卡路径相关推荐

  1. android 获取默认存储路径,Android获取外置SD卡存储路径的方法

    在开发应用的过程中,经常会遇到需要获取设备存储路径的问题.而从网上看到的很多方法获取到的都是内置存储位置,并非外置SD卡路径,因此我推荐使用反射的机制来获取外置存储的路径. 通常,使用Environm ...

  2. android 获取sd卡目录失败_Android获取外置SD卡存储路径的方法

    在开发应用的过程中,经常会遇到需要获取设备存储路径的问题.而从网上看到的很多方法获取到的都是内置存储位置,并非外置SD卡路径,因此我推荐使用反射的机制来获取外置存储的路径. 通常,使用Environm ...

  3. Android 获取内外SD卡路径几种方法总结

    今天做项目的时候发现获取存储的方式不一样,搞了一个上午,计算sd卡的容量.总结一下.以免后面走弯路 Android 获取SD卡路径: 外置sd卡路径,也许很多同学在平时的工作中并不会用到,因为现在很多 ...

  4. 安卓 7.0 无法获取外置SD卡问题解决方案 | Failed to find configured root that contains

    好久没更新了嘿嘿 最近懒 项目要收尾 一直懒懒的测试 看RXJava什么的 手机系统更新7.0 无意中发现调用相机报错Failed to find configured root that conta ...

  5. FileProvider无法获取外置SD卡问题解决方案 | Failed to find configured root that contains

    FileProvider无法获取外置SD卡问题解决方案 | Failed to find configured root that contains 随着Android版本越来越高,Android官方 ...

  6. Android判断有无外置SD卡(TF卡),并读写文件

    转载来源:https://blog.csdn.net/qq_27061049/article/details/94178875 1.相关方法说明: 2.Android Manifest.xml 添加权 ...

  7. 如何从 Android 手机上的 SD 卡恢复已删除的照片

    为了扩展手机的存储空间,很多人都会在安卓手机上插入一张SD卡来存储一些大文件,比如电影.照片.视频等.虽然SD卡给我们带来了很大的方便,但我们还是避免不了数据丢失一些事故造成的.您是否正在为 SD 卡 ...

  8. 三星android6.0sd卡,三星 android 手机内置sd卡空间不足,怎么处理?

    尊敬的三星用户您好: 手机需要优化内存或已经提示内存已满/内存不足,建议您: 1.长按home键,打开ram管理器,清理正在运行的应用程序,以释放程序内存. 2.卸载自行安装的应用程序. 3.清除手机 ...

  9. 关于android手机不能识别SD卡的解决

    出现的问题:SD卡可以使用读卡器读取,并且SD卡还可以使用手机的recovery中的usb功能使用电脑读取,而手机却不能读取SD卡, 原因:可能是对SD卡的某些操作改变了SD卡的某些参数 解决办法:首 ...

最新文章

  1. 解压ubi文件_制作ubi文件系统
  2. linux_OEL5.4_安装Oracle11g中文教程图解
  3. javaWeb学习总结(4)- HttpServletResponse
  4. js中JSON.stringify用于自定义的类
  5. 机器学习算法基础——数据降维
  6. 阿里云容器服务DaemonSet实践
  7. css-四种css导入方式
  8. 计算机报名成功后还可以取消吗,【造价工程师报名信息确认后可以取消吗?如何取消?】- 环球网校...
  9. Unity UGUI实现鼠标拖动图片
  10. JS自定义鼠标右键菜单
  11. Matlab TreeBagger随机森林回归实例
  12. 桌面计算机里没有桌面显示不出来怎么办,电脑桌面显示不出来图标 所有软件都可以正常工作 怎么解决?...
  13. 搜站 - 聚合搜索,一站访问
  14. 借鉴华为HiLink实现微信小程序智能配网功能
  15. 微信小程序开发(五)——数据绑定、运算、样式导入、页面跳转
  16. 基于Springboot的漫画网站设计与实现的源码+文档
  17. Java筑基28-泛型
  18. 嫁给玩股票男人的九大理由
  19. 读书笔记:CSS禅意花园-图像
  20. Java 使用Virtual Serial Port Driver及Modsim32进行modbus-rtu协议模拟(从机)并使用java当做主机(Maven项目)进行从机信息获取及修改

热门文章

  1. 读书笔记-刷新:重新发现商业与未来
  2. 20到50之间是3的倍数php,小学三年级奥数-第16讲-数字趣谈(教)
  3. OpenCV--041:Triangle二值寻找算法
  4. python 正数变成负数_干货 | 32个常用Python功能实现,菜鸟到高手的进阶之路!
  5. 什么是栈?栈的基本应用有哪些?
  6. Chrome更新时出现“无法启动更新检查(错误代码为4: 0x80070005-system level)”解决
  7. 左边是地狱右边也是地狱_地狱甚至还能做些什么(除了拿走我们的钱)
  8. IR的评价指标-MAP,MRR和NDCG的形象理解
  9. (详解)for each循环的里面参数的顺序问题
  10. js字符串拼接变量名及赋值