请教Android手机关于mount命令挂接android 获取外置sd卡卡的问题

获取 内外存储设备路径疑问 -
- ITeye技术网站
android 系统是开源的,于是各种产商各种瞎改android系统,工作了几个月,我发现单单就android的内外存储设备的路径我就不知道怎么获取了。上网查了几种方案,自己试验了下,感觉好迷茫啊。在这里记录下我试验的几种方案。
方案一:通过Enviroment类获取存储设备路径
android的官方文档上说,采用Enviroment.getExternalStorageDirectory()方法可以得到android设备的外置存储(即外插SDCARD),如果android设备有外插SDCARD的话就返回外插SDCARD的根目录路径,如果android设备没有外插SDCARD的话就返回android设备的内置SDCARD的路径。这套方案很快就被否决了,因为Enviroment类的这个方法里面的路径也是写死的,只有原生的android系统才使用这套方案,被更改过的anroid体统很多设备的路径都改了。
方案二:读取system/etc/vold.fstab文件的内容来获取存储设备路径
参考文档:
内置和外置SD卡的信息存在system/etc/vold.fstab 里面,我们可以从这里获得外置SD卡的路径。经本人实验,发现很多疑问。我的机子是三星I9300,我的机子没有外插SDCARD。通过eclipse获取vold.fstab文件,打开来看,有用的内容如下:
dev_mount sdcard /storage/extSdCard auto /devices/platform/s3c-sdhci.2/mmc_host/mmc1/
dev_mount sda /storage/UsbDriveA auto /devices/platform/s5p-ehci
dev_mount sdb /storage/UsbDriveB auto /devices/platform/s5p-ehci
dev_mount sdc /storage/UsbDriveC auto /devices/platform/s5p-ehci
dev_mount sdd /storage/UsbDriveD auto /devices/platform/s5p-ehci
dev_mount sde /storage/UsbDriveE auto /devices/platform/s5p-ehci
dev_mount sdf /storage/UsbDriveF auto /devices/platform/s5p-ehci
这里可没有我的内置SDCARD的路径啊,不懂。打开手机的文件系统发现我的内置的SDCARD路径是:/storage/emulated/0。于是我到eclipse的DDMS中去看下我的手机文件系统,发现storage路径下的文件结构为: 从这个文件结构可以看出,真正有内容的应该是emulated/legacy和sdcard0才对,再从后面的连接来看,最后这两个目录都应该是指向/mnt/shell/emulated/0。接着打开/mnt/shell/emulated/0来看看,果然是我的sdcard目录
这让我很疑惑,这样的话,读取vold.fstab文件来获取sdcard目录不就得不到/mnt/shell/emulated/0目录了么。方案二失败。
方案三:方案三的原理是linux命令,在命令窗口中输入 mount 或者 cat /proc/mounts 可得到系统挂载的存储。你也可以在DOS窗口中输入 adb shell -& mount ,或者 adb shell -& cat /proc/mounts 来查看( ”-&“ 符号只是一个分割符,不要输)。好,我来DOS窗口中输入adb shell -& mount 来看下会得到什么
这个我也看不懂,不过我猜最后一条应该是我的SDCARD的挂载了,因为有/mnt/shell/emulated 挂载路劲出现, 而/data/media是挂载的设备么?这是什么东西?好,我借部手机来看看,看其他的手机会mount出什么东西来。 那就借部note3来吧
我借来的这部手机有外插SDCARD。可以看到最后两条应该是挂载SDCARD信息了。不过它的挂载设备是/dev/fuse, 和 /dev/block/vold/179:17
。 好吧,我晕了,等等,会不会 最后两条信息才是挂载SDCARD信息呢?我的是手机因为没有外插SDCARD,所以最后一条才是挂载SDCARD信息,有外插SDCARD的,最后两条是挂载SDCARD信息。这是规律?好吧,不是规律,我又借了部手机,mount了下,发现这个猜想纯属扯淡。
利用mount命令来获取SDCARD路径的方法,
android常见的SD卡存储位置/storage/emulated/0//storage/extSdCard/mnt/external_sd//mnt/sdcard2//mnt/sdcard/external_sd//mnt/sdcard-ext//mnt/sdcard//storage/sdcard0//mnt/extSdCard//mnt/extsd//mnt/emmc//mnt/extern_sd//mnt/ext_sd//mnt/ext_card//mnt/_ExternalSD//sdcard2//sdcard//sdcard/sd//sdcard/external_sd//mnt/sd//mnt//storage//mnt/sdcard/sd//mnt/exsdcard//mnt/sdcard/extStorages/SdCard//ext_card//storage/extSdCard
3.0以上可以通过反射获取:
StorageManager sm = (StorageManager) context.getSystemService(Context.STORAGE_SERVICE);
String[] paths = (String[]) sm.getClass().getMethod("getVolumePaths", null).invoke(sm, null);
Android 4.1上
StorageManager sm = (StorageManager) context.getSystemService(Context.STORAGE_SERVICE);
String[] volumePaths = sm.getgetVolumePaths();
可以获得所有mount的SD卡,难道我要一条一条路径去遍历?就算遍历到了,我也不知道哪条是内置存储,哪条是外置存储。而且以后哪个深井冰产商又整出一条路径出来,不就没完没了了嘛。
我现在很郁闷,到底怎么弄才有一套最佳方案?跪求大神解救我。
* 获取外置SD卡路径
public static List&String& getSDCardPaths() {
List&String& sdcardPaths = new ArrayList&String&();
String cmd = "cat /proc/mounts";
Runtime run = Runtime.getRuntime();// 返回与当前 Java 应用程序相关的运行时对象
Process p = run.exec(cmd);// 启动另一个进程来执行命令
BufferedInputStream in = new BufferedInputStream(p.getInputStream());
BufferedReader inBr = new BufferedReader(new InputStreamReader(in));
String lineS
while ((lineStr = inBr.readLine()) != null) {
// 获得命令执行后在控制台的输出信息
LogUtil.i("CommonUtil:getSDCardPath", lineStr);
String[] temp = TextUtils.split(lineStr, " ");
// 得到的输出的第二个空格后面是路径
String result = temp[1];
File file = new File(result);
if (file.isDirectory() && file.canRead() && file.canWrite()) {
LogUtil.d("directory can read can write:",
file.getAbsolutePath());
// 可读可写的文件夹未必是sdcard,我的手机的sdcard下的Android/obb文件夹也可以得到
sdcardPaths.add(result);
// 检查命令是否执行失败。
if (p.waitFor() != 0 && p.exitValue() == 1) {
// p.exitValue()==0表示正常结束,1:非正常结束
LogUtil.e("CommonUtil:getSDCardPath", "命令执行失败!");
inBr.close();
in.close();
} catch (Exception e) {
LogUtil.e("CommonUtil:getSDCardPath", e.toString());
sdcardPaths.add(Environment.getExternalStorageDirectory()
.getAbsolutePath());
optimize(sdcardPaths);
for (Iterator iterator = sdcardPaths.iterator(); iterator.hasNext();) {
String string = (String) iterator.next();
Log.e("清除过后", string);
return sdcardP
private static void optimize(List&String& sdcaredPaths) {
if (sdcaredPaths.size() == 0) {
int index = 0;
while (true) {
if (index &= sdcaredPaths.size() - 1) {
String lastItem = sdcaredPaths.get(sdcaredPaths.size() - 1);
for (int i = sdcaredPaths.size() - 2; i &= 0; i--) {
if (sdcaredPaths.get(i).contains(lastItem)) {
sdcaredPaths.remove(i);
String containsItem = sdcaredPaths.get(index);
for (int i = index + 1; i & sdcaredPaths.size(); i++) {
if (sdcaredPaths.get(i).contains(containsItem)) {
sdcaredPaths.remove(i);
一定记得在manifest.xml中加权限
浏览: 190141 次
第六点我觉得同样的厂商生产的同款设备,很有可能是一样的,个人觉 ...
第二点说错了,wifi mac不管打不打开,都能拿到;蓝牙ma ...
看了jvm内存模型之后再看Java内存模型 一时转不过弯来
厉害。我没有看你最后发的注意事项,导致了很多用户找我,唉请教Android手机关于mount命令挂接外置sd卡的问题_linux吧_百度贴吧
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&签到排名:今日本吧第个签到,本吧因你更精彩,明天继续来努力!
本吧签到人数:0成为超级会员,使用一键签到本月漏签0次!成为超级会员,赠送8张补签卡连续签到:天&&累计签到:天超级会员单次开通12个月以上,赠送连续签到卡3张
关注:104,202贴子:
请教Android手机关于mount命令挂接外置sd卡的问题收藏
执行umount命令将sd卡解除挂接后,再执行挂载命令 mount /dev/block/mmcblk1p1 /mnt/extSdCard ,sd卡并没有被成功挂载,命令也没有输出出错信息,加 -t vfat ,-t auto,- o bind等也不行。但是将手机连接电脑,使用电脑进入手机文件系统,执行以上命令却可以成功挂载,证明这条命令和手机环境都是没错的。问题是我现在需要一个在手机上直接执行能够挂接sd卡的功能,有没有大神能够给出一个解决方案,多谢了!手机是 三星GT-i9300,已Root,系统版本Android 4.1.2并且也安装了busybox
sumount ...
话说可能错不在你,是su的问题。我之前有个安卓平板比你奇葩多了,挂载sd卡第二分区后只有用来挂载的软件可以看到,其它都看不到,而且root和普通用户执行mount反馈的结果居然也不一样。之后换个root工具重新root一遍就没问题了。
有人知道原因吗
非常感谢@小_埃和@s,两位过来回答我的问题,辛苦了!刚才躺床上翻来覆去睡不着,所以又爬起来,仔细研究,最终发现了电脑端执行mount完毕和手机端执行完毕后sd卡究竟有什么不同,在楼下贴出来,也方便后来人。
电脑端执行mount -t vfat
/mnt/extSdCard 后,使用 cat /proc/mounts 命令查看sd卡状态:/dev/block/mmcblk1p1 /storage/extSdCard vfat rw,relatime,fmask=0000,dmask=0000,allow_utime=0022,codepage=cp437,iocharset=iso8859-1,shortname=mixed,errors=remount-ro 0 0手机端执行mount -t vfat
/mnt/extSdCard 后,使用 cat /proc/mounts 命令查看sd卡状态:/dev/block/mmcblk1p1 /storage/extSdCard vfat rw,relatime,fmask=0077,dmask=0077,codepage=cp437,iocharset=iso8859-1,shortname=mixed,errors=remount-ro 0 不同处是前者 fmask=0000,dmask=0000,allow_utime=0022后者是fmask=0077,dmask=0077所以把命令手动改为mount -t vfat -o fmask=0000,dmask=0000,allow_utime=0022 /dev/block/mmcblk1p1 /mnt/extSdCard就能正常挂载sd卡了!
话说可能错不在你,是su的问题。我之前有个安卓平板比你奇葩多了,挂载sd卡第二分区后只有用来挂载的软件可以看到,其它都看不到,而且root和普通用户执行mount反馈的结果居然也不一样。之后换个root工具重新root一遍就没问题了。
登录百度帐号推荐应用
为兴趣而生,贴吧更懂你。或安卓版本:4.1.1
包大小:323MB
安卓版本:4.1.1
包大小:415MB
安卓版本:5.0
包大小:936MB
安卓版本:4.0.4
包大小:155.26MB
安卓版本:4.0.4
包大小:176.24MB
请输入验证码:
信壹网络旗下产品今日论坛第 1 个签到,每日签到可得财富值+2,连续5天签到后再连续签到则每日可得财富值
+4,记得每天都来签到哦~
上一主题:
下一主题:
查看: 19322 | 回复: 27
格式化内置SD(手机内存)为EXT3文件系统,让所有应用都可以访问外置SD卡。
UID 3189262
交易信用 0
积分/帖子:26
连续签到天数:0
全部签到天数:0
注册时间:
手机型号:
状态: 离线
格式化内置SD(手机内存)为EXT3文件系统,让所有应用都可以访问外置SD卡。
首先声明以下操作具有高度危险性(但不用担心手机会变砖),无非必要请勿轻易尝试!!!
我们都知道有很多软件都只任/sdcard和/mnt/sdcard目录,860的手机内存(即内置SD卡)就是挂载在/mnt/sdcard目录下,而外置sd卡者挂载到/mnt/sdcard-ext目录,导致很多软件都无法访问外置SD卡,如熊猫看书和很多导航软件。
其实解决办法是有的,就是把外置SD卡的所有目录和文件符号链接到/mnt/sdcard即可。
然而无论手机内存和外置SD卡都是格式化成FAT32文件系统的,FAT32是不支持符号链接的,那唯一办法就是把手机内存格式化成可以支持符号链接的文件系统,如EXT3了。
经过3个小时的努力和尝试,终于成功的把手机内存和外置SD卡都格式成EXT3文件系统,并自动把所有外置SD卡的文件都符号链接到手机内存了。
方法如下:
1. USB连上电脑并在手机上设置为USB大容量存储模式。
2. 在电脑上备份内部SD的所有内容。
3. 在手机上设置USB为&摩托罗拉手机门户&
4. 用 adb shell 进入 shell
5. 用 su 切换刀root用户
6. 用 mount -o remount,rw -t ext3 /dev/block/mmcblk0p12 /system 重新挂载system分区为读写模式,(也可以用root exploer来做)
7. 用 busybox vi /sysetm/etc/vold.fstab 修改文件,目的是暂时禁止内置sdcard自动mount,找到下面内容:
# internal eMMC
dev_mount sdcard /mnt/sdcard 18 /devices/platform/tegra-sdhci.3/mmc_host/mmc0
# internal eMMC
#dev_mount sdcard /mnt/sdcard 18 /devices/platform/tegra-sdhci.3/mmc_host/mmc0
8. 用 mount 命令查看所有文件系统挂载情况,搜索/mnt/sdcard,找到内置sdard的设备文件(如我的是/dev/block/vold/179:18,实际是/dev/block/mmcblk0p18的符号链接),并记下来,这步非常重要,否则后面格式错了分区就麻烦大了。
9. 用 busybox reboot重启手机。
10. 重启后你会发现手机内存已经无法访问了,重复第4,5,6步。
11. 用 mke2fs -t ext3 -L mot /dev/block/vold/179:18 (或用 mke2fs -t ext3 -L mot /dev/block/mmcblk0p18)格式化内部sdcard为ext3文件系统。
12. 用 vi /system/bin/mount_sdc_ext3.sh,内容如下:
#!/system/bin/sh& && && && && && && && && && && && && && && && && && && && && && && && && &&&
export PATH=/system/bin:$PATH& && && && && && && && && && && && && && && && && && && && && &
device=$1& && && && && && && && && && && && && && && && && && && && && && && && && && && && &
mount=$2& && && && && && && && && && && && && && && && && && && && && && && && && && && && &
mount -t ext3 $device $mount& && && && && && && && && && && && && && && && && && && && && &&&
13. 用 vi /system/bin/check_sdc.sh,内容如下:
#!/system/bin/sh& && && && && && && && && && && && && && && && && && && && && && && && && &&&
export PATH=/system/bin:$PATH& && && && && && && && && && && && && && && && && && && && && &
mount_sdc_ext3.sh /dev/block/mmcblk0p18 /mnt/sdcard
mount -t vfat /dev/block/mmcblk1p1 /mnt/sdcard-ext
ln -s /mnt/sdcard-ext/* /mnt/sdcard/
14. 用 busybox vi /sysetm/etc/vold.fstab,改回原来的值,即
dev_mount sdcard /mnt/sdcard 18 /devices/platform/tegra-sdhci.3/mmc_host/mmc0
15. 用 mount -t ext3 /dev/block/mmcblk0p1 /mnt/sdcard 重新挂载内部SD。
16. 重启手机,你会看到外置SD的所有内容都出现在内置SD上了设置USB为大容量存储模式。
17. 把备份的卡内容重新拷贝到内置存储上。
[ 本帖最后由 lotuspine 于
16:20 编辑 ]
评分次数:1 次 &财富值: +10 &&&&
财富值 336
交易信用 0
积分/帖子:473
连续签到天数:1
全部签到天数:2
注册时间:
手机型号:
状态: 离线
支持技术贴!
UID 3181826
交易信用 0
积分/帖子:90
连续签到天数:1
全部签到天数:1
注册时间:
手机型号:
状态: 离线
Mark 下,顶起来
UID 2029144
财富值 629
交易信用 0
积分/帖子:509
连续签到天数:0
全部签到天数:0
注册时间:
手机型号:
ME860 国行
来自:湖南
状态: 离线
技术帖子,但是我不会想去折腾了。软件太多了
财富值 375
交易信用 0
积分/帖子:385
连续签到天数:1
全部签到天数:3
注册时间:
手机型号:
状态: 离线
这样一来,u盘模式下,win就不认识sd卡了。有ext3 for win的软件么?
交易信用 0
积分/帖子:2
连续签到天数:0
全部签到天数:0
注册时间:
手机型号:
状态: 离线
绝对支持技术贴 先留着 有时间的时候再好好折腾一下 因为发现步骤好像有点繁琐哦
财富值 5444
交易信用 0
俺是一只嫩嫩的老鸟~
积分/帖子:4493
连续签到天数:0
全部签到天数:0
注册时间:
手机型号:
X6 & MB860
来自:深圳
状态: 离线
纯学习了,觉得没有很大的必要
~人在网上飘,哪能不挨刀~& & !!!爱生活,爱mm,爱数码!!!
screen.width*0.7) {this.resized= this.width=screen.width*0.7; this.alt='Click here to open new window\nCTRL+Mouse wheel to zoom in/out';}" onmouseover="if(this.width>screen.width*0.7) {this.resized= this.width=screen.width*0.7; this.style.cursor='hand'; this.alt='Click here to open new window\nCTRL+Mouse wheel to zoom in/out';}" onclick="if(!this.resized) {} else {window.open(this.src);}" onmousewheel="return imgzoom(this);" alt="" />
UID 3189262
交易信用 0
积分/帖子:26
连续签到天数:0
全部签到天数:0
注册时间:
手机型号:
状态: 离线
回复 #7 adolphustse 的帖子
你说的对,仅供学习,缺失太麻烦了。
我自己是因为在手机内存上放了太多东西,然后发现很多软件都不能访问sdcard-ext,不得已才去尝试的。
UID 3189262
交易信用 0
积分/帖子:26
连续签到天数:0
全部签到天数:0
注册时间:
手机型号:
状态: 离线
另外,有的开发的不规范的软件,可能会由于文件大小写原因无法读到ext3里的文件,如K*D的导航,但其他软件都没有这样的问题,因此建议外置SD卡继续保持FAT格式,然后把这样的软件放到外置SD上。
财富值 164
交易信用 0
积分/帖子:160
连续签到天数:0
全部签到天数:0
注册时间:
手机型号:
状态: 离线
那个格式在WINDOWS下看不着
UID 6225523
财富值 722
交易信用 0
积分/帖子:657
连续签到天数:0
全部签到天数:0
注册时间:
手机型号:
状态: 离线
技术贴,帮顶,不过我的外置卡才8G,用谁都一样
财富值 1135
交易信用 0
积分/帖子:227
连续签到天数:2
全部签到天数:237
注册时间:
手机型号:
来自:改革开放
状态: 离线
技术含量过高,玩不起。纯帮顶~~~
财富值 408
交易信用 0
积分/帖子:503
连续签到天数:0
全部签到天数:0
注册时间:
手机型号:
状态: 离线
此法C6以上卡才行,速度慢的有时会导致开机无法进入系统。
财富值 146
交易信用 0
积分/帖子:147
连续签到天数:1
全部签到天数:16
注册时间:
手机型号:
状态: 离线
有些复杂,但我的手机昨天刷了CM7后,内置卡就找不到了,只有外置SD卡,如果在CM设置里选择使用内置卡后,系统有提示无SD卡,晕倒,怎么再找回内置SD卡呢?楼主,能指教一下吗?
交易信用 0
积分/帖子:79
连续签到天数:1
全部签到天数:2
注册时间:
手机型号:
状态: 离线
连接电脑读取文件又麻烦了。
微信扫一扫关注dospy

我要回帖

更多关于 android 外置sd 的文章

 

随机推荐