android.os.FileUriExposedException: exposed beyond app through ClipData.Item.getUri()踩坑記錄


最近項目中圖片選擇器的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 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM