精品欧美一区二区三区在线观看 _久久久久国色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技術棧公眾號

好吊日免费视频| 国产l精品国产亚洲区久久| 国产毛片毛片毛片毛片| 欧美私人啪啪vps| 日韩av中文在线| 日本精品久久久久中文字幕| 午夜视频在线观看网站| 国产成人免费视频网站高清观看视频| 欧美一级大片在线观看| 精品伦精品一区二区三区视频密桃 | 国产精品一区二区久久不卡| 97在线免费观看| 五月天免费网站| 欧美国产极品| 91精品免费在线观看| 日韩欧美视频网站| 国产调教视频在线观看| 久久久久久久综合色一本| 亚洲精品日产aⅴ| 岛国av中文字幕| 红桃视频国产精品| 日韩有码在线视频| 美女100%无挡| 国产精品22p| 欧美卡1卡2卡| 日韩无套无码精品| 国产理论在线| 亚洲网友自拍偷拍| 亚洲国产精品视频一区| 日韩欧美在线观看一区二区| 懂色中文一区二区在线播放| 国产精品视频白浆免费视频| 日韩精品在线免费视频| 欧美69视频| xxxxx成人.com| 国产人妻大战黑人20p| 久久97精品| 精品区一区二区| 一级日本黄色片| 亚洲欧美在线综合| 欧美日韩在线直播| 日本888xxxx| 唐人社导航福利精品| 欧美日韩午夜剧场| 免费在线观看亚洲视频| 蜜桃视频www网站在线观看| 一区二区在线观看视频在线观看| 国产a级片免费看| 欧美成人hd| 日韩一区在线播放| 日本成人性视频| 黄色的网站在线观看| 国产精品久久久久三级| 一区二区精品在线| 在线播放日本| 亚洲欧洲一区二区在线播放| 一区二区免费电影| 国产在线观看av| 亚洲免费观看高清| 久久这里只有精品8| 久草在线资源站资源站| 亚洲成精国产精品女| 亚洲色成人www永久在线观看| 黄色大片在线| 欧美日韩国产黄| 能在线观看的av| 激情都市亚洲| 欧美日韩和欧美的一区二区| 亚洲精品20p| 国产精品视频一区二区三区| 日韩美女一区二区三区| 91精品啪在线观看国产| 日韩mv欧美mv国产网站| 精品一区二区三区三区| 欧美激情亚洲色图| 国产精品久久久久久麻豆一区软件| 久久精品亚洲热| 久久老司机精品视频| 国产日韩欧美一区二区三区在线观看| 日本久久久久久久久| 中文字幕人妻互换av久久| 国产精品影视在线| 精品久久久久久亚洲| 加勒比一区二区三区在线| 国产精品免费丝袜| 日韩精品综合在线| 综合在线影院| 欧美一区二区日韩| 国产福利短视频| 99久久九九| 午夜精品免费视频| 又色又爽又黄无遮挡的免费视频| 国产一区二区三区免费| 久久免费看av| 日本在线播放| 五月天婷婷综合| 在线免费视频一区| 国产成人高清精品免费5388| 亚洲性xxxx| 国产网址在线观看| 日本最新不卡在线| 国产一区二区黄色| 日本不卡在线| 五月天丁香久久| 香蕉视频xxxx| 精品国产99| 久久久久久久国产| 亚洲视频在线免费播放| 91丨九色丨黑人外教| 国产精品美女在线播放| 中文字幕乱码中文乱码51精品| 欧美精品一卡两卡| 精品无码人妻一区| 欧美日本在线| 国产日韩在线看| 国产香蕉视频在线看| 亚洲国产成人精品视频| 国产成人在线综合| 欧美日韩播放| 69av在线播放| 精品乱子伦一区二区| 欧美国产日韩在线观看| 浮妇高潮喷白浆视频| 亚洲国产中文在线| xxx一区二区| 久久久久久久久久一级| 91视视频在线观看入口直接观看www | a级影片在线| 欧美性欧美巨大黑白大战| 插我舔内射18免费视频| 欧美激情五月| 川上优av一区二区线观看| 成人免费在线观看| 色婷婷久久久亚洲一区二区三区| 少妇激情一区二区三区视频| 欧美日韩免费观看一区=区三区| 国产免费亚洲高清| jizz视频在线观看| 欧美四级电影网| 97在线观看免费视频| 午夜在线一区二区| 欧美成人免费在线| 中文字幕一区久| 日韩av综合中文字幕| 国产无套粉嫩白浆内谢| 成人天堂资源www在线| 桥本有菜av在线| 99综合久久| 久久99久久99精品中文字幕| 国产特级黄色片| 亚洲欧美日韩国产另类专区| 奇米777在线| 欧美天天在线| 国产一区二区精品在线| 黄色视屏在线免费观看| 亚洲级视频在线观看免费1级| 日韩福利片在线观看| eeuss鲁片一区二区三区在线观看| 欧美视频免费看欧美视频| 极品尤物一区| 日本亚洲欧美三级| 国产黄色免费在线观看| 欧美日韩一区二区三区免费看| 潮喷失禁大喷水aⅴ无码| 久久精品国产一区二区| 欧美精品一区二区性色a+v| 欧洲大片精品免费永久看nba| 欧美日本高清一区| 香蕉视频免费在线看| 91国产福利在线| 99鲁鲁精品一区二区三区| 国产成人亚洲综合色影视| youjizz.com在线观看| 亚洲精品456| 国产精品自拍偷拍视频| 五月花成人网| 精品视频一区在线视频| 国产精品露脸视频| 亚洲老司机在线| 强迫凌虐淫辱の牝奴在线观看| 日本亚洲欧美天堂免费| 法国空姐在线观看免费| 五月综合久久| 成人免费观看a| 激情国产在线| 日韩在线观看网站| 欧美视频在线观看一区二区三区| 懂色av影视一区二区三区| 粉嫩精品久久99综合一区| 国产成人综合自拍| 日本wwww视频| 亚洲九九视频| 日本一区二区三区视频在线观看| 在线成人免费| 欧美一级电影久久| a级片国产精品自在拍在线播放| 日韩成人av在线播放| 一区二区高清视频| 国产又粗又猛又爽又黄的| 亚洲啪啪综合av一区二区三区| 国产麻豆xxxvideo实拍| 久久av中文字幕片| 丰满少妇久久久| 91日韩在线| 久草一区二区| 免费精品一区| 国产精品欧美激情| 川上优av中文字幕一区二区| 日韩中文在线视频| 四虎成人免费在线| 精品欧美一区二区久久| 在线观看黄色网| 黑人巨大精品欧美一区免费视频| 成人免费视频网站入口::| 国产拍欧美日韩视频二区| 韩国黄色一级片| 久久99久国产精品黄毛片色诱| 国产免费观看高清视频| 欧美激情1区2区| 亚洲制服欧美久久| 国产精品最新| 久久伊人资源站| 国产伦精品一区二区三区在线播放 | 久久久久久久久久久久久久av| 1024成人网| 美国美女黄色片| 久久综合久久鬼色中文字| 亚洲AV成人精品| 久久99国产精品免费| 国产免费999| 三级不卡在线观看| 久久网站免费视频| 中文日韩欧美| 欧美一区二区三区色| 久久免费公开视频| 亚洲黄色小视频| 麻豆明星ai换脸视频| 国产精品久久久久影视| 欧美三级视频网站| 国产亚洲女人久久久久毛片| 中国极品少妇xxxx| 成人h动漫精品| 污网站免费观看| 国产成人综合亚洲91猫咪| 四季av一区二区三区| 美女脱光内衣内裤视频久久影院| 看欧美ab黄色大片视频免费| 久久字幕精品一区| 男人亚洲天堂网| 免费日韩一区二区| 欧美视频第三页| 男人的天堂亚洲| 日本一本二本在线观看| 老司机亚洲精品| 冲田杏梨av在线| 蜜桃91丨九色丨蝌蚪91桃色| 污污的网站免费| 狠狠色丁香婷婷综合久久片| 午夜精品久久久久久久99热影院| 久久99精品久久久久婷婷| 亚洲无在线观看| 国产老女人精品毛片久久| 国产成人精品一区二区在线小狼 | 在线观看亚洲免费视频| 粉嫩绯色av一区二区在线观看| 无码国产精品一区二区免费式直播| 粉嫩aⅴ一区二区三区四区五区| 国产女人18毛片水真多18| 99re在线精品| 亚洲人成人无码网www国产| 欧美激情一二三区| 国产suv精品一区二区68| 一区二区三区中文在线| 日韩av在线播| 欧美性猛交一区二区三区精品| 一卡二卡在线观看| 日韩欧美亚洲另类制服综合在线| 午夜精品久久久久久久第一页按摩 | 日韩精品网站| 中文字幕一区二区三区最新| 国精品一区二区| 久久婷婷五月综合色国产香蕉| 美女脱光内衣内裤视频久久网站| 999热精品视频| 99免费精品视频| 少妇一级黄色片| 亚洲女同女同女同女同女同69| 男人天堂中文字幕| 欧美日韩一区二区三区四区五区| 精品久久久久中文慕人妻| 日韩精品极品视频| 午夜视频在线观看免费视频| 欧美激情亚洲一区| 日本一区免费网站| 国产成人精品日本亚洲11 | 欧美久久久网站| 国产伦精品一区二区三区四区视频| 精品视频国产| 国产精品www在线观看| 免费一级片91| 911亚洲精选| 国产精品国产三级国产有无不卡 | 大片免费在线观看| 欧美亚洲国产日本| 午夜视频一区二区在线观看| 欧美在线视频一区二区三区| 欧美激情视频一区二区三区免费| 欧美成人黑人猛交| 成人久久视频在线观看| 在线视频这里只有精品| 欧美日韩国产专区| 精品毛片在线观看| 日韩中文字幕亚洲| 国产免费不卡| 精品一区在线播放| 欧美在线高清| 涩多多在线观看| 欧美激情一区二区三区不卡 | 欧美丰满一区二区免费视频| 偷拍25位美女撒尿视频在线观看| 久久福利视频导航| 视频91a欧美| 日韩一本精品| 性色一区二区三区| 艳妇乳肉豪妇荡乳xxx| 自拍偷自拍亚洲精品播放| 中国老头性行为xxxx| 亚洲裸体xxxx| 性爽视频在线| 精品麻豆av| 亚洲最黄网站| 亚洲精品激情视频| 亚洲国产一区在线观看| 国产区精品在线| 久久亚洲精品一区| 九九热这里有精品| 神马影院我不卡午夜| 日日夜夜免费精品| 偷拍夫妻性生活| 色狠狠av一区二区三区| 四虎精品在永久在线观看| 97精品国产91久久久久久| 国内毛片久久| 毛片在线播放视频| 成人av资源在线观看| 国产女同在线观看| 日韩av在线一区二区| 国产精品一区二区av影院萌芽| 久久综合九色综合久99| 亚洲综合激情| 成人午夜福利一区二区| 91国产福利在线| 在线激情网站| 成人免费视频网| 在线国产一区二区| 丰满少妇中文字幕| 亚洲国产另类av| 亚洲欧美日韩成人在线| 欧美中文字幕视频| 在线观看欧美理论a影院| 成人在线观看a| 国产精品视频一二三区| 亚洲无码久久久久| 欧美大奶子在线| 国产伦精品一区二区三区免费优势 | wwwxx欧美| 99国产精品99久久久久久粉嫩| 成人免费无码大片a毛片| 色琪琪一区二区三区亚洲区| 九九九伊在人线综合| 国产一区二区在线播放| 欧美精品首页| 特大黑人巨人吊xxxx| 色狠狠桃花综合| а√中文在线8| 国产乱人伦精品一区二区| 久久青草久久| 91视频青青草| 亚洲美女又黄又爽在线观看| 91国内外精品自在线播放| 六月婷婷激情网| 91女人视频在线观看| 亚洲天堂中文字幕在线| 欧美激情视频网站| 欧美日韩国产在线观看网站 | 黄色av网站免费| 另类天堂视频在线观看| 六月丁香久久丫| 中文字幕视频在线免费观看| 亚洲欧美aⅴ...| 国产尤物视频在线| 91中文在线视频| 久久99伊人| 婷婷在线精品视频| 亚洲国产成人久久综合| 性欧美video另类hd尤物| 欧美 日韩 国产 高清| 亚洲日本在线a| 你懂的视频在线观看| 不卡视频一区二区三区|