2012-11-20 58 views
0

我遇到了一些衆所周知的問題,即獲取安裝在某些Android設備上的外部SD卡的路徑。 (請參閱this question以瞭解我的意思)如何正確獲取外部SD卡路徑?

我想通過閱讀/etc/vold.fstab的內容來解決問題,然後僅代表分區的行,但我沒有用於執行測試的設備。 我想要做的是讀取該文件,忽略引用由Environment.getExternalStorageDirectory()返回的地址的行,並採取另一行(如果存在)。

我不知道(而且我也沒有可能測試它)是:在哪些情況下我可以使用其他行不是外部SD卡? SD卡(如果有)出現在文件vold.fstab中?

編輯: 答案是:是的。閱讀accepted answer

+1

Environment.getExternalStorageDirectory()是SD卡 – njzk2

+0

請記住您的解決方案可能無法正常工作在Android 4.2上,給定多個用戶帳戶功能。目前還不清楚這些卷一般可以在多大程度上訪問,更不用說4.2設備在被次級用戶使用時如何處理它們。 – CommonsWare

+0

爲什麼它不應該工作? (想要了解以便找到可能的解決方案) – Massimo

回答

-1

這可能是正確的解決方案。從/etc/vold.fstab,其中列出了當前安裝在Linux系統上的所有分區閱讀(安卓含稅)

String getExternalSdcardDirectory() { 
    FileInputStream fis = null; 
    try { 
     fis = new FileInputStream(new File("/etc/vold.fstab")); 
    } catch (FileNotFoundException e) { 
     return null; // should never be reached 
    } 

    try { 
     byte[] buffer = new byte[4096]; 
     int n=0; 

     String file = ""; 
     while ((n=fis.read(buffer, 0, 4096))>0) { 
      file += new String(buffer, 0, n); 
     } 
     fis.close(); 

     String[] rows = file.split("\n"); 
     for (String row: rows) { 
      String trimmedRow = row.trim(); 
      if (trimmedRow.startsWith("#") || trimmedRow.equals("")) 
       continue; 
      else if (trimmedRow.equals(Environment.getExternalStorageDirectory().getAbsolutePath())) 
       continue; 
      else 
       return trimmedRow.split(" ")[2]; 

     } 
    } catch (IOException e) { 
     // nothing 
    } 
    return null; 
} 
+0

no'/ etc/vold.fstab' on my device ... – dentex

+0

根據此:http://android.stackexchange.com/questions/14530/whats-the-android-equivalent-of-etc-fstab,I有'/ fstab。$ systemname.rc'文件。 – dentex

+0

您的設備是否有(或有)microSD卡插槽? – Massimo

1

this有什麼問題?

Environment.getExternalStoreDirectory() 

爲什麼在SD卡上忽略這個?

OK - 與/ SD卡(內部)和外部SD卡(??),你總是可以掃描fstab文件並查找「sdhci」,這是SD主機控制器橋驅動裝置的情況。

喜歡的東西:

​​

然後,只需分析是必要的。

爲什麼找到實際的SD卡的「必要性」,雖然實際上沒有被OS處理過? (不會安裝爲大容量存儲器)

您的應用程序僅適用於這種情況的設備嗎?使用任何Android相信的SD存儲空間有什麼問題?

+0

我想面對那些看到「外部」內存的設備(由環境引用。getExternalStoreDirectory())作爲內部分區,並允許插入另一個外部SD卡。 對於這些設備,標準庫沒有獲取此外部SD卡路徑的方法。 – Massimo

+0

我們在這裏談論什麼設備?當設備沒有SD插槽時,內部驅動器上將使用/ sdcard。如果有SD插槽,則使用/ sdcard(一般)作爲安裝點。我從來沒有聽說過使用這兩種設備.... – Rawkode

+0

三星Galaxy S3:http://stackoverflow.com/questions/11281010/how-can-i-get-external-sd-card-path-for-android -4-0 – Massimo

0

我用下面的代碼首先檢測羯羊的SD卡存在,然後運行該培訓相關代碼:

Detecting whether SD card exists: 

Boolean isSDPresent = android.os.Environment.getExternalStorageState().equals(android.os.Environment.MEDIA_MOUNTED); 
if(isSDPresent) 
{ 
    // file path = "/mnt/sdcard/Android/data/PACKAGE_NAME/..." 
} 
else 
{ 
    // file path = "/data/data/PACKAGE_NAME/..." 
} 

認爲這是你所追求的?

相關問題