android 未提供获取外置SD储存卡的相应函数或方法,但我们可以自己写一个。当前只能用Environment.getExternalStorageDirectory()获取内置的SD卡路径,因为不同机型的系统SD卡的路径不相同,但是我们仍然可以有方法去获得外置SD卡的路径, 内置和外置SD卡的信息存在system/etc/vold.fstab 里面,我们可以从这里获得外置SD卡的路径, 这里面的内容就算在设备非ROOT的情况下也是可读的,所以这个方法值得一试:

本人写好了一个类,可供直接使用或参考:

Dev_MountInfo.class

[java] view plaincopy


  1. importjava.io.BufferedReader;

  2. importjava.io.File;

  3. importjava.io.FileReader;

  4. importjava.io.IOException;

  5. importjava.util.ArrayList;

  6. importcom.snuabar.getmounteddevices.Dev_MountInfo.DevInfo;

  7. importandroid.os.Environment;

  8. publicclassDev_MountInfoimplementsIDev{

  9. /**

  10. ****

  11. */

  12. publicfinalStringHEAD="dev_mount";

  13. publicfinalStringLABEL="<label>";

  14. publicfinalStringMOUNT_POINT="<mount_point>";

  15. publicfinalStringPATH="<part>";

  16. publicfinalStringSYSFS_PATH="<sysfs_path1...>";

  17. /**

  18. *Labelforthevolume

  19. */

  20. privatefinalintNLABEL=1;

  21. /**

  22. *Partition

  23. */

  24. privatefinalintNPATH=2;

  25. /**

  26. *Wherethevolumewillbemounted

  27. */

  28. privatefinalintNMOUNT_POINT=3;

  29. privatefinalintNSYSFS_PATH=4;

  30. privatefinalintDEV_INTERNAL=0;

  31. privatefinalintDEV_EXTERNAL=1;

  32. privateArrayList<String>cache=newArrayList<String>();

  33. privatestaticDev_MountInfodev;

  34. privateDevInfoinfo;

  35. privatefinalFileVOLD_FSTAB=newFile(Environment.getRootDirectory()

  36. .getAbsoluteFile()

  37. +File.separator

  38. +"etc"

  39. +File.separator

  40. +"vold.fstab");

  41. publicstaticDev_MountInfogetInstance(){

  42. if(null==dev)

  43. dev=newDev_MountInfo();

  44. returndev;

  45. }

  46. privateDevInfogetInfo(finalintdevice){

  47. //for(Stringstr:cache)

  48. //System.out.println(str);

  49. if(null==info)

  50. info=newDevInfo();

  51. try{

  52. initVoldFstabToCache();

  53. }catch(IOExceptione){

  54. e.printStackTrace();

  55. }

  56. if(device>=cache.size())

  57. returnnull;

  58. String[]sinfo=cache.get(device).split("");

  59. info.setLabel(sinfo[NLABEL]);

  60. info.setMount_point(sinfo[NMOUNT_POINT]);

  61. info.setPath(sinfo[NPATH]);

  62. info.setSysfs_path(sinfo[NSYSFS_PATH]);

  63. returninfo;

  64. }

  65. /**

  66. *initthewordsintothecachearray

  67. *@throwsIOException

  68. */

  69. privatevoidinitVoldFstabToCache()throwsIOException{

  70. cache.clear();

  71. BufferedReaderbr=newBufferedReader(newFileReader(VOLD_FSTAB));

  72. Stringtmp=null;

  73. while((tmp=br.readLine())!=null){

  74. //thewordsstartsWith"dev_mount"aretheSDinfo

  75. if(tmp.startsWith(HEAD)){

  76. cache.add(tmp);

  77. }

  78. }

  79. br.close();

  80. cache.trimToSize();

  81. }

  82. publicclassDevInfo{

  83. privateStringlabel,mount_point,path,sysfs_path;

  84. /**

  85. *returnthelabelnameoftheSDcard

  86. *@return

  87. */

  88. publicStringgetLabel(){

  89. returnlabel;

  90. }

  91. privatevoidsetLabel(Stringlabel){

  92. this.label=label;

  93. }

  94. /**

  95. *themountpointoftheSDcard

  96. *@return

  97. */

  98. publicStringgetMount_point(){

  99. returnmount_point;

  100. }

  101. privatevoidsetMount_point(Stringmount_point){

  102. this.mount_point=mount_point;

  103. }

  104. /**

  105. *SDmountpath

  106. *@return

  107. */

  108. publicStringgetPath(){

  109. returnpath;

  110. }

  111. privatevoidsetPath(Stringpath){

  112. this.path=path;

  113. }

  114. /**

  115. *"unknow"

  116. *@return

  117. */

  118. publicStringgetSysfs_path(){

  119. returnsysfs_path;

  120. }

  121. privatevoidsetSysfs_path(Stringsysfs_path){

  122. this.sysfs_path=sysfs_path;

  123. }

  124. }

  125. @Override

  126. publicDevInfogetInternalInfo(){

  127. returngetInfo(DEV_INTERNAL);

  128. }

  129. @Override

  130. publicDevInfogetExternalInfo(){

  131. returngetInfo(DEV_EXTERNAL);

  132. }

  133. }

  134. interfaceIDev{

  135. DevInfogetInternalInfo();

  136. DevInfogetExternalInfo();

  137. }



