Android對於外接TF卡的讀寫操作(許可權獲取)

2021-09-23 05:45:50 字數 2571 閱讀 7224

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, ornullto 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卡,這樣...