android得到外置sd卡路径和判断外置sd卡是否卸载

From:http://blog.csdn.net/com314159/article/details/22859059

注意,判断外置sd卡是否卸载不能直接判断得到外置sd卡路径是否为空,即使外置sd卡卸载时,得到的路径,在拔出sd卡5秒内仍然可能不为空。这个问题我当时也纠结好久。




代码如下:

[java]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. <pre code_snippet_id="271960" snippet_file_name="blog_20140403_1_711843" name="code" class="java"></pre><pre code_snippet_id="271960" snippet_file_name="blog_20140417_2_7179354" name="code" class="java"><pre code_snippet_id="271960" snippet_file_name="blog_20140417_2_7179354" name="code" class="java">package cn.keyshare.utils;  
  2.   
  3. import java.io.BufferedReader;  
  4. import java.io.File;  
  5. import java.io.InputStream;  
  6. import java.io.InputStreamReader;  
  7. import java.util.ArrayList;  
  8. import java.util.List;  
  9.   
  10. import android.os.Environment;  
  11.   
  12. public class SdCardUtils {  
  13.   
  14.     // 返回值不带File seperater "/",如果没有外置第二个sd卡,返回null  
  15.     public static String getSecondExterPath() {  
  16.         List<String> paths = getAllExterSdcardPath();  
  17.   
  18.         if (paths.size() == 2) {  
  19.   
  20.             for (String path : paths) {  
  21.                 if (path != null && !path.equals(getFirstExterPath())) {  
  22.                     return path;  
  23.                 }  
  24.             }  
  25.   
  26.             return null;  
  27.   
  28.         } else {  
  29.             return null;  
  30.         }  
  31.     }  
  32.   
  33.     public static boolean isFirstSdcardMounted(){  
  34.         if (!Environment.getExternalStorageState().equals(  
  35.                 Environment.MEDIA_MOUNTED)) {  
  36.             return false;  
  37.         }  
  38.         return true;  
  39.     }  
  40.       
  41.     public static boolean isSecondSDcardMounted() {  
  42.         String sd2 = getSecondExterPath();  
  43.         if (sd2 == null) {  
  44.             return false;  
  45.         }  
  46.         return checkFsWritable(sd2 + File.separator);  
  47.   
  48.     }  
  49.   
  50.     // 测试外置sd卡是否卸载,不能直接判断外置sd卡是否为null,因为当外置sd卡拔出时,仍然能得到外置sd卡路径。我这种方法是按照android谷歌测试DICM的方法,  
  51.     // 创建一个文件,然后立即删除,看是否卸载外置sd卡  
  52.     // 注意这里有一个小bug,即使外置sd卡没有卸载,但是存储空间不够大,或者文件数已至最大数,此时,也不能创建新文件。此时,统一提示用户清理sd卡吧  
  53.     private static boolean checkFsWritable(String dir) {  
  54.   
  55.         if (dir == null)  
  56.             return false;  
  57.   
  58.         File directory = new File(dir);  
  59.   
  60.         if (!directory.isDirectory()) {  
  61.             if (!directory.mkdirs()) {  
  62.                 return false;  
  63.             }  
  64.         }  
  65.   
  66.         File f = new File(directory, ".keysharetestgzc");  
  67.         try {  
  68.             if (f.exists()) {  
  69.                 f.delete();  
  70.             }  
  71.             if (!f.createNewFile()) {  
  72.                 return false;  
  73.             }  
  74.             f.delete();  
  75.             return true;  
  76.   
  77.         } catch (Exception e) {  
  78.         }  
  79.         return false;  
  80.   
  81.     }  
  82.   
  83.     public static String getFirstExterPath() {  
  84.         return Environment.getExternalStorageDirectory().getPath();  
  85.     }  
  86.   
  87.     public static List<String> getAllExterSdcardPath() {  
  88.         List<String> SdList = new ArrayList<String>();  
  89.   
  90.         String firstPath = getFirstExterPath();  
  91.   
  92.         // 得到路径  
  93.         try {  
  94.             Runtime runtime = Runtime.getRuntime();  
  95.             Process proc = runtime.exec("mount");  
  96.             InputStream is = proc.getInputStream();  
  97.             InputStreamReader isr = new InputStreamReader(is);  
  98.             String line;  
  99.             BufferedReader br = new BufferedReader(isr);  
  100.             while ((line = br.readLine()) != null) {  
  101.                 // 将常见的linux分区过滤掉  
  102.                 if (line.contains("secure"))  
  103.                     continue;  
  104.                 if (line.contains("asec"))  
  105.                     continue;  
  106.                 if (line.contains("media"))  
  107.                     continue;  
  108.                 if (line.contains("system") || line.contains("cache")  
  109.                         || line.contains("sys") || line.contains("data")  
  110.                         || line.contains("tmpfs") || line.contains("shell")  
  111.                         || line.contains("root") || line.contains("acct")  
  112.                         || line.contains("proc") || line.contains("misc")  
  113.                         || line.contains("obb")) {  
  114.                     continue;  
  115.                 }  
  116.   
  117.                 if (line.contains("fat") || line.contains("fuse") || (line  
  118.                         .contains("ntfs"))) {  
  119.                       
  120.                     String columns[] = line.split(" ");  
  121.                     if (columns != null && columns.length > 1) {  
  122.                         String path = columns[1];  
  123.                         if (path!=null&&!SdList.contains(path)&&path.contains("sd"))  
  124.                             SdList.add(columns[1]);  
  125.                     }  
  126.                 }  
  127.             }  
  128.         } catch (Exception e) {  
  129.             // TODO Auto-generated catch block  
  130.             e.printStackTrace();  
  131.         }  
  132.   
  133.         if (!SdList.contains(firstPath)) {  
  134.             SdList.add(firstPath);  
  135.         }  
  136.   
  137.         return SdList;  
  138.     }  
  139. }  
  140. </pre><br>  
  141. <br>  
  142. <pre></pre>  
  143. <pre></pre>  
  144. <pre></pre>  
  145. <pre></pre>  
  146.   
  147. </pre>  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值