精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

我想把 FileProvider 聊的更透徹一些

開發 開發工具
從 Android N(7.0) 開始,將嚴格執行 StrictMode 模式,也就是說,將對安全做更嚴格的校驗。而從 Android N 開始,將不允許在 App 間,使用 file:// 的方式,傳遞一個 File ,否者會拋出 FileUriExposedException 的錯誤,會直接引發 Crash。

 一、前言

從 Android N(7.0) 開始,將嚴格執行 StrictMode 模式,也就是說,將對安全做更嚴格的校驗。而從 Android N 開始,將不允許在 App 間,使用 file:// 的方式,傳遞一個 File ,否者會拋出 FileUriExposedException 的錯誤,會直接引發 Crash。

但是,既然官方對文件的分享做了一個這么強硬的修改(直接拋出異常),實際上也提供了解決方案,那就是 FileProvider,通過 comtent:// 的模式替換掉 file:// ,同時,需要開發者主動升級 targetSdkVersion 到 24 才會執行此策略,也留給了開發者升級的時間。

本文就 FileProvider 需要了解的所有細節,進行一個詳盡的說明。

二、如何使用 FileProvider

1、什么是 FileProvider

FileProvider 是 Android support v4 包下,提供的一個 ContentProvider 的子類,用于向其他 App 分享文件,并且是在 v4 包下,所以只要引入了 v4 包,就可以做到全版本兼容。

既然 FileProvider 本質上就是一個 ContentProvider ,它其實也繼承了 ContentProvider 的特性。ContentProvider 其實就是在可控的范圍內,向外部其他的 App 分享數據。而 FileProvider 將這樣的數據變成了一個 File 文件而已。

2、在什么場景下需要使用 FileProvider

在 App 間對 file:// 的分享做了嚴格的校驗之后,其實也是出于安全考慮,這就導致了,所有包含 file:// 的URI 的 Intent 離開你的 App ,都受此限制。所以說,只要你的 App 內,通過一個 Intent 傳遞了一個 file:// 的 Uri ,就需要小心使用了。

在實際開發過程中,使用最多的場景有一下幾個:

  • 調用相機拍照。
  • 剪裁圖片。
  • 調用系統安裝器去安裝 Apk。

3、如何使用 FileProvider

1)在 AndroidManifest 中配置

前面提到,FileProvider 實際上是一個 ContentProvider ,所以如果需要使用它,就需要在 AndroidManifest.xml 中聲明它。

可以看到,provider 標簽下,配置了幾個屬性:

  • name :配置當前 FileProvider 的實現類。
  • authorities:配置一個 FileProvider 的名字,它在當前系統內需要是唯一值。
  • exported:表示該 FileProvider 是否需要公開出去,這里不需要,所以是 false。
  • granUriPermissions:是否允許授權文件的臨時訪問權限。這里需要,所以是 true。

可以看到 name 屬性就是標記當前 FileProvider 的實現類,對于一個 App Module 而言,如果只是自己使用,可以直接使用 v4 包下的 FileProvider ,但是如果是作為一個 Lib Module 來供其他項目使用,最好還是重新空繼承一個 FileProvider ,這里填寫我們的繼承類即可。

2) 指定可分享的文件路徑

在配置 Provider 的時候,還需要額外配置一個 <meta-data/> 標簽,它用于配置 FileProvider 支持分享出去的目錄。這個 <meta-data/> 標簽的 name 值是固定的,resource 需要指向一個 根節點為 paths 的 xml 資源文件。

然后就可以對 provider_paths.xml 進行配置。

paths 標簽內,必須配置最少一個 xxx-path 標簽,上圖給出的例子,配置的是 files-path 這些配置的信息,都是可以在官方文檔中找到答案的,這里直接以查閱源碼的方式來查看他們分別代表的意思。

這些配置,在 FileProvider 的源碼內,都是以一個個 TAG_Xxx 標記的。

