原文地址: Android7.0以上的分享圖片文件錯誤及解決方法 - Stars-One的雜貨小窩
在Android7.0以上版本,分享圖片文件出現了exposed beyond app through ClipData.Item.getUri()
這個報錯
原因
實際上,是因爲7.0以上版本開啓了Uri路徑導致的問題,不允許我們使用file://
,只允許使用content://
,我們需要做下FileProvider的適配即可解決此問題,或者將簡單粗暴,直接將此驗證給關掉
解決方法(關掉uri的驗證)
StrictMode.VmPolicy.Builder builder = new StrictMode.VmPolicy.Builder();
StrictMode.setVmPolicy(builder.build());
builder.detectFileUriExposure();
在application裏寫上上述代碼即可
解決方法(適配FileProvider)
在res中創建xml文件夾(如果文件夾已存在,則跳過此步),創建一個名爲myfileprovider.xml
(名字可任取)
<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android">
<external-path name="external_files" path="." />
</paths>
之後,在AndroidManifest.xml中聲明此Provider(下面的代碼只需要把authorities和resource裏的數值改下即可)
<application>
...
<provider
android:name="android.support.v4.content.FileProvider"
android:authorities="site.starsone.demo.fileprovider"
android:exported="false"
android:grantUriPermissions="true">
<!-- ressource file to create -->
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/myfileprovider">
</meta-data>
</provider>
</application>
最後,在構建圖片文件的uri的時候,使用下面方法構建(可以順便加個版本的判斷,Android7.0以上就走此方法構建Uri)
Uri imageUri = FileProvider.getUriForFile(
MainActivity.this,
"site.starsone.demo.provider", //(使用你自己的包名+“.provider" )
imageFile);
PS:上面的第三個參數實際上就是在AndroidMainfest裏Provider定義的
authorities
屬性