使用方法:

[java] view plaincopy


  1. Dev_MountInfodev=Dev_MountInfo.getInstance();

  2. DevInfoinfo=dev.getInternalInfo();//InternalSDCardInformations

  3. info=dev.getExternalInfo();//ExternalSDCardInformations

  4. //Methods:

  5. info.getLabel();//SD卡的名称

  6. info.getMount_point();//SD卡挂载点

  7. info.getPath();//SD卡路径

  8. info.getSysfs_path();//....没弄清楚什么意思

不能保证所有版本系统和机型都适合,暂时只用LG P990 2.3.7 和华硕 平板 4.0.3进行过测试,都可以成功获取外置SD卡路径, 若此方法在你的机型或系统中无法获取相应路径,请回复,good luck!


有另一种方法可以得到外置SD卡路径:

[java] view plaincopy


  1. System.getenv();//返回的是一个map

  2. Map<String,String>map=System.getenv();

  3. //遍历出来可以看到最后一项是外置SD卡路径

  4. Set<String>set=map.keySet();

  5. Iterator<String>key=set.iterator();

  6. while(key.hasNext())

  7. Log.d("123",key.next());

  8. Collection<String>col=map.values();

  9. Iterator<String>val=col.iterator();

  10. while(val.hasNext())

  11. Log.d("123",val.next());

  12. //不同的机型获得的会有所不同,先试试!!


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


  1. [工具类一下]

  2. /**

  3. *多个SD卡时取外置SD卡<br>

  4. *参考:http://blog.csdn.net/bbmiku/article/details/7937745<br>

  5. *@return

  6. */

  7. publicstaticStringgetExternalStorageDirectory(){

  8. Map<String,String>map=System.getenv();

  9. String[]values=newString[map.values().size()];

  10. map.values().toArray(values);

  11. Stringpath=values[values.length-1];//外置SD卡的路径

  12. if(path.startsWith("/mnt/")&&!Environment.getExternalStorageDirectory().getAbsolutePath().equals(path)){

  13. returnpath;

  14. }else{

  15. returnnull;

  16. }

  17. }


更多相关文章

  1. android没有插SD卡/TF卡(TF卡其实就是microSD卡)时的图库(拍照的照
  2. Android业务组件化之URL Scheme使用
  3. ContentProvider共享数据和ContentResolver的使用,Uri,UriMatche
  4. Android(安卓)开发进阶之『清除应用中的内存泄漏』
  5. 史上最易懂的Android(安卓)jni开发资料--NDK环境搭建
  6. Android(安卓)中的Java跟C/C++的Binder通信
  7. 如何为Android,Mac和Windows平台创建Java JNI动态链接库
  8. Android(安卓)Studio检测不到模拟器/真机(亲测可行)
  9. Android(安卓)Zip文件解压缩代码

随机推荐

  1. 在不触发hashchange事件的情况下更改哈希
  2. 从事件监听器OnClick中排除按钮
  3. Ajax请求等到第一次AJAX调用未完成
  4. jQuery中$.get、$.post、$.getJSON和$.aj
  5. js或Jquery中判断字符串中是否有换行符或
  6. 如何使用javascript或jquery获取图像的自
  7. jQuery——将title属性用作悬停的文本,但
  8. 将AngularJS、jQueryUI、Angular-Drag-Dr
  9. 我需要从jquery ajax post中撤回数据并将
  10. scrollTop到溢出滚动div中的活动元素