而他們分別代表的目錄,也可以在源碼內找到答案。

可以看到,不同的標簽,代表不同的目錄。

  • root-path:表示根目錄,『/』。
  • files-path:表示 content.getFileDir() 獲取到的目錄。
  • cache-path:表示 content.getCacheDir() 獲取到的目錄
  • external-path:表示Environment.getExternalStorageDirectory() 指向的目錄。
  • external-files-path:表示 ContextCompat.getExternalFilesDirs() 獲取到的目錄。
  • external-cache-path:表示 ContextCompat.getExternalCacheDirs() 獲取到的目錄。

注意,這里 ContextCompat 只是對 Context 做了一個兼容處理,其實就是對 Api level 19 做了一個分解,分別代表不同的獲取方式,以 getExternalFilesDirs() 為例。

3) 使用 content://

配置工作已經全部完成,后面就需要將之前傳遞的 file:// 替換成 FileProvider 需要的 content:// ,這就需要用到 FileProvider.getUriForFile() 方法了,以下是它的完整簽名。

getUriForFile() 方法,需要一個 authority 的參數,這正是前面在 AndroidManifest.xml 中 配置的 android:authorities 。

調用此方法,會自動得到一個 file:// 轉換成 content:// 的 一個 Uri 對象,可以供我們直接使用。

4) 授予臨時的讀寫權限

在配置 provider 標簽的時候,有一個屬性 android:grantUriPermissions="true" ,它表示允許它授予 Uri 臨時的權限。

當我們生成出一個 content:// 的 Uri 對象之后,其實也無法對其直接使用,還需要對這個 Uri 接收的 App 賦予對應的權限才可以。

授權類型的常量,被定義在 Intent 類中。

可以看到,直接就是讀和寫的權限授予。

而這個授權的動作,提供了兩種方式來授權:

1、使用 Context.grantUriPermission() 為其他 App 授予 Uri 對象的訪問權限。

它的完整簽名如下:

grantUriPermission() 方法包含三個參數,這三個參數都非常的好理解。

  • toPackage :表示授予權限的 App 的包名。
  • uri:授予權限的 content:// 的 Uri。
  • modeFlags:前面提到的讀寫權限。

這種情況下,授權的有效期限,從授權一刻開始,截止于設備重啟或者手動調用 Context.revokeUriPermission() 方法,才會收回對此 Uri 的授權。

2、配合 Intent.addFlags() 授權。

既然這是一個 Intent 的 Flag,Intent 也提供了另外一種比較方便的授權方式,那就是使用 Intent.setFlags() 或者 Intent.addFlag 的方式。

這種方式相信大家都比較熟悉,就不細說了。而使用這種形式的授權,權限截止于該 App 所處的堆棧被銷毀。也就是說,一旦授權,直到該 App 被完全退出,這段時間內,該 App 享有對此 Uri 指向的文件的對應權限,我們無法再主動收回此權限了。

雖然使用 Intent.addFlags() 的方式,一旦授權將無法主動回收,但是大多數情況下,也是會使用此種方式進行授權,除了操作起來方便之外,既然授權了也無需太擔心對方會有破壞的行為。有點切合 用人不疑,疑人不用 的道理。

擁有了授權權限的 content:// 的 Uri 之后,就可以通過 startXxx 或者 setResult() 的方式,將 Uri 傳遞給其他的 App。

5)舉個例子

到這里,基本上關于 FileProvider 的使用,都做了一個詳盡的說明,接下來舉個簡單的例子來看看如何使用它。

調起系統安裝器來安裝一個 Apk 。

三、FileProvider 的注意事項

1、authorities 的唯一性

在 AndroidManifest.xml 中配置 provider 的時候,需要保證 android:authorities 的值,在整個系統中的唯一性。其實這也很好理解,看了 FileProvider.getUriForFile() 之后,發現它是通過 android:authorities 屬性配置的值,來唯一確定由誰來響應這個 provider 的,所以它需要保證在系統內唯一,否者安裝的時候會拋出異常。

