我們是以dv6300-t的平台來做測試的,發現有2種方式來檢測android中external media(包括sd卡,usb)的狀態。
一種是使用storagelistener監聽,還有一種是使用廣播的方式。
相關的類主要有:
recorddevicemanager devicestatelistener choicerecorddevice
主要採用了觀察者模式對裝置拔插的監控來觸發各種不同情況:
比如在dtvlauncher中就增加了觀察者mrecorddevicelistener,在檢測到裝置拔出時候會停止時移或錄製等。
第一種監測方式:
使用storagemanager imountservice storageeventlistener等類來控制(可以參考dv6300-t的原始碼):
storagemanager mstoragemanager = (storagemanager)context.getsystemservic(context.storage_service);
mstoragemanager.registerlistener(mstoragelistener);
imountservice mmountservice = imountservice.stub.asinte***ce(servicemanager.getservice("mount"));
storageeventlistener mstoragelistener = new storageeventlistener()
}}};
我們可以根據onstoragestatechanged方法中的3個引數來判斷當前的狀態,根據path路徑來判斷是sd卡(/mnt/sdcard)還是usb裝置(/mnt/sda)。
比如在dv6300-t上,我們列印如下:
插sd卡:
會呼叫3次onstoragestatechanged:引數分別是:
/mnt/sdcard/extend_sd : removed--->unmounted
/mnt/sdcard/extend_sd : unmounted--->checking
/mnt/sdcard/extend_sd : checking--->mounted
插u盤:
/mnt/sda1 :unmounted--->checking
/mnt/sda1 :checking--->mounted
拔sd卡:
/mnt/sdcard/extend_sd : mounted--->unmounted
/mnt/sdcard/extend_sd : unmounted--->removed
拔u盤:
/mnt/sda1 :mounted--->unmounted
/mnt/sda1 :unmounted--->removed
/mnt/sda1 :removed--->unmounted
第2種監測方式(廣播方式):
class usbreceiver
};intentfilter filter = new intentfilter();
filter.addaction(intent.action_media_shared);//如果sdcard未安裝,並通過usb大容量儲存共享返回
filter.addaction(intent.action_media_mounted);//表明sd物件是存在並具有讀/寫許可權
filter.addaction(intent.action_media_unmounted);//sdcard已卸掉,如果sdcard是存在但沒有被安裝
filter.addaction(intent.action_media_checking); //表明物件正在磁碟檢查
filter.addaction(intent.action_media_eject); //物理的拔出 sdcard
filter.addaction(intent.action_media_removed); //完全拔出
filter.adddatascheme("file"); // 必須要有此行,否則無法收到廣播
context.registerreceiver(mreceiver, filter); }}
通過廣播傳遞過來的intent.getdata()會得到乙個uri,然後uri.getpath()就是插上usb的路徑,可以記錄下每次插上或者拔出的usb的路徑,
比如我們在dv6300平台上:
u盤就返回/mnt/sda1,而sd卡返回/mnt/sdcard/extend_sd
而getaction會獲取當前狀態,如下描述:
u盤插入:
intent.getaction() == android.intent.action.media_unmounted
intent.getaction() == android.intent.action.media_checking
intent.getaction() == android.intent.action.media_mounted
u盤拔出:
intent.getaction() == android.intent.action.media_eject
intent.getaction() == android.intent.action.media_unmounted
intent.getaction() == android.intent.action.media_unmounted
intent.getaction() == android.intent.action.media_removed
intent.getaction() == android.intent.action.media_unmounted
sd卡插入:
intent.getaction() == android.intent.action.media_unmounted
intent.getaction() == android.intent.action.media_checking
intent.getaction() == android.intent.action.media_mounted
sd卡拔出:
intent.getaction() == android.intent.action.media_eject
intent.getaction() == android.intent.action.media_unmounted
intent.getaction() == android.intent.action.media_unmounted
intent.getaction() == android.intent.action.media_removed
android 監控usb插拔
android 框架層為imountservice 增加新介面
android usb掛載分析---mountservice啟動
android深入淺出之binder機制
android 2.3 sd卡掛載流程**(七)
U盤 SD卡掛載
說明 u盤和sd卡大部分操作上是一樣的,因此下面將用u盤進行說明,如無特別說明在u盤上的操作在sd卡上同樣有效 u盤和sd卡里的檔案系統比較常用的是fat32 這裡也是基於fat32來說明的 掛載 掛載前首先要保證u盤已經被系統識別到了。被識別到了後在 dev下會有節點顯示,需要注意的是u盤的節點和...
android 關於讀取SD卡或者U盤的一些方法
最近做的專案牽涉到讀取裝置外接sd卡,據說不同裝置外接sd卡路徑是不一樣的,這跟各家晶元廠商寫底層的程式設計師有關,不同廠家或者不同程式設計師,路徑搞的就不一樣了 所以查了寫資料,稍微整理下 然後還有usb裝置,據說也是這種情況。我們常用的讀取sd卡方法,也是預設讀取裝置內建的sd卡方法,如 獲得s...
Android寫SD卡或者U盤不成功問題
用fileoutputsteam寫u盤或者sd卡,寫完立即拔出u盤會發現有時候寫操作不成功,這是因為在寫u盤或者sd卡的時候,系統會通過另外乙個程序去把資料sync到u盤上,如果檔案較大,需要的時間比較多,如果這時候拔出u盤,就會出現資料未寫完全的問題,所以在fileoutputsteam clos...