Android7.0以上的分享圖片文件錯誤及解決方法

原文地址: 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屬性

參考

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章