转自:http://blog.csdn.net/bbmiku/article/details/7937745
?
android? 未提供获取外置SD储存卡的相应函数或方法,但我们可以自己写一个。当前只能用Environment.getExternalStorageDirectory()获取内置的SD卡路径,因为不同机型的系统SD卡的路径不相同,但是我们仍然可以有方法去获得外置SD卡的路径,? 内置和外置SD卡的信息存在system/etc/vold.fstab 里面,我们可以从这里获得外置SD卡的路径,? 这里面的内容就算在设备非ROOT的情况下也是可读的,所以这个方法值得一试:
本人写好了一个类,可供直接使用或参考:
Dev_MountInfo.class
?
- import?java.io.BufferedReader;??
- import?java.io.File;??
- import?java.io.FileReader;??
- import?java.io.IOException;??
- import?java.util.ArrayList;??
- ??
- import?com.snuabar.getmounteddevices.Dev_MountInfo.DevInfo;??
- ??
- import?android.os.Environment;??
- ??
- public?class?Dev_MountInfo?implements?IDev?{??
- ????/**?
- ?????*?***?
- ?????*/??
- ????public?final?String?HEAD?=?"dev_mount";??
- ????public?final?String?LABEL?=?"<label>";??
- ????public?final?String?MOUNT_POINT?=?"<mount_point>";??
- ????public?final?String?PATH?=?"<part>";??
- ????public?final?String?SYSFS_PATH?=?"<sysfs_path1...>";??
- ??
- ????/**?
- ?????*?Label?for?the?volume?
- ?????*/??
- ????private?final?int?NLABEL?=?1;??
- ????/**?
- ?????*?Partition?
- ?????*/??
- ????private?final?int?NPATH?=?2;??
- ????/**?
- ?????*?Where?the?volume?will?be?mounted?
- ?????*/??
- ????private?final?int?NMOUNT_POINT?=?3;??
- ????private?final?int?NSYSFS_PATH?=?4;??
- ??
- ????private?final?int?DEV_INTERNAL?=?0;??
- ????private?final?int?DEV_EXTERNAL?=?1;??
- ??
- ????private?ArrayList<String>?cache?=?new?ArrayList<String>();??
- ??
- ????private?static?Dev_MountInfo?dev;??
- ????private?DevInfo?info;??
- ??
- ????private?final?File?VOLD_FSTAB?=?new?File(Environment.getRootDirectory()??
- ????????????.getAbsoluteFile()??
- ????????????+?File.separator??
- ????????????+?"etc"??
- ????????????+?File.separator??
- ????????????+?"vold.fstab");??
- ??
- ????public?static?Dev_MountInfo?getInstance()?{??
- ????????if?(null?==?dev)??
- ????????????dev?=?new?Dev_MountInfo();??
- ????????return?dev;??
- ????}??
- ??
- ????private?DevInfo?getInfo(final?int?device)?{??
- ????????//?for(String?str:cache)??
- ????????//?System.out.println(str);??
- ??
- ????????if?(null?==?info)??
- ????????????info?=?new?DevInfo();??
- ??
- ????????try?{??
- ????????????initVoldFstabToCache();??
- ????????}?catch?(IOException?e)?{??
- ????????????e.printStackTrace();??
- ????????}??
- ??
- ????????if?(device?>=?cache.size())??
- ????????????return?null;??
- ????????String[]?sinfo?=?cache.get(device).split("?");??
- ??
- ????????info.setLabel(sinfo[NLABEL]);??
- ????????info.setMount_point(sinfo[NMOUNT_POINT]);??
- ????????info.setPath(sinfo[NPATH]);??
- ????????info.setSysfs_path(sinfo[NSYSFS_PATH]);??
- ??
- ????????return?info;??
- ????}??
- ??
- ????/**?
- ?????*?init?the?words?into?the?cache?array?
- [email protected]?
- ?????*/??
- ????private?void?initVoldFstabToCache()?throws?IOException?{??
- ????????cache.clear();??
- ????????BufferedReader?br?=?new?BufferedReader(new?FileReader(VOLD_FSTAB));??
- ????????String?tmp?=?null;??
- ????????while?((tmp?=?br.readLine())?!=?null)?{??
- ????????????//?the?words?startsWith?"dev_mount"?are?the?SD?info??
- ????????????if?(tmp.startsWith(HEAD))?{??
- ????????????????cache.add(tmp);??
- ????????????}??
- ????????}??
- ????????br.close();??
- ????????cache.trimToSize();??
- ????}??
- ??
- ????public?class?DevInfo?{??
- ????????private?String?label,?mount_point,?path,?sysfs_path;??
- ??
- ????????/**?
- ?????????*?return?the?label?name?of?the?SD?card?
- [email protected]?
- ?????????*/??
- ????????public?String?getLabel()?{??
- ????????????return?label;??
- ????????}??
- ??
- ????????private?void?setLabel(String?label)?{??
- ????????????this.label?=?label;??
- ????????}??
- ??
- ????????/**?
- ?????????*?the?mount?point?of?the?SD?card?
- [email protected]?
- ?????????*/??
- ????????public?String?getMount_point()?{??
- ????????????return?mount_point;??
- ????????}??
- ??
- ????????private?void?setMount_point(String?mount_point)?{??
- ????????????this.mount_point?=?mount_point;??
- ????????}??
- ??
- ????????/**?
- ?????????*?SD?mount?path?
- [email protected]?
- ?????????*/??
- ????????public?String?getPath()?{??
- ????????????return?path;??
- ????????}??
- ??
- ????????private?void?setPath(String?path)?{??
- ????????????this.path?=?path;??
- ????????}??
- ??
- ????????/**?
- ?????????*?"unknow"?
- [email protected]?
- ?????????*/??
- ????????public?String?getSysfs_path()?{??
- ????????????return?sysfs_path;??
- ????????}??
- ??
- ????????private?void?setSysfs_path(String?sysfs_path)?{??
- ????????????this.sysfs_path?=?sysfs_path;??
- ????????}??
- ??
- ????}??
- ??
- ????@Override??
- ????public?DevInfo?getInternalInfo()?{??
- ????????return?getInfo(DEV_INTERNAL);??
- ????}??
- ??
- ????@Override??
- ????public?DevInfo?getExternalInfo()?{??
- ????????return?getInfo(DEV_EXTERNAL);??
- ????}??
- }??
- ??
- interface?IDev?{??
- ????DevInfo?getInternalInfo();??
- ??
- ????DevInfo?getExternalInfo();??
- }??
?
使用方法:
- Dev_MountInfo?dev?=?Dev_MountInfo.getInstance();??
- DevInfo?info?=?dev.getInternalInfo();//Internal?SD?Card?Informations??
- info?=?dev.getExternalInfo();//External?SD?Card?Informations??
- ??
- //???Methods:??
- info.getLabel();?//?SD?卡的名称??
- info.getMount_point();//SD?卡挂载点??
- info.getPath();?//SD?卡路径??
- info.getSysfs_path();?//?....没弄清楚什么意思??
?
不能保证所有版本系统和机型都适合,暂时只用LG P990 2.3.7? 和华硕 平板 4.0.3进行过测试,都可以成功获取外置SD卡路径,? 若此方法在你的机型或系统中无法获取相应路径,请回复,good luck!
?
有另一种方法可以得到外置SD卡路径:
- System.getenv();?//?返回的是一个map??
- Map<String,?String>?map?=?System.getenv();??
- ??
- //遍历出来可以看到最后一项是外置SD卡路径??
- ??
- Set<String>?set?=?map.keySet();??
- ????????Iterator<String>?key?=?set.iterator();??
- ????????while(key.hasNext())??
- ????????????Log.d("123",?key.next());??
- ??????????
- ????????Collection<String>?col?=?map.values();??
- ????????Iterator<String>?val?=?col.iterator();??
- ????????while(val.hasNext())??
- ????????????Log.d("123",?val.next());??
- ??
- //不同的机型获得的会有所不同,先试试!!