前言 對(duì)于 Android 7.0,提供了非常多的變化,不過(guò)和我們開(kāi)發(fā)者關(guān)聯(lián)最大的,或者說(shuō)必須要適配的就是去除項(xiàng)目中傳遞 對(duì)于面向 Android 7.0 的應(yīng)用,Android 框架執(zhí)行的 StrictMode API 政策禁止在應(yīng)用外部公開(kāi) 要應(yīng)用間共享文件,您應(yīng)發(fā)送一項(xiàng) FileProvider 實(shí)際上是 ContentProvider 的一個(gè)子類,它的作用也比較明顯, Provider 使用詳解 1、定義 FileProvider我們先在 為什么要申明呢?當(dāng)然是因?yàn)?FileProvider 是 ContentProvider 的子類啊。 2、指定可分享的文件路徑FileProvider 只能為指定的目錄中的文件生成內(nèi)容 URI。要指定目錄,就必須使用 我們先創(chuàng)建一個(gè)名為 在
在
每個(gè)節(jié)點(diǎn)都使用兩個(gè)屬性:
<external-path name="external" path="pics"/> 代表的目錄即為: 當(dāng)這么聲明以后,代碼可以使用你所聲明的當(dāng)前文件夾以及其子文件夾
我們剛才說(shuō)了,現(xiàn)在要使用 所以,需要一個(gè)虛擬的路徑對(duì)文件路徑進(jìn)行映射,所以需要編寫(xiě)個(gè) 寫(xiě)好 3、使用 FileProvider 生成內(nèi)容 URI配置工作已經(jīng)全部完成了,后面就需要將之前傳遞的 可以看到 調(diào)用這個(gè)方法會(huì)自動(dòng)得到一個(gè) 4、給 Uri 授予臨時(shí)權(quán)限當(dāng)我們生成一個(gè) 這個(gè)授權(quán)的動(dòng)作,提供了兩種方式來(lái)授權(quán): ① 通過(guò) Context 的 grantUriPermission() 方法授權(quán) Context 提供了兩個(gè)方法
可以看到 grantUriPermission() 方法需要傳遞一個(gè)包名,就是你給哪個(gè)應(yīng)用授權(quán),但是很多時(shí)候,比如分享,我們并不知道最終用戶會(huì)選擇哪個(gè) app,所以我們可以這樣: 根據(jù) Intent 查詢出所有符合的應(yīng)用,都給他們授權(quán),然后在不需要的時(shí)候通過(guò) revokeUriPermission 移除權(quán)限。 ② 配合 Intent.addFlags() 授權(quán) 既然這是一個(gè) Intent 的 Flag,Intent 也提供了另外一種比較方便的授權(quán)方式,那就是使用 使用這種形式的授權(quán),權(quán)限截止于該 App 所處的堆棧被銷毀。也就是說(shuō),一旦授權(quán),知道該 App 被完全退出,這段時(shí)間內(nèi),該 App 享有對(duì)此 Uri 指向的文件的對(duì)應(yīng)權(quán)限,我們無(wú)法主動(dòng)收回該權(quán)限了。 總結(jié) Android 7.0 禁止在應(yīng)用外部公開(kāi) 當(dāng)我們生成一個(gè) 參考
與之相關(guān) 日 更 精 彩 微信號(hào):code-xiaosheng 公眾號(hào) 「code小生」 |
|
來(lái)自: codingSmart > 《待分類》