Android 9 0 sdCard檔案讀寫

2021-09-11 06:01:29 字數 2307 閱讀 3902

目錄

背景描述:

解決方案:

處理過程中遇到的問題(**中需要替換的點)

結尾:9.0之後,google合入一筆patch,去掉了write_media_storage許可權中的sdcard_rw。導致之前的檔案讀寫方式無法對sdcard生效

documentfile

//申請目錄許可權

private void getsdcardpermission()

}} catch (exception e)

if (!canfindpath)

if (storagevolume!=null&&canfindpath)

}//請求成功之後,許可權持久化

getcontentresolver().takepersistableuripermission(uriforpermissionpath,

intent.flag_grant_read_uri_permission | intent.flag_grant_write_uri_permission);

//持久化之後的許可權可以通過下面方法獲取所有已經獲得授權的uripermission

listpersisteduripermissions = context.getcontentresolver().getpersisteduripermissions();

//獲取授權的uri

uri uri = persisteduripermissions.get(0).geturi();

//根據uri獲取documentfile物件

documentfile documentfile= documentfile.fromtreeuri(context, parenturi);

//建立目錄或者檔案

//獲取許可權路徑之後的未知目錄結構 /100media/video0001_01.mp4.hyperlapse

string replace = outpath.replace(permissionpath, "");

//迴圈取得各層級目錄名,判斷是否存在並建立

string split = replace.split(file.separator);

for (int i = 0; i 1、許可權獲取方式

2、檔案/目錄的建立、刪除、重新命名方式

3、其他檔案相關的類的初始化或者方法呼叫,不能直接傳入path,需要改為filedescriptor。

3.1、mediamuxer(@nonnull filedescriptor fd, @format int format)//初始化時使用filedescriptor

3.2、randomaccessfile raf = new randomaccessfile(ori, "rws");//不支援,無法初始化randomaccessfile

//*****open file channel to read byte

filechannel fc = raf.getchannel();

3.3、mediaextractor extractor = new mediaextractor();

extractor.setdatasource(filedescriptor fd);//setdatasource方法需要傳入filedescriptor

3.4、mediametadataretriever retriever = new mediametadataretriever();

if (!inextstorage)else

3.5、moviecreator.build(filechannel in);//入參的獲取方式需要通過documentfile,不能直接通過路徑

in = new fileinputstream(filepath).getchannel();

documentfile documentfilebypath = fileutils.getdocumentfilebypath(filepath);

pfd = context.getcontentresolver().openfiledescriptor(documentfilebypath.geturi(), "rw");

in = new fileinputstream(pfd.getfiledescriptor()).getchannel();

3.6、writablebytechannel fc = null;//獲取方式不能通過path,類似與3.5

3.5和3.6:都屬於fileinputstream、fileoutputstream、filedescriptor、filechannel的獲取方式

以上是目前的進展,簡單的做乙個總結. 

9 0SDCard檔案訪問許可權 二

接上篇 上篇提到了9.0之後,sdcard的解決方案 但 documentfile.findfile split i findfile方法耗時巨長,此方法檔案越多耗時越長。大概1000個檔案,findfile需要花費5s以上。那麼,我們刪除乙個檔案就需要漫長的等待過程。file file4 new ...

android 讀寫檔案 包括從sdcard中

1 從應用程式目錄中讀取檔案 不需要特殊許可權 檔案被儲存到了 data data 報名 files 下。public static void rememberinfo context context,string username,string passwd catch ioexception e...

Android私有目錄和sdcard卡獲取

通常我們所說的android私有目錄就是指 data data 包名,當然,我們也可以直接這樣寫來獲取私有目錄,但是這樣感覺很low,不妨試試這種方法。我們可以使用context物件來進行獲取,context.getfilesdir.getpath 這樣我們獲取到的路徑就是 data data 包名...