Environment.getExternalStorageDirectory()是Android 2.x時代的產物,那時Android主流設備只有很小的內置存儲器,然後都會外置一張sd卡,那時這個方法返回的就是外置sd卡的根路徑。但隨著Android進入4.x時代,大部分Android設備都已經內 ...
Environment.getExternalStorageDirectory()是Android 2.x時代的產物,那時Android主流設備只有很小的內置存儲器,然後都會外置一張sd卡,那時這個方法返回的就是外置sd卡的根路徑。
但隨著Android進入4.x時代,大部分Android設備都已經內置一個較大存儲卡,甚至不提供外置存儲卡插槽了,此時Environment.getExternalStorageDirectory()返回的路徑其實是由內置存儲卡虛擬出來的一個目錄,用戶在這一目錄下有全部許可權。
按理說Android應該繼續提供其他的方法來返回其他的外置存儲卡的路徑,但這一次Android卻沒有,因為Android系統開發者們發現之前直接允許程式任意訪問sd卡的做法導致sd卡上垃圾文件的不可管理性,尤其在程式被卸載後,由於不知道那些文件是由這一程式創建的,所以無法關聯刪除,因此Android 4.0並不給程式開發者提供外置存儲卡的路徑,而是提供了諸如getExternalFilesDirs()和getExternalCacheDirs()這樣的方法,直接給開發者提供一個限制內的存儲文件的空間,這個空間是與程式關聯的,因此在卸載程式時這兩個目錄下的文件也會被關聯刪除。
閑話到此,主要是為了說明Android 4.0之後,系統不希望開發者直接訪問sd卡,所以也沒有提供查詢多sd卡路徑的方法(在2.x和3.x時代末期我們都以為4.0會提供這樣的查詢介面)。
但是,Android系統不提供並不意味著就沒有辦法了,Android說到底還是Linux系統,因此外置sd卡必然是按照Linux的掛載方式掛載到系統中的。因此目前比較主流的方法就是繞過Android直接去讀取Linux底層的掛載文件來找到系統中掛載的外置存儲器。
參考代碼:(這個代碼是從網上找的,跟我之前寫的思路差不多,參考這個改改吧,其實不用這麼複雜,返回一個Set或者List把所有路徑都返回就好了)
- /**
- * 獲取外置SD卡路徑
- * @return 應該就一條記錄或空
- */
- public List<String> getExtSDCardPath()
- {
- List<String> lResult = new ArrayList<String>();
- try {
- Runtime rt = Runtime.getRuntime();
- Process proc = rt.exec("mount");
- InputStream is = proc.getInputStream();
- InputStreamReader isr = new InputStreamReader(is);
- BufferedReader br = new BufferedReader(isr);
- String line;
- while ((line = br.readLine()) != null) {
- if (line.contains("extSdCard"))
- {
- String [] arr = line.split(" ");
- String path = arr[1];
- File file = new File(path);
- if (file.isDirectory())
- {
- lResult.add(path);
- }
- }
- }
- isr.close();
- } catch (Exception e) {
- }
- return lResult;
- }