[轉]快速使用FileProvider解決Android7.0文件權限問題

?

升級到Android7.0之后,啟動系統相機或者截圖,傳入URI的時候可能會導致程序閃退崩潰。這是因為7.0的新的文件權限導致的。下面是解決這個問題的快速解決方案。

?

問題代碼

?

在7.0可能會出問題的代碼:

?

final String CACHE_IMG = Environment.getExternalStorageDirectory()+"/demo/"
final int TAG_PHOTO_CAMERA=200;Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);String fileName = "defaultImage.jpg";File file = new File(CACHE_IMG, fileName);Uri uri = Uri.fromFile(file);intent.putExtra(MediaStore.EXTRA_OUTPUT, uri);startActivityForResult(intent, TAG_PHOTO_CAMERA);

?

其中Uri uri = Uri.fromFile(file);這里會導致閃退。

?

解決方法

?

step1. 將Uri的生成方式改為由FileProvider提供的臨時授權路徑,并且在intent中添加flag
修改后代碼如下

?

final String CACHE_IMG = Environment.getExternalStorageDirectory()+"/demo/"
final int TAG_PHOTO_CAMERA=200;Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);String fileName = "defaultImage.jpg";File file = new File(CACHE_IMG, fileName);Uri imageUri=FileProvider.getUriForFile(activity,"me.xifengwanzhao.fileprovider", file);//這里進行替換uri的獲得方式intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);//這里加入flagstartActivityForResult(intent, TAG_PHOTO_CAMERA);

?

step2.在AndroidManifest.xml中的application標簽中添加provider的配置

?

   <application
       ...><provider
            android:name="android.support.v4.content.FileProvider"android:authorities="me.xifengwanzhao.fileprovider"//這里需要和上面部分字符串相同android:exported="false"android:grantUriPermissions="true"><meta-data
                android:name="android.support.FILE_PROVIDER_PATHS"android:resource="@xml/file_paths" /></provider></application>

?

step3.在res/xml中新建一個文件file_paths.xml

?

<?xml version="1.0" encoding="utf-8"?>
<resource xmlns:android="http://schemas.android.com/apk/res/android"><external-path
        name="images"path="demo/" />
</resource>

?

OK,大功告成,這樣就不會崩潰了

?

代碼解釋

?

我們先看Google官方的7.0行為變更介紹 (不需要翻墻)

?

對于面向 Android 7.0 的應用,Android 框架執行的 StrictMode API 政策禁止在您的應用外部公開 file:// URI。如果一項包含文件 URI 的 intent 離開您的應用,則應用出現故障,并出現 FileUriExposedException 異常。

要在應用間共享文件,您應發送一項 content:// URI,并授予 URI 臨時訪問權限。進行此授權的最簡單方式是使用 FileProvider 類。如需了解有關權限和共享文件的詳細信息,請參閱共享文件。

?

根據文檔提示我們使用FileProvider進行處理,同時利用xml對FileProvider進行配置
參考如下

?

java根路徑產生方式對應xml根節點名稱
Context.getFilesDir()files-path
getCacheDir()cache-path
Environment.getExternalStorageDirectory()external-path
Context#getExternalFilesDir(String) Context.getExternalFilesDir(null)external-files-path
Context.getExternalCacheDir()external-cache-path

?

節點中的name 不可重名,path為自定義

?

關于相冊選圖和相機裁剪

?

有同學反映相冊選圖和相機裁剪時候的報錯問題,這里也說一下
系統相冊選圖返回的Uri是可以直接使用的,不需要也不能使用FileProvider進行轉換
如果需要根據uri獲得轉換后的uri 可以參考如下方式

?

Uri fromUri;
if (uri.getScheme() != null && uri.getScheme().startsWith("file")) {fromUri =FileProvider.getUriForFile(mContext,"me.xifengwanzhao.fileprovider", new File(FileUtils.getPath(mContext, uri)));//這里進行替換uri的獲得方式intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);//這里加入flag
} else {//相冊選圖適配fromUri = uri;
}

?

