Android获取外置sdcard路径
android 未提供获取外置SD储存卡的相应函数或方法,但我们可以自己写一个。当前只能用Environment.getExternalStorageDirectory()获取内置的SD卡路径,因为不同机型的系统SD卡的路径不相同,但是我们仍然可以有方法去获得外置SD卡的路径, 内置和外置SD卡的信息存在system/etc/vold.fstab 里面,我们可以从这里获得外置SD卡的路径, 这里面的内容就算在设备非ROOT的情况下也是可读的,所以这个方法值得一试:
本人写好了一个类,可供直接使用或参考:
Dev_MountInfo.class
[java] view plaincopy
importjava.io.BufferedReader;
importjava.io.File;
importjava.io.FileReader;
importjava.io.IOException;
importjava.util.ArrayList;
importcom.snuabar.getmounteddevices.Dev_MountInfo.DevInfo;
importandroid.os.Environment;
publicclassDev_MountInfoimplementsIDev{
/**
****
*/
publicfinalStringHEAD="dev_mount";
publicfinalStringLABEL="<label>";
publicfinalStringMOUNT_POINT="<mount_point>";
publicfinalStringPATH="<part>";
publicfinalStringSYSFS_PATH="<sysfs_path1...>";
/**
*Labelforthevolume
*/
privatefinalintNLABEL=1;
/**
*Partition
*/
privatefinalintNPATH=2;
/**
*Wherethevolumewillbemounted
*/
privatefinalintNMOUNT_POINT=3;
privatefinalintNSYSFS_PATH=4;
privatefinalintDEV_INTERNAL=0;
privatefinalintDEV_EXTERNAL=1;
privateArrayList<String>cache=newArrayList<String>();
privatestaticDev_MountInfodev;
privateDevInfoinfo;
privatefinalFileVOLD_FSTAB=newFile(Environment.getRootDirectory()
.getAbsoluteFile()
+File.separator
+"etc"
+File.separator
+"vold.fstab");
publicstaticDev_MountInfogetInstance(){
if(null==dev)
dev=newDev_MountInfo();
returndev;
}
privateDevInfogetInfo(finalintdevice){
//for(Stringstr:cache)
//System.out.println(str);
if(null==info)
info=newDevInfo();
try{
initVoldFstabToCache();
}catch(IOExceptione){
e.printStackTrace();
}
if(device>=cache.size())
returnnull;
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]);
returninfo;
}
/**
*initthewordsintothecachearray
*@throwsIOException
*/
privatevoidinitVoldFstabToCache()throwsIOException{
cache.clear();
BufferedReaderbr=newBufferedReader(newFileReader(VOLD_FSTAB));
Stringtmp=null;
while((tmp=br.readLine())!=null){
//thewordsstartsWith"dev_mount"aretheSDinfo
if(tmp.startsWith(HEAD)){
cache.add(tmp);
}
}
br.close();
cache.trimToSize();
}
publicclassDevInfo{
privateStringlabel,mount_point,path,sysfs_path;
/**
*returnthelabelnameoftheSDcard
*@return
*/
publicStringgetLabel(){
returnlabel;
}
privatevoidsetLabel(Stringlabel){
this.label=label;
}
/**
*themountpointoftheSDcard
*@return
*/
publicStringgetMount_point(){
returnmount_point;
}
privatevoidsetMount_point(Stringmount_point){
this.mount_point=mount_point;
}
/**
*SDmountpath
*@return
*/
publicStringgetPath(){
returnpath;
}
privatevoidsetPath(Stringpath){
this.path=path;
}
/**
*"unknow"
*@return
*/
publicStringgetSysfs_path(){
returnsysfs_path;
}
privatevoidsetSysfs_path(Stringsysfs_path){
this.sysfs_path=sysfs_path;
}
}
@Override
publicDevInfogetInternalInfo(){
returngetInfo(DEV_INTERNAL);
}
@Override
publicDevInfogetExternalInfo(){
returngetInfo(DEV_EXTERNAL);
}
}
interfaceIDev{
DevInfogetInternalInfo();
DevInfogetExternalInfo();
}
使用方法:
[java] view plaincopy
Dev_MountInfodev=Dev_MountInfo.getInstance();
DevInfoinfo=dev.getInternalInfo();//InternalSDCardInformations
info=dev.getExternalInfo();//ExternalSDCardInformations
//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卡路径:
[java] view plaincopy
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());
//不同的机型获得的会有所不同,先试试!!
Baidu Button BEGIN
Baidu Button END 192.168.100.33
下一篇
关于输入法的显示与隐藏的问题
Baidu Button BEGIN Baidu Button END
主题推荐
android
arraylist
interface
iterator
methods
猜你在找
AndroidAlertDialogBuilder创建常见对话框
Android Selector 与 Shape 基本用法
超漂亮的仿腾讯弹出层效果兼容主流浏览器
程序猿的克星
Android提高篇之自定义dialog实现processDialog正在加载效果使用Animation实现图片旋转
Android Service 详解四开始停止service
ExtJs grid批量处理
我的Android进阶之旅经典的大牛博客推荐
Android入门之Spinner纯java
准备好了么?
跳
吧
!
更多职位尽在CSDN JOB
Android高级开发工程师
上海欢校信息科技有限公司
|
10-20K/月
我要跳槽
诚聘【android高级开发工程师】
畅捷通信息技术股份有限公司
|
15-25K/月
我要跳槽
互联网证券业务组_高级Android研发工程师
百度在线网络技术(北京)有限公司
|
15-30K/月
我要跳槽
Android/iOS终端开发工程师
腾讯科技(深圳)有限公司.
|
10-20K/月
我要跳槽
AdForward Begin: 博客频道内容页下方Banner
AdForward End
查看评论
5楼 pcpanchen 2014-07-09 11:54发表 [回复]
在三星s7562中,用“另外一种方法”得到的倒数第二项为外置sd卡的路径。
4楼 ssjcfiaw911 2014-05-12 09:17发表 [回复]
Thx,华为3c能够获取到外置sd卡
3楼 mars0920 2013-10-09 13:42发表 [回复]
你这方法在三星s3手机上测试就不行
Re: u012500046 2014-02-09 12:51发表 [回复]
不同厂家机型的配置文件不一样的,我的gt-i8852的外置内存卡就在0位置,你查看vold.fstab文件,里面有详细的配置信息
2楼 wujxiaoz 2013-08-21 10:28发表 [回复] [引用] [举报]
[java] view plaincopy
[工具类一下]
/**
*多个SD卡时取外置SD卡<br>
*参考:http://blog.csdn.net/bbmiku/article/details/7937745<br>
*@return
*/
publicstaticStringgetExternalStorageDirectory(){
Map<String,String>map=System.getenv();
String[]values=newString[map.values().size()];
map.values().toArray(values);
Stringpath=values[values.length-1];//外置SD卡的路径
if(path.startsWith("/mnt/")&&!Environment.getExternalStorageDirectory().getAbsolutePath().equals(path)){
returnpath;
}else{
returnnull;
}
}
更多相关文章
- android没有插SD卡/TF卡(TF卡其实就是microSD卡)时的图库(拍照的照
- Android业务组件化之URL Scheme使用
- ContentProvider共享数据和ContentResolver的使用,Uri,UriMatche
- Android(安卓)开发进阶之『清除应用中的内存泄漏』
- 史上最易懂的Android(安卓)jni开发资料--NDK环境搭建
- Android(安卓)中的Java跟C/C++的Binder通信
- 如何为Android,Mac和Windows平台创建Java JNI动态链接库
- Android(安卓)Studio检测不到模拟器/真机(亲测可行)
- Android(安卓)Zip文件解压缩代码