而在常規開發過程中,如果是一個 App Module 在使用 FileProvider 的話,那么只需要我們自己規范不要寫同一個 authorities 即可。但是如果是作為一個 Lib Module 發布出去的話,是需要考慮使用者的如何使用的,所以為了友好起見,最好使用 applicationId 來配置 provider 標簽。

這樣配置之后,就會使用 Gradle 中配置的 applicationId 的值替換這里,而使用 FileProvider.getUriForFile() 的時候,只需要根據 applicationId 拼接一個 authorities 值即可,簡單修改一下上面調用系統去安裝 APK 的例子。

2、Lib 下的 targetSdkVersion

前面提到,如果不將 targatSdkVersion 升級到 24 的話,之前的方式依然是可用的,不會有 FileUriExposedException 的隱患。但是如果你的項目是作為一個 Lib Module 這種 SDK 的形式發布出去,供其他人使用的話,這里的 targetSdkVersion 就不受 Lib 的 targetSdkVersion 控制,而是主項目的 targetSdkVersion。

所以如果是以 SDK 的形式集成到別的 App 內使用的話,如果需要用發送一個 File 給其他 App,一定要適配 FileProvider 。

3、不使用 v4 包

FIleProvider 是存在于的 Support v4 包下,所以想要使用 FileProvider 就必須集成 v4 包。但是對于一個本身無需使用 v4 包的項目來說,為了 FileProvider 來集成 v4 包,無形中就增加了安裝包的體積。

但是仔細看 FileProvider ,其實并沒有引用到什么更多的 package ,而 FileProvider 本質上也只是一個 ContentProvider ,所以我們只需要將它的代碼復制出來,簡單修改一下保證可以正確運行,就可以使用,而不是必須繼承 v4 包。

四、小結

FileProvider 的核心就是提高安全性,讓開發者來限制自己本 App 的文件對外的訪問權限,以提高安全性。

所以在開發過程中,只需要配合 FileProvider 將我們可能需要第三方 App 用到的文件目錄加入到可授權的范圍,然后在發送 Intent 的時候,對其進行授權即可,其他的操作和之前并無變化,這里就不一一列舉了。

【本文為51CTO專欄作者“張旸”的原創稿件,轉載請通過微信公眾號聯系作者獲取授權】

戳這里,看該作者更多好文

責任編輯:武曉燕 來源: 51CTO專欄
相關推薦

2021-06-30 07:19:35

微服務業務MySQL

2024-11-04 09:00:00

Java開發

2024-02-19 10:29:24

模型駕駛

2017-10-23 12:22:58

Android編程基礎總結

2014-03-17 10:10:58

CC++編程書籍

2023-03-13 09:07:02

2019-08-01 12:56:00

Python代碼記錄

2021-08-26 09:31:40

Nacos配置注冊

2015-12-30 11:14:57

前端工具

2021-12-22 10:49:42

架構運維技術

2023-10-31 07:39:36

2021-01-08 05:16:01

5G4GRRU

2018-01-03 10:32:21

面試經驗套路

2012-08-22 13:57:24

HybridHybrid開發

2021-05-25 05:28:05

uniCloud前端項目

2019-04-19 12:46:18

面試丁校招簡歷

2020-08-26 08:54:17

CSSFont Size屬性

2019-08-13 16:01:12

2013-03-29 13:17:53

XCode調試技巧iOS開發

2011-07-13 09:13:56

Android設計
點贊
收藏

51CTO技術棧公眾號