關于相機裁剪
相機裁剪 intent.setDataAndType(fromUri, “image/*”);這里是需要對uri進行轉換的,
而 intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(file));這里使用原來的方式獲取uri就可以了
那么啟動系統裁剪的方法可以寫成這樣

?

    /*** 開啟截圖,啟動系統的截圖方法 返回requestCode為 {Constant.IMG_ZOOM}** @param mContext 必須為activity* @param uri      需要進行裁剪的圖片的uri* @param size     截圖的大小寬和高的數值,這里僅限截圖為1:1的正方形* @return path 截圖返回的路徑* @see Constant#IMG_ZOOM*/public static String startPhotoZoom(Activity mContext, Uri uri, int size) {//這里生成一個保存截圖用的臨時路徑并且返回出去String imgPath;File file = new File(Constant.ZOOM_IMAGE, Constant.getNewestImageName(mContext));imgPath = file.getPath();Intent intent = new Intent("com.android.camera.action.CROP");Uri fromUri;if (uri.getScheme() != null && uri.getScheme().startsWith("file")) {fromUri = FileProvider.getUriForFile(mContext, "me.xifengwanzhao.fileprovider", new File(FileUtils.getPath(mContext, uri)));//這里進行替換uri的獲得方式intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);//這里加入flag} else {//相冊選圖適配fromUri = uri;}intent.setDataAndType(fromUri, "image/*");intent.putExtra("crop", "true");intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(file));if (android.os.Build.MANUFACTURER.contains("HUAWEI")) {// 華為特殊處理 不然會顯示圓intent.putExtra("aspectX", 9998);intent.putExtra("aspectY", 9999);} else {intent.putExtra("aspectX", 1);intent.putExtra("aspectY", 1);}intent.putExtra("outputX", size);intent.putExtra("outputY", size);mContext.startActivityForResult(intent, Constant.IMG_ZOOM);return imgPath;}

?

參考文檔

?

[1]Android N 調用相冊crash- FileUriExposedException
[2]根據 Android Training課程寫的FileProvider小例子
[3]使用FileProvider共享文件
[4]Android7.0適配教程與心得
[5]Android N 調用相冊crash- FileUriExposedException


---------------------
作者:夕楓晚照
來源:CSDN
原文:https://blog.csdn.net/xifengwanzhao/article/details/53587234
版權聲明:本文為作者原創文章,轉載請附上博文鏈接!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/285728.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/285728.shtml
英文地址,請注明出處:http://en.pswp.cn/news/285728.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

終于找到了,開源的Vue3+.NET6通用管理后臺!

據說80%的.NET項目都是管理后臺&#xff0c;然而能用上Vue3.NET6的管理后臺并不多見。這里分享一套Vue3 Axios TS Vite ElementUI Plus .NET 6 WebAPI JWT SqlSugar的前后端分離架構的通用管理后臺源碼數據庫腳本&#xff0c;還有與之配套錄制的一組視頻教程&#xff0c;全部打…

【Pix4d精品教程】Pix4d模型成果導出OSGB并加載OSGB到EPS進行三維測圖完美案例教程

《無人機航空攝影測量精品教程》合集目錄(Pix4d、CC、EPS、PhotoScan、Inpho) 在垂直攝影中,Pix4d也可以生成漂亮的三維模型,并導出為OSGB,加載到EPS進行三維測圖。首先來看生成的三維格網紋理和EPS三維模型加載效果。 Pix4d生成的三維格網紋理: EPS加載OSGB模型效果: 文…

Vim 批量替換

假設在非Win系統下。 想批量替換文本不再是Ctrl&#xff0b;F那么簡單了&#xff0c; 一般用Vim來做批量替換&#xff0c; 略微復雜點&#xff1a; 比如將192.168.0.1替換為192.168.0.2 :%s/192.168.0.1/192.168.0.2/g

Android實現ListView(1)

昨天有個朋友問我Android ListView列表視圖&#xff0c;遇到了點錯誤&#xff0c;今天我給大家演示&#xff0c;具體實現見圖&#xff1a; 1&#xff1a;創建一個item布局layout/item.xml 2&#xff1a;創建一個ListViewActivity類&#xff0c;但是必須繼承ListActivity&#x…

WolframAlpha 的使用

WolframAlpha 1. 求解復雜方程組 ab?4abc2ac1直接點開網站&#xff0c;在輸入框中輸入&#xff0c;ab-4;abc2;ac1;&#xff08;逗號分割開來&#xff09;&#xff0c; 轉載于:https://www.cnblogs.com/mtcnn/p/9423087.html

C語言試題八十六之兔子生兔子問題

??個人主頁:個人主頁 ??系列專欄:C語言試題200例目錄 ??推薦一款刷算法、筆試、面經、拿大公司offer神器 ?? 點擊跳轉進入網站 ?作者簡介:大家好,我是碼莎拉蒂,CSDN博客專家(全站排名Top 50),阿里云博客專家、51CTO博客專家、華為云享專家 1、題目 假設一對兔…

聊聊 C# 中的 Composite 模式

?寫在前面 Composite組合模式屬于設計模式中比較熱門的一個&#xff0c;相信大家對它一定不像對訪問者模式那么陌生&#xff0c;畢竟誰又沒有遇到過樹形結構呢。不過所謂溫故而知新&#xff0c;我們還是從一個例子出發&#xff0c;起底一下這個模式吧。一個簡單例子 設想我們…

140種Python標準庫、第三方庫和外部工具都有了

導讀&#xff1a;Python數據工具箱涵蓋從數據源到數據可視化的完整流程中涉及到的常用庫、函數和外部工具。其中既有Python內置函數和標準庫&#xff0c;又有第三方庫和工具。 這些庫可用于文件讀寫、網絡抓取和解析、數據連接、數清洗轉換、數據計算和統計分析、圖像和視頻處理…

【CC精品教程】任務一:CC新建工程、添加照片、相機參數設置、選擇坐標系統

《無人機航空攝影測量精品教程》合集目錄(Pix4d、CC、EPS、PhotoScan、Inpho) 同Pix4d一樣,CC(Context Capture),也稱Smart 3D,也是無人機航測中人手必備的一款軟件,在空三運算,三維模型構建等傾斜攝影測量方面有很大的優勢,精度也相當高。本CC系列精品教程從項目的角…

C語言試題八十七之實現選擇排序算法

??個人主頁:個人主頁 ??系列專欄:C語言試題200例目錄 ??推薦一款刷算法、筆試、面經、拿大公司offer神器 ?? 點擊跳轉進入網站 ?作者簡介:大家好,我是碼莎拉蒂,CSDN博客專家(全站排名Top 50),阿里云博客專家、51CTO博客專家、華為云享專家 1、題目 C語言選擇排…

java concurrent之前戲synchronized

對于多線程共享資源的情況須要進行同步&#xff0c;以避免一個線程的修改被還有一個線程的修改所覆蓋。最普遍的同步方式就是synchronized。把代碼聲明為synchronized。有兩個重要后果&#xff0c;一般是指該代碼具有 原子性&#xff08;atomicity&#xff09;和 可見性&#x…

開源項目【zheng】搭建流程

2019獨角獸企業重金招聘Python工程師標準>>> 搭建過程 項目地址 https://gitee.com/shuzheng/zheng這兩篇寫的比較詳細的搭建過程&#xff0c;結合一下就沒什么問題了。 https://my.oschina.net/yzuzhang/blog/1538555http://www.jianshu.com/p/b2fb42e17b581.JDK 1…

簡述HTML DOM及其節點分類

在JavaScript中&#xff0c;document這個對象大家一定很熟悉&#xff0c;哪怕是剛剛開始學習的新人&#xff0c;也會很快接觸到這個對象。而document對象不僅僅是一個普通的JavaScript內置對象&#xff0c;它還是一個巨大API的核心對象&#xff0c;這個巨大的API就是DOM&#x…

【CC精品教程】任務二:導入像控點、差分POS,空三平差權重設置,提交自由空三

《無人機航空攝影測量精品教程》合集目錄(Pix4d、CC、EPS、PhotoScan、Inpho) 【CC精品教程】任務一:CC新建工程、添加照片、相機參數設置、選擇坐標系統 本任務接著上一個任務,繼續完成CC項目作業,主要內容有:導入像控點、選擇空間參考系統,導入差分POS,空三平差權重設…

[轉]如何進行單元測試

一、單元測試步驟 代碼編寫完成后的單元測試工作主要分為兩個步驟&#xff1a; 人工靜態檢查 人工靜態檢查是測試的第一步&#xff0c;這個階段工作主要是保證代碼算法的邏輯正確性&#xff08;盡量通過人工檢查發現代碼的邏輯錯誤&#xff09;、清晰性、規范性、一致性、算法…

WPF 基礎控件之 TabControl樣式

其他基礎控件1.Window2.Button3.CheckBox4.ComboBox5.DataGrid 6.DatePicker7.Expander8.GroupBox9.ListBox10.ListView11.Menu12.PasswordBox13.TextBox14.RadioButton15.ToggleButton16.Slider 17.TreeView TabControl 實現下面的效果1&#xff09;TabControl來實現動畫&…

開發團隊測試的難與易

做了多年的研發工程師&#xff0c;在所處的環境中&#xff0c;所接觸的開發人員中很少有看重對自己代碼進行測試這項工作的。大多研發人員往往是寫好了代碼運行起來&#xff0c;簡單做下測試&#xff0c;甚至不去測試就拋給接口使用者或者質量管理人員。而且理由很充分“沒時間…

C語言試題八十八之實現選冒泡排序算法

??個人主頁:個人主頁 ??系列專欄:C語言試題200例目錄 ??推薦一款刷算法、筆試、面經、拿大公司offer神器 ?? 點擊跳轉進入網站 ?作者簡介:大家好,我是碼莎拉蒂,CSDN博客專家(全站排名Top 50),阿里云博客專家、51CTO博客專家、華為云享專家 1、題目 C語言實現冒…

兩個數值交換位置

2019獨角獸企業重金招聘Python工程師標準>>> 先說非計算機專業都能理解的。 int a 10; int b 20; 方法一&#xff1a; int c a; a b; b c; System.out.println("a"a",b"b); 方法二&#xff1a; a a b; b a - b; a a - b; System.out…

教你如何在Android 6.0上創建系統懸浮窗

郭霖大神的文章:http://mp.weixin.qq.com/s?__bizMzA5MzI3NjE2MA&mid2650235949&idx1&sn0f7eded67f834d38b02f8872768cb68a&scene0#wechat_redirect今天周二&#xff0c;又該跟大家分享由我執筆的文章了。從之前我寫的deep links、通知欄微技巧這兩篇文章中&a…