2016-09-12 47 views
1

Android check for SD Card mounted always returns true
我的問題已經被問早前也&因爲沒有滿意的回答,我堅持。我的要求很簡單。
我正在研究一個應用程序,我需要讓用戶選擇一個存儲以保存應用程序下載。我需要一種確認外部SD卡存在的方法。
已經嘗試以下方法:
一個肯定的射擊方法,如果SD卡存在

這總是返回true這可能是由於這個原因:https://stackoverflow.com/a/7790228/3475715

final Boolean isSDPresent = Environment.getExternalStorageState(). 
         equals(android.os.Environment.MEDIA_MOUNTED); 



以下是還沒有工作堂妹也許是硬編碼的路徑是不同的手機

不同
File file = new File("/mnt/extSdCard"); 
    try { 
     File list[] = file.listFiles(); 
     Toast.makeText(getApplicationContext(), 
     "Yes sdcard is mounted,file count " + list.length, 
     Toast.LENGTH_LONG).show(); 

    } catch (NullPointerException o) { 
     Toast.makeText(getApplicationContext(), 
     "Sorry no sdcard is mounted:", Toast.LENGTH_LONG).show(); 
    } 

任何建議表示讚賞!

+0

很抱歉,但沒有檢查micro SD卡沒有可靠的方法存在於您的設備中。最好的選擇是檢查getExternalFilesDirs()。如果你有兩個地點,第二個地點主要在卡上。 – greenapps

+0

'選擇一個存儲以保存應用程序下載。「但是爲什麼應該在微型SD卡上。你可以爲它使用外部存儲。爲什麼用戶應該選擇開始? – greenapps

+0

用戶將能夠下載60MB - 2GB範圍內的視頻文件,因此我需要爲用戶在低內部運行時提供SD卡選項。 – SMagic

回答

1

您應該使用getExternalFilesDirs方法。此方法將路徑返回到內部存儲器& Micro SD卡(如果存在)。第二個返回路徑將是Micro SD卡的路徑。但該路徑可能不是Micro SD卡的根目錄

getExternalFilesDirs在API級別19中引入的是唯一的官方方法,可以用來獲取SD卡路徑。所有其他方法將返回內部存儲器的公共或私有存儲位置(路徑)。

我已經在我的手機&模擬器上測試了這種方法。請注意,在測試期間,我已通過null作爲getExternalFilesDirs的參數。但是您也可以傳遞參數Environment.DIRECTORY_PICTURES,Environment.DIRECTORY_MOVIES等。

測試結果: -

我的手機已插入存儲卡,getExternalFilesDirs返回:

第1條路徑(內存):/storage/emulated/0/Android/data/my_package.appname/files

第二路(微型SD): /storage/sdcard1/Android/data/my_package.appname/files

注: r我的SD卡的OOT目錄是:/storage/sdcard1

在我的模擬器,getExternalFilesDirs返回:

第1條路徑(內存):/storage/emulated/0/Android/data/my_package.appname/files

第二路(微型SD):/storage/11E9-4214/Android/data/my_package.appname/files

注意:在模擬器上,模擬SD卡(不是真實的)。

如果微型SD卡被彈出(或者在電話或仿真器)getExternalFilesDirs返回null

第一路徑(內部存儲器):path to internal memory - It varies depending on device

第二路徑(微型SD):null

但是;

在某些設備上,可能無法獲取Micro SD卡路徑。這意味着getExternalFilesDirs將只返回一個路徑(內部存儲器)。第二條路徑將是空的,即它不會返回任何第二條路徑。

原因:該特定設備的OEM可能未在設備中設置路徑(即SECONDARY_STORAGE環境變量)。

This answerthis question說,

這裏提到的OEM必須設置SECONDARY_STORAGE環境變量 設備特定init.rc文件: https://source.android.com/devices/storage/config-example.html

而且註釋通過somesh製造上述answer說,

如果未設置該環境變量,則無法使用getExternalFilesDirs寫入SD卡 ,因爲它不會返回 sdcard路徑。

在這種情況下,假設存儲卡不存在並保存您想要保存在內存中的任何內容。

總結,如果getExternalFilesDirs不返回第二個路徑或返回第二條路徑是null,不要在SD卡存儲(內部存儲器中存儲);在第二條路徑別的店由返回getExternalFilesDirs

建議:

要了解有關Android的不同的存儲位置,請通過my answer on stackoverflow

+1

感謝您的答覆和關閉的努力。 – SMagic

1

Android沒有公開任何允許您獲取sdcard根路徑的API。您可以使用反射並從StorageManager.java獲取sdcard根路徑 - > getVolumePaths() - http://androidxref.com/5.1.1_r6/xref/frameworks/base/core/java/android/os/storage/StorageManager.java#590

您不能任意保存到SD卡上的任何位置。您可以使用從getExternalFilesDirs返回的某個路徑,也可以使用SAF(存儲訪問框架)明確請求用戶寫入SD卡的權限。 How to use the new SD card access API presented for Android 5.0 (Lollipop)?