众所周知,谷歌提供给了我们获取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 SHARE
SHARE on /media/sf_SHARE/ type vboxsf (rw)
后面敲入mount查看到F盘的SHARE目录已经被挂载到/media/sf_SHARE下,也可以查看到SHARE里的文件。安卓采用的也是这种方式,于是我们可以通过查看mount命令的输出来获取所挂载的路径是什么。下面直接上代码,代码中都有注释。
/**
* 获取手机系统中所有被挂载的TF卡,包括OTG等
*
* @return
*/
public static List<String> getAllExterSdcardPath()
{
List<String> SdList = new ArrayList<String>();
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 block
e.printStackTrace();
}
if (!SdList.contains(firstPath))
{
SdList.add(firstPath);
}
return SdList;
}
}