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底層的掛載檔案來找到系統中掛載的外接儲存器。
// 讀取mount節點
public static List<String> getAllStorageLocationsList() {
List<String > mMounts = new ArrayList<String>();
try {
File mountFile = new File("/proc/mounts");
if (mountFile.exists()) {
Scanner scanner = new Scanner(mountFile);
while (scanner.hasNext()) {
String line = scanner.nextLine();
if (line.startsWith("/dev/block/vold/")) {
String[] lineElements = line.split(" ");
String element = lineElements[1];
mMounts.add(element);
}
}
}
} catch (Exception e) {
e.printStackTrace();
}
return mMounts;
}