Android獲取存儲設備掛載路徑

分類:編程 時間:2017-02-17

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;
}

Tags: Android 存儲卡 存儲器 開發者 Linux

文章來源:


ads
ads

相關文章
ads

相關文章

ad