Android获取手机自带SDCard和外置SDCard路径

获取内置SD卡很简单,就一行代码

    /**
     * 获取内置SD卡路径
     * @return
     */
    public String getInnerSDCardPath() {  
        return Environment.getExternalStorageDirectory().getPath();  
    }

获取外置SD卡比较麻烦,

/**
     * 获取外置SD卡路径
     * @return
     */
public List<String> getExtSDCardPaths() {
    	         List<String> paths = new ArrayList<String>();
    	         String extFileStatus = Environment.getExternalStorageState();
    	         File extFile = Environment.getExternalStorageDirectory();
    	         if (extFileStatus.endsWith(Environment.MEDIA_UNMOUNTED)
    	                 && extFile.exists() && extFile.isDirectory()
    	                 && extFile.canWrite()) {
    	             paths.add(extFile.getAbsolutePath());
    	         }
    	         try {
    	             // obtain executed result of command line code of 'mount', to judge
    	             // whether tfCard exists by the result
    	             Runtime runtime = Runtime.getRuntime();
    	             Process process = runtime.exec("mount");
    	             InputStream is = process.getInputStream();
    	            InputStreamReader isr = new InputStreamReader(is);
    	             BufferedReader br = new BufferedReader(isr);
    	             String line = null;
    	             int mountPathIndex = 1;
    	             while ((line = br.readLine()) != null) {
    	                 if ((!line.contains("fat") && !line.contains("fuse") && !line
    	                         .contains("storage"))
    	                         || line.contains("secure")
    	                         || line.contains("asec")
    	                         || line.contains("firmware")
    	                         || line.contains("shell")
    	                         || line.contains("obb")
    	                         || line.contains("legacy") || line.contains("data")) {
    	                     continue;
    	                 }
    	                 String[] parts = line.split(" ");
    	                 int length = parts.length;
    	                if (mountPathIndex >= length) {
    	                     continue;
    	                 }
    	                 String mountPath = parts[mountPathIndex];
    	                 if (!mountPath.contains("/") || mountPath.contains("data")
    	                         || mountPath.contains("Data")) {
    	                     continue;
    	                 }
    	                 File mountRoot = new File(mountPath);
    	                 if (!mountRoot.exists() || !mountRoot.isDirectory()
    	                         || !mountRoot.canWrite()) {
    	                    continue;
    	                 }
    	                 boolean equalsToPrimarySD = mountPath.equals(extFile
    	                         .getAbsolutePath());
    	                 if (equalsToPrimarySD) {
    	                     continue;
    	                 }
    	                 paths.add(mountPath);
    	             }
    	         } catch (IOException e) {
    	             // TODO Auto-generated catch block
    	             e.printStackTrace();
    	         }
    	         return paths;
    	     }

首先获取了Android标准一部分的外置SD卡,如果它可用的话。

然后利用运行时,通过命令行函数"mount"来获取所有的存储位置,并对返回的结果进行SD卡或者TF卡的查找。

最后返回了所有可用于存储的不同的卡的位置,用一个List来保存。由于不是所有的手机都支持TF卡,因而这个List包含的路径未必很多,只有一个SD卡的手机只会返回一个路径,多个可用存储位置的会返回多个路径。

但有一点,是必须的,paths.get(0)肯定是外置SD卡的位置,因为它是primary external storage.

转载于:https://my.oschina.net/yuewawa/blog/625099

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值