最近項目中圖片選擇器的UI定制程度較高,在網上沒找到合適的庫,於是自己着手寫一個
過程中打開相機程序的時候遇到了個問題,系統報錯:
android.os.FileUriExposedException:+文件名+ exposed beyond app through ClipData.Item.getUri()
上網查了一下,發現是因為參考了老版的第一行代碼...沒有對Android7.0以上的情況做適配導致的
FileUriExposedException字面意思是,文件Uri暴露異常,當你的應用把file:// Uri暴露給其他App的時候就會出現這種異常,因為接收方App可能並不具備訪問該共享資源的權限。所以應該用content:// Url來拓展臨時權限,這樣接收方就能訪問到資源了。顯然,這是Google為了收緊Android的自由度,提升安全度所做的事情
在應用間共享文件
對於面向 Android 7.0 的應用,Android 框架執行的 StrictMode API 政策禁止在您的應用外部公開 file:// URI。如果一項包含文件 URI 的 intent 離開您的應用,則應用出現故障,並出現 FileUriExposedException 異常。
要解決這個問題最簡單的方法就是使用FileProvider 步驟如下:
1.在AndroidManifest中增加
<provider android:name="androidx.core.content.FileProvider" android:authorities="你的app包名.fileprovider" android:exported="false" android:grantUriPermissions="true"> <meta-data android:name="android.support.FILE_PROVIDER_PATHS" android:resource="@xml/filepaths" /> </provider>
2.res下新建xml/filepaths.xml
<paths xmlns:android="http://schemas.android.com/apk/res/android"> <external-path name="external" path=“"/> </paths>
3.將報錯獲取uri的地方改成以下格式
Uri uri = FileProvider.getUriForFile(activity, activity.getPackageName() + ".filepractivityovider", file);
問題解決。
參考文章https://blog.csdn.net/u010356768/article/details/89212742