中国日韩欧美久久久久久久久| 亚洲精品国产一区二区精华液| 欧美一区二区三区图| 精品无码一区二区三区 | 亚洲乱码国产乱码精品精的特点| 亚洲综合小说区| 日本一区二区网站| 成人国产精品一级毛片视频| 欧美一区二区三区视频在线| heyzo亚洲| 中文字幕日本在线观看| 国产v综合v亚洲欧| 欧美一级在线播放| 777777国产7777777| eeuss鲁片一区二区三区| 91极品美女在线| www婷婷av久久久影片| 欧美新色视频| 福利一区福利二区| 国产精品视频在线播放| 日本天堂网在线观看| 999精品视频| 亚洲美女在线视频| 欧美日韩一区二区区别是什么| 忘忧草在线影院两性视频| 中文字幕一区二区三区不卡| 免费久久99精品国产自| 国产极品久久久| 天堂久久久久va久久久久| 欧美精品九九久久| 日韩欧美123区| 欧美一区二区三| 亚洲精品天天看| 在线播放国产视频| 成人激情久久| 欧美亚洲图片小说| 六月丁香婷婷在线| 高清毛片在线观看| 亚洲精品欧美在线| 最新国产精品久久| 成年人在线观看视频| 2欧美一区二区三区在线观看视频| 91在线免费视频| 黄色av一区二区| 在线亚洲成人| 国内伊人久久久久久网站视频| 久久高清内射无套| 性欧美69xoxoxoxo| 久久久91精品| 午夜国产福利视频| 欧美色图激情小说| 在线免费看av不卡| 2019男人天堂| 禁果av一区二区三区| 日韩毛片在线看| 西西大胆午夜视频| 日韩av影院| 日韩av在线导航| 亚洲av成人片色在线观看高潮 | 噜噜噜久久亚洲精品国产品小说| 欧美交受高潮1| 久久机热这里只有精品| 欧美1级日本1级| 欧美剧在线观看| 久久久久无码精品国产| 欧美jjzz| 久久久久久久久久久久久久久久久久av | 国产成人在线免费观看| 99在线看视频| 少妇一级淫片免费看| av亚洲产国偷v产偷v自拍| 国产一区二区无遮挡| 四虎国产精品永远| 久久久久国产成人精品亚洲午夜| 免费成人av网站| 福利片在线观看| 国产精品福利一区| 91精品国产毛片武则天| 成人超碰在线| 欧美性xxxx极品hd满灌| 一本久道中文无码字幕av| 78精品国产综合久久香蕉| 欧美久久久久久久久中文字幕| 亚洲av毛片在线观看| 91在线一区| 亚洲老司机av| 亚洲精品电影院| 欧美日韩三级电影在线| 欧美在线性爱视频| 一级黄色大毛片| 岛国精品一区二区| 免费电影一区| 中文字幕伦理免费在线视频| 午夜精品久久久久久不卡8050| 欧美成人精品欧美一级乱| 国产麻豆一区| 欧美一级日韩免费不卡| 国产精品手机在线观看| 成人毛片在线| 午夜精品一区二区三区在线| 在线视频精品免费| 国产91综合一区在线观看| 欧美一级二级三级九九九| 成人午夜在线影视| 色综合天天性综合| 丰满人妻一区二区三区53视频| 天堂资源在线亚洲| 久久久精品久久久| 99精品在线播放| 国产美女一区二区| 欧洲国产精品| 17videosex性欧美| 4438x成人网最大色成网站| 在线免费播放av| 亚洲美女视频| 国产精品爱啪在线线免费观看| 国产av一区二区三区精品| 久久久久国色av免费看影院| 欧美日韩中文字幕在线播放| 日韩av超清在线观看| 精品日韩在线观看| 色www亚洲国产阿娇yao| 99热这里只有成人精品国产| 成人天堂噜噜噜| 狠狠狠综合7777久夜色撩人| 亚洲图片欧美综合| 日韩成人av免费| 狠狠色狠狠色综合婷婷tag| 欧美精品18videos性欧| 在线免费观看中文字幕| 久久婷婷久久一区二区三区| 成人午夜免费在线视频| 亚洲色图图片| 在线激情影院一区| 国产91精品看黄网站在线观看| 成人a免费在线看| 欧美做受777cos| av一级久久| 中文字幕一区电影| 中文字幕乱码一区二区| 国产无遮挡一区二区三区毛片日本| 免费看欧美一级片| 伊人精品久久| 九色精品免费永久在线| 99热这里只有精品3| 国产精品传媒在线| 欧美婷婷精品激情| 青青草国产成人a∨下载安卓| 欧美最猛性xxxxx免费| 天堂在线资源8| 性欧美疯狂xxxxbbbb| 第一页在线视频| 欧美成人国产| 国产a一区二区| 超碰在线97国产| 亚洲第一男人av| 日韩三级视频在线| av不卡一区二区三区| 日本中文字幕网址| 亚洲动漫在线观看| 国产成人精品一区二区三区| 国产在线一二三区| 欧美调教femdomvk| 欧美手机在线观看| 国产69精品久久777的优势| 日韩网站在线免费观看| 人体久久天天| 日本乱人伦a精品| 国产高清免费在线播放| 欧美日韩午夜影院| 亚洲欧美小视频| 国产91精品一区二区| www在线观看免费| 亚洲三级网址| 国产精品视频内| 日本福利在线| 日韩欧美中文一区| 日韩精品一区二区在线播放| 久久久99精品免费观看| 天天操狠狠操夜夜操| 国产精品v亚洲精品v日韩精品| 久久久久久久久久久久久久久久av| 色香欲www7777综合网| www.美女亚洲精品| 刘亦菲毛片一区二区三区| 日韩欧美国产激情| √天堂中文官网8在线| 99国内精品久久| 中文字幕av不卡在线| 精品9999| 午夜精品福利一区二区| 日本一区二区乱| 欧美一级高清免费播放| 色哟哟免费在线观看| 亚洲国产成人久久综合一区| 久久久999久久久| 亚洲综合网站在线观看| 国产一区二区三区四区五区六区 | 2024亚洲男人天堂| a黄色在线观看| 日韩精品资源二区在线| 国语对白永久免费| 亚洲免费电影在线| 91av在线免费| 国产成人一区在线| 久久久久久三级| 欧美日韩免费| 一本一道久久a久久综合精品| 美女av一区| 成人在线国产精品| 免费观看成人性生生活片| 欧美激情精品久久久久久黑人 | 中文在线观看av| 午夜精品福利一区二区三区av | 亚洲欧美日韩精品永久在线| 欧美一区二区三区视频免费播放| 黄色av网站免费观看| 亚洲精品国产精华液| 在线观看日本黄色| 91色九色蝌蚪| 99热超碰在线| 国产剧情av麻豆香蕉精品| 久久精品一区二| 亚洲毛片在线| 免费网站在线观看视频| 午夜免费一区| 亚洲一区不卡在线| 精品成av人一区二区三区| 精品国产第一页| 成人香蕉社区| 91免费精品视频| 久久天天久久| 国产精品日韩在线| 亚洲成av在线| 日韩美女激情视频| 日韩激情电影免费看| 97在线视频精品| 国模雨婷捆绑高清在线| 欧美成人精品在线观看| 日p在线观看| 在线视频欧美日韩精品| 国产视频精选在线| 亚洲色图15p| 国产一级二级三级在线观看| 日韩精品中文字幕有码专区| 手机看片一区二区| 亚洲高清在线观看| 五月色婷婷综合| 日韩精品在线看| 黄色片视频在线观看| 亚洲欧洲日产国产网站| 国产一二三在线观看| 在线成人免费网站| 自拍视频在线免费观看| www.xxxx欧美| 四虎影视成人| 国语自产精品视频在线看一大j8 | www.黄色小说.com| 欧美成人欧美edvon| 国产91绿帽单男绿奴| 亚洲第一中文字幕在线观看| 天天综合永久入口| 亚洲欧洲第一视频| 国产一区二区三区不卡在线| 中文字幕亚洲天堂| 成人黄色在线电影| 97在线视频一区| 韩国成人动漫| 国产精品一区二区久久久久| **欧美日韩在线| 国产精品乱码| 国产成人ay| 在线综合视频网站| 国内自拍视频一区二区三区| 成年人网站免费视频| 日韩成人午夜电影| 久久精品久久99| www.激情成人| 四季av中文字幕| 一区二区三区免费在线观看| 黄色片视频网站| 欧美视频在线播放| 性欧美videos另类hd| 精品一区二区三区三区| 91社区在线高清| 久久久久久久久久久av| 秋霞国产精品| 91成人理论电影| 国产成人精品一区二区免费看京| 中文字幕乱码一区二区三区| 亚洲精品1区| 欧美一级黄色影院| 国产99精品视频| xxx在线播放| 亚洲一区二区三区四区中文字幕| 五月天婷婷激情| 91精选在线观看| 精品无吗乱吗av国产爱色| 久久精品视频在线观看| 男人的天堂免费在线视频| 国产精品私拍pans大尺度在线| 一区视频网站| 亚洲精品日韩在线观看| 亚洲精品美女91| 91亚洲免费视频| www.亚洲人| 国产97免费视频| 在线看国产一区二区| 老司机午夜福利视频| 俺去了亚洲欧美日韩| 另类图片综合电影| 国产精品一区二区三区免费| 欧美激情777| 国产精品亚洲a| 99久久精品国产观看| 日本a级片视频| 欧美天堂一区二区三区| 午夜小视频在线播放| 欧美成人午夜影院| 欧美视频第一| 日韩欧美99| 免费亚洲网站| 影音先锋人妻啪啪av资源网站| 亚洲欧美色一区| 亚洲图片视频小说| 亚洲性夜色噜噜噜7777| 欧美调教sm| 国产在线精品一区二区三区》| 午夜亚洲福利| 免费不卡av网站| 亚洲丝袜自拍清纯另类| 亚洲一卡二卡在线| 最近2019中文字幕mv免费看 | 精品资源在线看| 欧美在线xxx| 久久porn| 欧美 日韩 亚洲 一区| 岛国一区二区三区| 欧美另类视频在线观看| 日韩一级片在线观看| 成年人黄视频在线观看| 国产有码一区二区| 日韩欧美二区| 最新天堂在线视频| 中文字幕一区二区三| 国产又黄又大又粗的视频| 久久精品成人动漫| 四虎永久精品在线| 韩国黄色一级大片| 国产精品夜夜嗨| 综合视频免费看| 久久综合图片| 美女久久久久久久久久| 日韩欧美999| 免费毛片在线| 国产精品久久久久av免费| 国产尤物久久久| 中文字幕第88页| 自拍偷拍国产精品| www.av在线.com| 欧美肥老妇视频| 欧美日韩一区二区三区不卡视频| 国产h视频在线播放| 91丨porny丨中文| 国产黄色免费视频| 精品国产一区二区三区久久| 九色精品蝌蚪| 国产 日韩 欧美在线| 久久婷婷国产综合精品青草| 中文字幕第三页| 另类图片亚洲另类| 农村少妇一区二区三区四区五区| 国产无套内射久久久国产| 国产精品美女久久久久久久| 国产美女三级无套内谢| 久久久久日韩精品久久久男男 | 久久99精品一区二区三区| 色老板免费视频| 亚洲国产中文字幕久久网 | 91系列在线播放| 国产主播一区| 精品无码国产污污污免费网站 | 少妇久久久久| 国产理论在线播放| 亚洲男人天堂一区| 欧美精品少妇| 91免费版网站入口| 国产视频欧美| 久久精品一区二区三区四区五区| 精品福利一二区| 欧美精选视频一区二区| 日韩视频 中文字幕| 国产无一区二区| 丰满大乳国产精品| 国产精品久久久久久久久久久不卡 | 17videosex性欧美| 一本久道久久综合| 99re热这里只有精品视频| 国产乱码精品一区二区| 91高潮在线观看|