android4.4(api級別19)引入了儲存訪問框架(saf).saf其中的部分功能就是通過其獲取對外置sd卡的讀寫許可權,從而操作外接sd卡.原文介紹連線,這裡不對其進行複製貼上,本帖直接講述如何通過documentfile在獲得saf的後,在外置sd卡中讀寫資料.
android 4.4提供了複雜的許可權獲取步驟,在android7.0時進行了簡化.
storagemanager sm = (storagemanager) getsystemservice(context.storage_service);
listvolume = sm.getstoragevolumes();
int size = volume.size();
log.i(tag, "size: " + size);
for (int i = 1; i < size; i++)
上面的**volume會返回內部儲存和外部sd卡(我們所需要操作的卡,包括華為的nm卡),
使用storagemanager
類獲取適當的storagevolume
例項。然後,通過呼叫該例項的storagevolume.createaccessintent()
方法建立乙個 intent。使用此 intent 訪問外部儲存目錄。要獲取所有可用卷的列表,包括可移動介質卷,請使用storagemanager.getstoragevolumes()
。
如果您有關於特定檔案的資訊,請使用storagemanager.getstoragevolume(file)
獲取包含該檔案的storagevolume
。呼叫此storagevolume
上的createaccessintent()
以訪問檔案的外部儲存目錄。
在次要卷(例如外部 sd 卡)上,呼叫createaccessintent()
以請求訪問整個卷而不是特定目錄時將傳入「null」。如果您向主要卷傳入「null」,或者如果您傳入無效的目錄名,createaccessintent()
將返回「null」。createaccessintent()也可以傳入多種**型別,包括電影,,文件,**等.
parameters
directoryname
string
: must be one ofenvironment.directory_music
,environment.directory_podcasts
,environment.directory_ringtones
,environment.directory_alarms
,environment.directory_notifications
,environment.directory_pictures
,environment.directory_movies
,environment.directory_downloads
,environment.directory_dcim
, orenvironment.directory_documents
, ornull
to request access to the entire volume.
許可權的請求在fragment或者activity中發起,在onactivityresult中intent.getdate()獲得許可權uri引數.當然過程中會彈出乙個詢問框,當使用者同意後我們才能得到許可權uri,有了這個uri我們就可以操作外接sd卡了.為了不重複的要求使用者給予訪問許可權,在使用者授予訪問許可權後,呼叫getcontentresolver()
,在返回contentresolver
後,使用目錄訪問 uri 呼叫takepersistableuripermission()
,且不會向使用者顯示確認 ui。
uri = resultdata.getdata();
final int takeflags = resultdata.getflags()
& (intent.flag_grant_read_uri_permission
| intent.flag_grant_write_uri_permission);
// check for the freshest data.
getcontentresolver().takepersistableuripermission(uri, takeflags);
我們也可以將獲得的uri儲存起來,方便再次使用.
preferencemanager.getdefaultsharedpreferences(this).edit().putstring(pref_default_uri, uri.tostring()).commit();
最後一點,獲取外接sd卡的路徑在各個機型上可能還不同,我的測試機是華為mate8(sd卡),mate20pro(nm卡). Android開發中如何獲取外接TF卡的路徑
android獲取外部sdcard的官方呼叫是 environment.getexternalstoragedirectory 但是根據不同機型,是有不同的結果的。如果手機支援tf卡擴充套件,並且本身沒有大容量儲存,比如說htc老款手機 g3之類的,那麼獲取到的是tf卡的路徑。這是對的。如果手機本身...
android監聽TF卡插拔事件 判斷
如何通過註冊廣播獲知tf插拔事件 註冊廣播 intentfilter filter new intentfilter filter.addaction intent.action media eject filter.addaction intent.action media mounted fil...
android 獲取外接sd卡根目錄
android獲取外部sdcard的官方呼叫是 environment.getexternalstoragedirectory 但是根據不同機型,是有不同的結果的。通過 android 的api可以獲取系統內建的sdcard存貯目錄,但是有些機器本身具有內建的sdcard存貯卡又可以外接sd卡,這樣...