Android编程实现手机自带内部存储路径的获取方法
本文实例讲述了Android编程实现手机自带内部存储路径的获取方法。分享给大家供大家参考,具体如下:
我有一台中兴的Android手机,型号是ZTEU930HD,手机没有插入外置SD卡(也就是MicroSDCard,原名Trans-flashCard(TF卡),2004年正式更名为MicroSDCard),但是机身自带了一个内置存储卡(也就是eMMC存储,大小为2G)。
我把这个手机用数据线插到电脑上,也会看到盘符,通过安装「R.E管理器」等文件管理应用,也可以管理文件,并且能看到该存储的挂载目录是:/mnt/sdcard2
但是,我打印Environment.getExternalStorageState(),却返回"removed";
这是怎么回事?明明手机本身带着内置SD卡,却为何提示这么一个信息?
我又试着去打印了Environment.getExternalStorageDirectory(),返回:"/mnt/sdcard"
看起来可以解释了,在我这个中兴手机上,调用Environment.getExternalStorageDirectory(),返回的存储目录并不是系统内置的SD卡目录。
我又换了一个SonyL39u,一个MOTOG,调用Environment.getExternalStorageDirectory()返回的目录就是系统内置的SD卡目录。
不同的设备上,调用getExternalStorageDirectory()返回值却不一样。查询了Android的文档,才找到原因,原来这个方法返回的是当前设备厂商所认为的"外部存储",有可能返回外置的SD卡目录(MicroSDCard),也可能返回内置的存储目(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",在索尼、MOTOG上就返回:"mounted"
原因已经知道了,可是如何在无外置SD卡的时候,获取到这个内置eMMC存储的具体路径呢?
比如,我这个中兴手机,既然使用Environment.getExternalStorageDirectory()获取到的是外置SD卡路径,但是我又没有插入SD卡,这个时候我想使用内置的eMMC存储来存储一些程序中用到的数据,我怎么去获取这个eMMC存储的路径呢?
答案是:通过扫描系统文件"system/etc/vold.fstab"来实现。
"system/etc/vold.fstab"只是一个简单的配置文件,它描述了Android的挂载点信息。
我们可以遍历这个文件来获取所有的挂载点:
/** *遍历"system/etc/vold.fstab"文件,获取全部的Android的挂载点信息 * *@return */ privatestaticArrayList<String>getDevMountList(){ String[]toSearch=FileUtils.readFile("/etc/vold.fstab").split(""); ArrayList<String>out=newArrayList<String>(); for(inti=0;i<toSearch.length;i++){ if(toSearch[i].contains("dev_mount")){ if(newFile(toSearch[i+2]).exists()){ out.add(toSearch[i+2]); } } } returnout; }
之后,当Environment.getExternalStorageState()返回"removed"的时候(即,当没有挂载外置SD卡的时候),通过getDevMountList()方法获取一个list,这个list中可以进行写操作的那个就是系统自带的eMMC存储目录了。
判断逻辑:
/** *获取扩展SD卡存储目录 * *如果有外接的SD卡,并且已挂载,则返回这个外置SD卡目录 *否则:返回内置SD卡目录 * *@return */ publicstaticStringgetExternalSdCardPath(){ if(SDCardUtils.isMounted()){ FilesdCardFile=newFile(Environment.getExternalStorageDirectory().getAbsolutePath()); returnsdCardFile.getAbsolutePath(); } Stringpath=null; FilesdCardFile=null; ArrayList<String>devMountList=getDevMountList(); for(StringdevMount:devMountList){ Filefile=newFile(devMount); if(file.isDirectory()&&file.canWrite()){ path=file.getAbsolutePath(); StringtimeStamp=newSimpleDateFormat("ddMMyyyy_HHmmss").format(newDate()); FiletestWritable=newFile(path,"test_"+timeStamp); if(testWritable.mkdirs()){ testWritable.delete(); }else{ path=null; } } } if(path!=null){ sdCardFile=newFile(path); returnsdCardFile.getAbsolutePath(); } returnnull; }
希望本文所述对大家Android程序设计有所帮助。