Android 7.0 + FileProvider 訪問隱私文件 相冊硫眨、相機(jī)、安裝應(yīng)用的適配

參考文章:android 7.0+ FileProvider 訪問隱私文件 相冊巢块、相機(jī)礁阁、安裝應(yīng)用的適配

一巧号、概述

Android 7.0 開始,Android SDK 中的 StrictMode 策略禁止開發(fā)人員在應(yīng)用外部公開 file:// URI姥闭。具體表現(xiàn)為丹鸿,當(dāng)我們在應(yīng)用中使用包含 file:// URIIntent離開自己的應(yīng)用時,程序會發(fā)生FileUriExposedException異常
這里我們要使用到的 FileProvider棚品,就是 ContentProvider 的一個特殊子類卜高,幫助我們將訪問受限的 file:// URI轉(zhuǎn)化為可以授權(quán)共享的 content:// URI

簡單來說就是在Android 7.0及以上機(jī)型中如果需要訪問手機(jī)文件南片,那么必須使用 FileProvider來進(jìn)行適配掺涛,否則程序會報錯。

二疼进、使用

  1. AndroidManifest.xml注冊FileProvider
<provider
    android:name="android.support.v4.content.FileProvider"
    android:authorities="${applicationId}.fileprovider"
    android:exported="false"
    android:grantUriPermissions="true">
    <meta-data
        android:name="android.support.FILE_PROVIDER_PATHS"
        android:resource="@xml/files_paths" />
</provider>

  • 這里的authorities可以自己定義薪缆,不過后面需要用到,只要保證前后一致即可伞广。
  • resource內(nèi)的xml文件是用來配置文件路徑的拣帽,文件名可自定義。
  1. src\main\res\xml\文件夾下創(chuàng)建對應(yīng)的files_paths.xml文件
<!--files_paths.xml-->
<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android">
   <!--此處的name可以隨便取-->
    <external-path
        name="external_storage_root"
        path="."/>
    <external-files-path name="document" path="Documents"/>
    <external-files-path name="download" path="Download" />
    <external-files-path name="pictures" path="Pictures" />
</paths>

xml中元素必須包含一到多個子元素嚼锄。這些子元素用于指定共享文件的目錄路徑减拭,必須是這些元素之一:

  • <files-path>:內(nèi)部存儲空間應(yīng)用私有目錄下的 files/目錄,等同于 Context.getFilesDir()所獲取的目錄路徑区丑;
  • <cache-path>:內(nèi)部存儲空間應(yīng)用私有目錄下的 cache/ 目錄拧粪,等同于 Context.getCacheDir() 所獲取的目錄路徑;
  • <external-path>:外部存儲空間根目錄沧侥,等同于 Environment.getExternalStorageDirectory()所獲取的目錄路徑可霎;
  • <external-files-path>:外部存儲空間應(yīng)用私有目錄下的files/ 目錄,等同于Context.getExternalFilesDir(null) 所獲取的目錄路徑宴杀;
  • <external-cache-path>:外部存儲空間應(yīng)用私有目錄下的cache/目錄癣朗,等同于 Context.getExternalCacheDir()
  1. 使用FileProvider進(jìn)行轉(zhuǎn)換:
//注意此處的 第二個參數(shù)必須與 Manifest文件中Provider 的 android:authorities 一致
Uri contentUri = FileProvider.getUriForFile(this, BuildConfig.APPLICATION_ID + ".FileProvider", outputFile);

此處需要傳進(jìn)三個參數(shù)旺罢,第一參數(shù)是context上下文旷余,第二個參數(shù)是FileProvider,必須與 AndroidManifest.xml文件中Provider的 android:authorities一致扁达,第三個參數(shù)是file文件對象正卧。

下面再放上一個例子

Intent intent = new Intent();
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.setAction(Intent.ACTION_VIEW);
String type = MimeTypesTools.getMimeType(context, path);
File file = new File(path);
Uri uri;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
    uri = FileProvider.getUriForFile(mContext, 
    //添加這一句表示對目標(biāo)應(yīng)用臨時授權(quán)該Uri所代表的文件
    intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);BuildConfig.APPLICATION_ID+".fileprovider", file);
}else {
    uri = Uri.fromFile(file);
}
intent.setDataAndType(uri, type);
context.startActivity(intent);

劃重點(diǎn)!罩驻!
一定要給Intent加一個flag——Intent.FLAG_GRANT_READ_URI_PERMISSION穗酥,否則會報Permission Denial的錯,當(dāng)然7.0以下的機(jī)型是不需要的惠遏。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末砾跃,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子节吮,更是在濱河造成了極大的恐慌抽高,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,265評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件透绩,死亡現(xiàn)場離奇詭異翘骂,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)碳竟,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,078評論 2 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來狸臣,“玉大人莹桅,你說我怎么就攤上這事≈蛞啵” “怎么了诈泼?”我有些...
    開封第一講書人閱讀 156,852評論 0 347
  • 文/不壞的土叔 我叫張陵,是天一觀的道長煤禽。 經(jīng)常有香客問我铐达,道長,這世上最難降的妖魔是什么檬果? 我笑而不...
    開封第一講書人閱讀 56,408評論 1 283
  • 正文 為了忘掉前任瓮孙,我火速辦了婚禮,結(jié)果婚禮上选脊,老公的妹妹穿的比我還像新娘衷畦。我一直安慰自己,他們只是感情好知牌,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,445評論 5 384
  • 文/花漫 我一把揭開白布祈争。 她就那樣靜靜地躺著,像睡著了一般角寸。 火紅的嫁衣襯著肌膚如雪菩混。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,772評論 1 290
  • 那天扁藕,我揣著相機(jī)與錄音沮峡,去河邊找鬼。 笑死亿柑,一個胖子當(dāng)著我的面吹牛邢疙,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 38,921評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼疟游,長吁一口氣:“原來是場噩夢啊……” “哼呼畸!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起颁虐,我...
    開封第一講書人閱讀 37,688評論 0 266
  • 序言:老撾萬榮一對情侶失蹤蛮原,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后另绩,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體儒陨,經(jīng)...
    沈念sama閱讀 44,130評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,467評論 2 325
  • 正文 我和宋清朗相戀三年笋籽,在試婚紗的時候發(fā)現(xiàn)自己被綠了蹦漠。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,617評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡车海,死狀恐怖笛园,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情容劳,我是刑警寧澤喘沿,帶...
    沈念sama閱讀 34,276評論 4 329
  • 正文 年R本政府宣布,位于F島的核電站竭贩,受9級特大地震影響蚜印,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜留量,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,882評論 3 312
  • 文/蒙蒙 一窄赋、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧楼熄,春花似錦忆绰、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,740評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至缕粹,卻和暖如春稚茅,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背平斩。 一陣腳步聲響...
    開封第一講書人閱讀 31,967評論 1 265
  • 我被黑心中介騙來泰國打工亚享, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人绘面。 一個月前我還...
    沈念sama閱讀 46,315評論 2 360
  • 正文 我出身青樓欺税,卻偏偏與公主長得像侈沪,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子晚凿,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,486評論 2 348

推薦閱讀更多精彩內(nèi)容