【移動(dòng)應(yīng)用開(kāi)發(fā)技術(shù)】基于Android FileProvider 屬性配置詳解及FileProvider多節(jié)點(diǎn)問(wèn)題_第1頁(yè)
【移動(dòng)應(yīng)用開(kāi)發(fā)技術(shù)】基于Android FileProvider 屬性配置詳解及FileProvider多節(jié)點(diǎn)問(wèn)題_第2頁(yè)
【移動(dòng)應(yīng)用開(kāi)發(fā)技術(shù)】基于Android FileProvider 屬性配置詳解及FileProvider多節(jié)點(diǎn)問(wèn)題_第3頁(yè)
【移動(dòng)應(yīng)用開(kāi)發(fā)技術(shù)】基于Android FileProvider 屬性配置詳解及FileProvider多節(jié)點(diǎn)問(wèn)題_第4頁(yè)
免費(fèi)預(yù)覽已結(jié)束,剩余1頁(yè)可下載查看

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

【移動(dòng)應(yīng)用開(kāi)發(fā)技術(shù)】基于AndroidFileProvider屬性配置詳解及FileProvider多節(jié)點(diǎn)問(wèn)題

眾所周知在android7.0,修改了對(duì)私有存儲(chǔ)的限制,導(dǎo)致在獲取資源的時(shí)候,不能通過(guò)Uri.fromFile來(lái)獲取uri了我們需要適配7.0+的機(jī)型需要這樣寫(xiě):1:代碼適配2:創(chuàng)建provider_paths.xml其中provider_path屬性詳解name和pathname:uri路徑片段。為了執(zhí)行安全,這個(gè)值隱藏你所共享的子目錄名。此值的子目錄名包含在路徑屬性中。path:你所共享的子目錄。雖然name屬性是一個(gè)URI路徑片段,但是path是一個(gè)真實(shí)的子目錄名。注意,path是一個(gè)子目錄,而不是單個(gè)文件或者多個(gè)文件。1.files-path代表與Context.getFileDir()相同的文件路徑2.cache-path

<cache-pathname="name"path="path"/>

<cache-pathname="name"path="path"/>代表與getCacheDir()相同的文件路徑3.external-path

<external-pathname="name"path="path"/>

<external-pathname="name"path="path"/>代表與Environment.getExternalStorageDirectory()相同的文件路徑4.external-files-path

<external-files-pathname="name"path="path"/>

<external-files-pathname="name"path="path"/>

代表與Context#getExternalFilesDir(String)和Context.getExternalFilesDir(null)相同的文件路徑5.external-cache-path

<external-cache-pathname="name"path="path"/>

<external-cache-pathname="name"path="path"/>代表與Context.getExternalCacheDir()相同的文件路徑6:配置AndroidManifest.xmlandroid:authorities在FileProvider中使用7:使用FileProvider8.自定義FileProvider

classMyFileProviderextendsFileProvider{}

classMyFileProviderextendsFileProvider{}AndroidMenifest.xml中配置android:authorities即可3:我們項(xiàng)目中可能會(huì)用到其他一些第三方sdk有用到拍照功能的話,他也為了適配android7.0也添加了這個(gè)節(jié)點(diǎn),此時(shí)有些人可能就不知道如何下手了,其實(shí)很簡(jiǎn)單我們只要重寫(xiě)一個(gè)類(lèi)繼承自FileProvider,然后就按上述方法在添加一個(gè)節(jié)點(diǎn)就可以了:如果你不想自定義FileProvider,那么還有一種方法,那就是把第三方sdk中的路徑配置copy到provider_paths.xml即可。如下所示:注意??:在使用provider時(shí)配置路徑path="."代表所有路徑生成ContentURI在Android7.0出現(xiàn)之前,我們通常使用Uri.fromFile()方法生成一個(gè)FileURI。這里,我們需要使用FileProvider類(lèi)提供的公有靜態(tài)方法getUriForFile生成ContentURI。比如:

UricontentUri=FileProvider.getUriForFile(this,

BuildConfig.APPLICATION_ID+".fileProvider",myFile);

UricontentUri=FileProvider.getUriForFile(this,

BuildConfig.APPLICATION_ID+".fileProvider",myFile);

