目錄
背景描述:
解決方案:
處理過程中遇到的問題(**中需要替換的點)
結尾: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 包名...