天天看點

Android開發擷取記憶體卡路徑

        習慣了iOS開發的沙盒儲存,對于Android開發的SD卡儲存不怎麼了解,最近做一個Android TV項目特地研究了下Android資料本地化存儲;對于大部分Android大檔案存儲例如,視訊檔案一般都會存到SD卡上,之前做手機時一直用getExternalStorageDirectory()路徑存儲資料,而且很好用;這次需求是必須存到外置SD卡,研究了下Android儀器(Android盒子)發現自帶4個USB插口一個SD卡插口,着實頭疼了,心想這擷取的路徑怎麼也應該是一個數組,于是就去度娘,發現果然有存在某種問題或陰謀。

介紹記憶體卡路徑前先來介紹幾個概念

        一、相對路徑和絕對路徑

        絕對路徑是指書寫檔案的完整路徑,例如d:\java\Hello.java,該路徑中包含檔案的完整路徑d:\java以及檔案的全名Hello.java。使用該路徑可以唯一的找到一個檔案,不會産生歧義。但是使用絕對路徑在表示檔案時,受到的限制很大,且不能在不同的作業系統下運作,因為不同作業系統下絕對路徑的表達形式存在不同。

相對路徑是指書寫檔案的部分路徑,例如\test\Hello.java,該路徑中隻包含檔案的部分路徑\test和檔案的全名Hello.java,部分路徑是指目前路徑下的子路徑,例如目前程式在d:\abc下運作,則該檔案的完整路徑就是d:\abc\test。使用這種形式,可以更加通用的代表檔案的位置,使得檔案路徑産生一定的靈活性。

        二、内部存儲(internal storage)和外部存儲(external storage)的概念區分和實際位置

        注意内部存儲不是記憶體。内部存儲位于系統中很特殊的一個位置,如果你想将檔案存儲于内部存儲中,那麼檔案預設隻能被你的應用通路到,且一個應用所建立的所有檔案都在和應用包名相同的目錄下。也就是說應用建立于内部存儲的檔案,與這個應用是關聯起來的。當一個應用解除安裝之後,内部存儲中的這些檔案也被删除。從技術上來講如果你在建立内部存儲檔案的時候将檔案屬性設定成可讀,其他app能夠通路自己應用的資料,前提是他知道你這個應用的包名,如果一個檔案的屬性是私有(private),那麼即使知道包名其他應用也無法通路。 内部存儲空間十分有限,因而顯得可貴,另外,它也是系統本身和系統應用程式主要的資料存儲所在地,一旦内部存儲空間耗盡,手機也就無法使用了。是以對于内部存儲空間,我們要盡量避免使用。Shared Preferences和SQLite資料庫都是存儲在内部存儲空間上的。内部存儲一般用Context來擷取和操作。

擷取記憶體卡路徑

1、/storage/external_storage/sdcard1/

傳回的是機身内置存儲此,時為絕對路徑,不建議使用,因為一般手機型号不同,傳回的路徑可能不同。

2、Environment.getExternalStorageDirectory().getCanonicalPath()      

此時擷取的一般為手機内置儲存位置(根據手機的不同,傳回結果可能不同)。

3、public staticStringgetSDPathFirst(){
    StorageManager sm = (StorageManager) MboxApplication.instance.getBaseContext().getSystemService(Context.STORAGE_SERVICE);
    String[] paths = new String[6];
    try {
        paths = (String[]) sm.getClass().getMethod("getVolumePaths", new  Class[ 0 ]).invoke(sm, new  Object[]{});
    } catch (IllegalAccessException e) {
        e.printStackTrace();
    } catch (InvocationTargetException e) {
        e.printStackTrace();
    } catch (NoSuchMethodException e) {
        e.printStackTrace();
    }
    if (paths.length >= 3){
        return paths[1];//經過驗證下标為1時為外置sd卡路徑,2時為機身内置儲存
    }else {
        Toastutils.show("請插入SD卡",2);
        return null;
    }
}      

此時擷取的為SD卡路徑

參考文章:http://blog.csdn.net/androidwifi/article/details/17725989

繼續閱讀