1. 程式人生 > >Android 檢測SD卡應用

Android 檢測SD卡應用

if (Environment.getExternalStorageState().equals(  
Environment.MEDIA_MOUNTED)) {
// sd card 可用

}else {
// 當前不可用
}



Environment.MEDIA_MOUNTED // sd卡在手機上正常使用狀態
Environment.MEDIA_UNMOUNTED // 使用者手工到手機設定中解除安裝sd卡之後的狀態
Environment.MEDIA_REMOVED // 使用者手動解除安裝,然後將sd卡從手機取出之後的狀態
Environment.MEDIA_BAD_REMOVAL // 使用者未到手機設定中手動解除安裝sd卡,直接撥出之後的狀態
Environment.MEDIA_SHARED // 手機直接連線到電腦作為u盤使用之後的狀態
Environment.MEDIA_CHECKINGS // 手機正在掃描sd卡過程中的狀態

在做android開發對sd操作時,最好是sd卡處於Environment.MEDIA_MOUNTED狀態時,對sd卡上的檔案進行操作,其他狀態不宜進行操作。


對SD卡狀態監聽,到現在為止我知道的有兩種方式:
1.註冊StorageEventListener來監聽sd卡狀態
StorageEventListener中有onStorageStateChanged()方法,當sd卡狀態改變時,此方法會呼叫,對各狀態的判斷一般會用到Environment類,此類中包含的有關sd卡狀態的常量有:
MEDIA_BAD_REMOVAL:表明SDCard 被解除安裝前己被移除
MEDIA_CHECKING:表明物件正在磁碟檢查
MEDIA_MOUNTED:表明sd物件是存在並具有讀/寫許可權
MEDIA_MOUNTED_READ_ONLY:表明物件許可權為只讀
MEDIA_NOFS:表明物件為空白或正在使用不受支援的檔案系統
MEDIA_REMOVED:如果不存在 SDCard 返回
MEDIA_SHARED:如果 SDCard 未安裝 ,並通過 USB 大容量儲存共享 返回
MEDIA_UNMOUNTABLE:返回 SDCard 不可被安裝 如果 SDCard 是存在但不可以被安裝
MEDIA_UNMOUNTED:返回 SDCard 已卸掉如果 SDCard 是存在但是沒有被安裝
如:
public void onStorageStateChanged(String path, String oldState, String newState) {           
if (newState.equals(Environment.MEDIA_SHARED)) {
//大容量儲存時相關操作
} else if (newState.equals(Environment.MEDIA_CHECKING)) {
//檢查sd卡時操作
} else if (newState.equals(Environment.MEDIA_MOUNTED)) {
//sd在手機上可用時操作
}...
}


StorageEventListener中還有onUsbMassStorageConnectionChanged()用來監聽大容量儲存是否連線,我對這個方法不太瞭解,原來以為用來監聽usb線是否拔出的,可實際在linux上好像沒什麼問題,但在windows上卻無法用來監聽usb拔出狀態,也不知道是驅動有問題還是我用錯了,期待高手解答。

2.通過接收Intent來監聽sd卡狀態
sd卡狀態改變時,MountServices會發送Intent,可以通過接收Intent來得到sd卡狀態,Intent中關於sd卡狀態的action有:
MEDIA_BAD_REMOVAL_ACTION:sd卡已經從sd卡插槽拔出,但是掛載點還沒解除
MEDIA_EJECT_ACTION:使用者想要移除sd卡
MEDIA_MOUNTED_ACTION:sd卡被插入,且已經掛載
MEDIA_REMOVED_ACTION:sd卡被移除
MEDIA_SHARED_ACTION:sd卡作為 USB 大容量儲存被共享,掛載被解除
MEDIA_UNMOUNTED_ACTION:sd卡存在,但還沒有掛載
MEDIA_SCANNER_STARTED_ACTION:開始掃描
MEDIA_SCANNER_FINISHED_ACTION:掃描完成


如果只是獲取當前sd卡狀態,不需要對其監聽,可以用方法Environment.getExternalStorageState()獲得當前sd卡狀態