Android儲存裝置 U盤,SD卡 狀態監測

2021-06-08 00:34:09 字數 3516 閱讀 6176

我們是以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...