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 是存在但是沒有被安裝
如:
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卡狀态