我有一台中兴的Android手机,型号是 ZTE U930HD,手机没有插入外置SD卡(也就是Micro SD Card,原名Trans-flash Card(TF卡),2004年正式更名为Micro SD Card),但是机身自带了一个内置存储卡(也就是eMMC存储,大小为2G)。

我把这个手机用数据线插到电脑上,也会看到盘符,通过安装「R.E 管理器」等文件管理应用,也可以管理文件,并且能看到该存储的挂载目录是:/mnt/sdcard2

但是,

我打印 Environment.getExternalStorageState(),却返回 ”removed“;

这是怎么回事?明明手机本身带着内置SD卡,却为何提示这么一个信息?

我又试着去打印了Environment.getExternalStorageDirectory(),返回:“/mnt/sdcard”

看起来可以解释了,在我这个中兴手机上,调用Environment.getExternalStorageDirectory(),返回的存储目录并不是系统内置的SD卡目录。

我又换了一个 Sony L39u,一个 MOTO G,调用Environment.getExternalStorageDirectory()返回的目录就是系统内置的SD卡目录。

不同的设备上,调用getExternalStorageDirectory()返回值却不一样。查询了Android的文档,才找到原因,原来这个方法返回的是当前设备厂商所认为的“外部存储”,有可能返回外置的SD卡目录(Micro SD Card),也可能返回内置的存储目(eMMC)。

总结一下:

一部分手机将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“,在索尼、MOTO G上就返回:“mounted”

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

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

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

"system/etc/vold.fstab” 只是一个简单的配置文件,它描述了Android的挂载点信息。

我们可以遍历这个文件来获取所有的挂载点:

/**

* 遍历 "system/etc/vold.fstab” 文件,获取全部的Android的挂载点信息

*

* @return

*/

private static ArrayList getDevMountList() {

String[] toSearch = FileUtils.readFile("/etc/vold.fstab").split(" ");

ArrayList out = new ArrayList();

for (int i = 0; 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存储目录了。

判断逻辑:

/**

* 获取扩展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 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;

}

安卓 linux找回内置存储,Android手机自带内部存储路径的获取相关推荐

  1. android 获取sd卡目录失败_解决Android手机自带内部存储路径存在但是却获取不到内容的问题...

    我有一台中兴的Android手机,型号是 ZTE U930HD,手机没有插入外置SD卡(也就是Micro SD Card,原名Trans-flash Card(TF卡),2004年正式更名为Micro ...

  2. 安卓 linux找回内置存储,安卓手机坏了拆eMCP/EMMC闪存恢复数据教程

    如果一个手机彻底坏了,开不了机,比如摔坏的,完全无法正常维修了,那么如果手机里有重要的数据要怎么恢复呢?下面就给大家一个思路,但需要有专业的焊接的设备才可以,但一般是可以恢复完整的数据的. 首先手机可 ...

  3. [转]重新分配内置存储空间 android手机

    本文转自:http://www.in189.com/thread-815721-1-1.html 鉴于有些同学遇到问题了,毕竟步骤繁琐,可能中间会出错,因此推荐用26L zxf66272819 给出的 ...

  4. 华为手机文件在内部存储路径_Android手机自带内部存储路径的获取

    我有一台中兴的Android手机,型号是 ZTE U930HD,手机没有插入外置SD卡(也就是Micro SD Card,原名Trans-flash Card(TF卡),2004年正式更名为Micro ...

  5. Android获取手机中外置内存卡、内置内存卡、手机内存路径

    http://www.open-open.com/code/view/1433585940578 首先内部存储路径为/data/data/youPackageName/,下面讲解的各路径都是基于你自己 ...

  6. 安卓下微信内置浏览器视频出现解析错误

    原文地址 今天给客户做一个微信端的HTML5的动画页面,页面内有一个视频文件,今天上线,这是前提.刚上线不久,客户的服务器便不堪重负,为了解决问题,我们将该页面的媒体文件放在自己的服务器上.问题来了, ...

  7. 安卓系统与内置Chrome浏览器

    安卓系统与内置Chrome浏览器对应的版本关系:https://blog.csdn.net/qq_33089275/article/details/98956465 安卓系统与内置Chrome浏览器对 ...

  8. linux awk 内置函数详细介绍(实例)

    原文地址为: linux awk 内置函数详细介绍(实例) 这节详细介绍awk内置函数,主要分以下3种类似:算数函数.字符串函数.其它一般函数.时间函数 一.算术函数: 以下算术函数执行与 C 语言中 ...

  9. 安卓版微信内置浏览器,a href=tel:电话号码/a 这个链接失效,跳到拨号界面

    转自:http://segmentfault.com/q/1010000000318831 安卓版微信内置浏览器,<a href="tel:电话号码"></a&g ...

最新文章

  1. 自学python入门-学python入门看什么书
  2. ai如何做倒角和圆角_石材路沿石是如何倒角的?倒角费用是多少?路沿石质量标准?...
  3. java跳转_java servlet 几种页面跳转的方法
  4. JQuery Datatables editor进行增删改查操作(二)
  5. mysql 视图 mybatis_Mybatis调用视图和存储过程的方法
  6. 微软物联网服务器,靠近物联网 微软发布定制 Linux内核
  7. js 控制滚动条位置
  8. 科学实证与理论研究方法
  9. 电驴服务器更新的作用,怎样更新eMule(电驴)服务器列表,有什么好处?
  10. 个人力扣刷题笔记 LCP 03. 机器人大冒险
  11. 解决Microsoft Edge与Chrome地址栏使用必应搜索bing.com很慢的问题
  12. 稳压器功能一览[转]
  13. PHP+ajaxfileupload 实现用户头像上传
  14. 讯飞语音——离线命令词识别
  15. Springboot + Shiro——MD5 盐值加密(配置)
  16. PowerBI-时间智能函数-DATEADD
  17. JS格式化数字(每三位加逗号)
  18. 大学计算机基础教育改革,谈计算机等级考试引导大学计算机基础教育改革.pdf...
  19. qt获取本机IP地址、计算机名、网络连接名、MAC地址、子网掩码、广播地址
  20. 年终奖发放前离职的员工是否有权获得年终奖

热门文章

  1. 襄阳社区招聘计算机考什么时候,襄阳招聘网格员什么时候报名?
  2. Win11系统如何设置任务栏新消息提醒
  3. 笔记本 win11 64位专业版iso文件v2021.07
  4. win7进入主板bios设置的方法
  5. java用XSSFWorkbook实现读写Excel
  6. 关于vue-cli3中配置请求跨域的问题
  7. Java 序列化总结.md
  8. JVM 学习三:类加载器
  9. 关键词热度分析工具_谷歌SEO推广排名的关键要素(一)利用谷歌关键词分析工具分析关键词...
  10. bios设置 联想m8000t_怎么进bios设置硬盘启动顺序