需要傳遞三個(gè)參數(shù)。第二個(gè)參數(shù)便是Manifest文件中注冊(cè)FileProvider時(shí)設(shè)置的authorities屬性值,第三個(gè)參數(shù)為要共享的文件,并且這個(gè)文件一定位于第二步我們?cè)趐ath文件中添加的子目錄里面。舉個(gè)例子:生成的ContentURI是這樣的:

content://com.yifeng.samples.myprovider/my_images/1493715330339.jpg

content://com.yifeng.samples.myprovider/my_images/1493715330339.jpg其中,構(gòu)成URI的host部分為<provider>元素的authorities屬性值(applicationId+customname),path片段my_images為res/xml文件中指定的子目錄別名(真實(shí)目錄名為:images)。第四步,授予ContentURI訪問(wèn)權(quán)限生成ContentURI對(duì)象后,需要對(duì)其授權(quán)訪問(wèn)權(quán)限。授權(quán)方式有兩種:第一種方式,使用Context提供的grantUriPermission(package,Uri,mode_flags)方法向其他應(yīng)用授權(quán)訪問(wèn)URI對(duì)象。三個(gè)參數(shù)分別表示授權(quán)訪問(wèn)URI對(duì)象的其他應(yīng)用包名,授權(quán)訪問(wèn)的Uri對(duì)象,和授權(quán)類(lèi)型。其中,授權(quán)類(lèi)型為Intent類(lèi)提供的讀寫(xiě)類(lèi)型常量:

FLAG_GRANT_READ_URI_PERMISSION

FLAG_GRANT_WRITE_URI_PERMISSION

FLAG_GRANT_READ_URI_PERMISSIONFLAG_GRANT_WRITE_URI_PERMISSION或者二者同時(shí)授權(quán)。這種形式的授權(quán)方式,權(quán)限有效期截止至發(fā)生設(shè)備重啟或者手動(dòng)調(diào)用revokeUriPermission()方法撤銷(xiāo)授權(quán)時(shí)。第二種方式,配合Intent使用。通過(guò)setData()方法向intent對(duì)象添加ContentURI。然后使用setFlags()或者addFlags()方法設(shè)置讀寫(xiě)權(quán)限,可選常量值同上。這種形式的授權(quán)方式,權(quán)限有效期截止至其它應(yīng)用所處的堆棧銷(xiāo)毀,并且一旦授權(quán)給某一個(gè)組件后,該應(yīng)用的其它組件擁有相同的訪問(wèn)權(quán)限。第五步,提供ContentURI給其它應(yīng)用擁有授予權(quán)限的ContentURI后,便可以通過(guò)startActivity()或者setResult()方法啟動(dòng)其他應(yīng)用并傳遞授權(quán)過(guò)的ContentURI數(shù)據(jù)。當(dāng)然,也有其他方式提供服務(wù)。如果你需要一次性傳遞多個(gè)URI對(duì)象,可以使用intent對(duì)象提供的setClipData()方法,并且setFlags()方法設(shè)置的權(quán)限適用于所有ContentURIs。常見(jiàn)使用場(chǎng)景前面介紹的內(nèi)容都是理論部分,在開(kāi)發(fā)者官方FileProvider部分都有所介紹。接下來(lái)我們看看,實(shí)際開(kāi)發(fā)一款應(yīng)用的過(guò)程中,會(huì)經(jīng)常遇見(jiàn)哪些FileProvider的使用場(chǎng)景。自動(dòng)安裝文件版本更新完成時(shí)打開(kāi)新版本apk文件實(shí)現(xiàn)自動(dòng)安裝的功能,應(yīng)該是最常見(jiàn)的使用場(chǎng)景,也是每個(gè)應(yīng)用必備功能之一。常見(jiàn)操作為,通知欄顯示下載新版本完畢,用戶(hù)點(diǎn)擊或者監(jiān)聽(tīng)下載過(guò)程自動(dòng)打開(kāi)新版本apk文件。適配Android7.0版本之前,我們代碼可能是這樣:現(xiàn)在為了適配7.0及以上版本的系統(tǒng),必須使用ContentURI代替FileURI。在

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論