我有一台中兴的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;

}

【欢迎上码】

【微信公众号搜索 h2o2s2】

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

  1. android 获取sd卡目录失败_获取sd卡存储路径失败

    android新手,最近在学习 搜索sd卡上的所有txt文件并将其放入listview中显示,加载的过程中界面上会显示一个progress dialog.在之前的手机(Android5.0 andro ...

  2. android 获取sd卡目录失败_树莓派对SD卡的大小,速度有哪些要求?

    SD卡容量的大小 通过NOOBS安装带有桌面和推荐软件(完整)的 Raspberry Pi OS,SD卡最小为16GB. 对于带有桌面和推荐软件的 Raspberry Pi OS 镜像安装,SD卡最小 ...

  3. android 获取sd卡目录失败_Android正确获取SD卡目录及使用SD卡目录

    此文乃是转载,原文在这里链接 SD卡作为手机的扩展存储设备,在手机中充当硬盘角色,可以让我们手机存放更多的数据以及多媒体等大体积文件.因此查看SD卡的内存就跟我们查看硬盘的剩余空间一样,是我们经常操作 ...

  4. 安卓 linux找回内置存储,Android手机自带内部存储路径的获取

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

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

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

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

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

  7. android sd卡列目录文件_Android正确获取SD卡目录及使用SD卡目录

    此文乃是转载,原文在这里链接 SD卡作为手机的扩展存储设备,在手机中充当硬盘角色,可以让我们手机存放更多的数据以及多媒体等大体积文件.因此查看SD卡的内存就跟我们查看硬盘的剩余空间一样,是我们经常操作 ...

  8. android获取sd卡文件系统,HTML5 FileSystem API Android Chrome访问SD卡

    从this article on HTML5 Rocks开始: 重要的是要记住,此文件系统是沙盒式的,这意味着一个Web应用程序无法访问另一个应用程序的文件.这也意味着您无法将文件读/写到用户硬盘驱动 ...

  9. termux获取sd卡读写权限_原来是用错了读卡器,雷克沙lexar 1667X 真实读写性能测试...

    上一篇文章结合泥坑D3300套装老设备对雷克沙新版1667x 进行兼容性部分的测试,可以正常使用,而且在拍摄性能上有了很大的提升.当然雷克沙新版1667x 主要还是用来搭配SONY A6100来进行视 ...

最新文章

  1. Oracle查找重复数据
  2. 利用公众号 + WeRoBot开发一款AI应用
  3. zookeeper基本操作(常用命令)
  4. asp.net gridview 72般绝技
  5. POJ - 3179 Corral the Cows(离散化+二分+二维前缀和)
  6. multiple versions of scala libraries detected解决方案
  7. Android dumpsys命令详细使用
  8. php模板技术 实例
  9. MyEclipse 修改 默认的 工作空间(转)
  10. cad填充图案乱理石_「AutoCAD之填充」CAD图案填充的6个要点以及3个墙裂的建议...
  11. Windows 程序设计应用开发(上部)
  12. matlab计算定积分教程,Matlab计算定积分的操作内容讲解
  13. 科来网络分析系统11.1(技术交流免费版)
  14. Android Layout 布局属性全解
  15. STM32F103C8T6之SG90舵机控制
  16. python评分卡3_woe与IV分箱实现
  17. 基于微信公众平台API的菜谱小程序 的设计与实现
  18. 说一说关于破解支付宝AR红包的事
  19. word怎样让表格不跨页【实测成功】
  20. idea创建父子工程module_在IDEA中创建父工程和子模块module的方法步骤

热门文章

  1. 微信电脑版字体模糊(或文字太小)怎么调整
  2. 《python编程快速上手 让繁琐工作自动化》第一章习题答案
  3. https://mp.weixin.qq.com/s/ilO6DZwRpWdrruKm4J8CMw
  4. WordPress修改WordPress地址和站点地址之后无法打开网站和无法后台登录
  5. 朋友圈爆款背后的计算机视觉技术与应用
  6. matlab代码:计及碳捕集电厂低碳特性电力系统源-荷多时间尺度调度方法(电机工程学报)
  7. SQL多表查询:左外连接、右外连接、满外连接、UNION ALL
  8. 社工题writeup
  9. 计算机无法连接移动硬盘,win7电脑连接移动硬盘后没反应怎么解决?win7电脑连接移动硬盘后没反应解决方法...
  10. OPENCV针对图像EXIF旋转问题