众所周知,谷歌提供给了我们获取android内置存储卡的绝对路径的方法,但是如果要获取外置的存储的路径的话,谷歌就没有提供了。我们需要自己去写方法来获取这些路径,比如外置的tf卡,OTG挂载的U盘等。

那么采用什么方法呢,android说白了也就是一种linux系统,采用的是linux的内核。而linux中挂载存储设备使用的是 mount 命令来挂载设备到文件系统中。如:

mount -rw /dev/mmcblock0 /mnt

就是将设备存储卡以可读写的方式挂载到了/mnt目录下,此后访问/mnt就是访问存储卡的内容。又如用的最常用的挂载windows下的文件夹到linux虚拟机中(Virtual Box):

root@tony-laptop:~# mount -t vboxsf SHARE /media/sf_SHARE/root@tony-laptop:~# mount | grep SHARESHARE on /media/sf_SHARE/ type vboxsf (rw)
后面敲入mount查看到F盘的SHARE目录已经被挂载到/media/sf_SHARE下,也可以查看到SHARE里的文件。安卓采用的也是这种方式,于是我们可以通过查看mount命令的输出来获取所挂载的路径是什么。下面直接上代码,代码中都有注释。


/** * 获取手机系统中所有被挂载的TF卡,包括OTG等 *  * @return */public static List getAllExterSdcardPath(){List SdList = new ArrayList();String firstPath = Environment.getExternalStorageDirectory().getPath();try{Runtime runtime = Runtime.getRuntime();// 运行mount命令,获取命令的输出,得到系统中挂载的所有目录Process proc = runtime.exec("mount");InputStream is = proc.getInputStream();InputStreamReader isr = new InputStreamReader(is);String line;BufferedReader br = new BufferedReader(isr);while ((line = br.readLine()) != null){Log.d("", line);// 将常见的linux分区过滤掉if (line.contains("proc") || line.contains("tmpfs") || line.contains("media") || line.contains("asec") || line.contains("secure") || line.contains("system") || line.contains("cache")|| line.contains("sys") || line.contains("data") || line.contains("shell") || line.contains("root") || line.contains("acct") || line.contains("misc") || line.contains("obb")){continue;}// 下面这些分区是我们需要的if (line.contains("fat") || line.contains("fuse") || (line.contains("ntfs"))){// 将mount命令获取的列表分割,items[0]为设备名,items[1]为挂载路径String items[] = line.split(" ");if (items != null && items.length > 1){String path = items[1].toLowerCase(Locale.getDefault());// 添加一些判断,确保是sd卡,如果是otg等挂载方式,可以具体分析并添加判断条件if (path != null && !SdList.contains(path) && path.contains("sd"))SdList.add(items[1]);}}}} catch (Exception e){// TODO Auto-generated catch blocke.printStackTrace();}if (!SdList.contains(firstPath)){SdList.add(firstPath);}return SdList;}}



在使用过程中,可能会因为安卓手机厂家太多,ROM太多,判断条件不准确的时候,这就需要针对一些机型来添加具体的判断条件来确保能够把所需要的路径全读出来。


更多相关文章

  1. Android获取当前应用分配的最大内存和目前使用内存的方法
  2. Android基于IIS的APK下载(三)用JSON传输更新数据
  3. Android——UI篇:android视频压缩:兼容7.0版本。
  4. 打造史上最简单,最实用的Log工具类
  5. 我的安卓应用——SchoolSystem的代码展示
  6. android-从音频数据库获取音乐数据
  7. Android(安卓)Studio + Eclipse 实现类似微博主页功能APP
  8. android 使用Photoshop获取图片某一点的颜色
  9. android的 网络下载和数据持久化

随机推荐

  1. android 加边框
  2. Android的IPC机制Binder的详解(转发)
  3. Android(安卓)Studio 开发依赖库集锦
  4. Android(安卓)Content Provider详解及示
  5. Android(安卓)ADB 源码分析总结
  6. Android(安卓)Notification 通知
  7. Android修炼之道——Shape
  8. android 开发问题集,android问题总结,and
  9. ImageView的scaletype属性
  10. Android新控件MotionLayout介绍(三)