Android FileProvider衝突處理方法

       衆所周知,在android7.0是上做適配,需要額外添加FileProvider,因爲選則文件的uri發現了一些變化。當然在android10.0的基礎上做適配的話,就發現另外一些變化,這個可以另外一篇文章,但是總體變化不大。android10的適配

       今天要說的問題是,在日常項目開發中,因爲種種需求,可能會引入一些三方庫,這個三方庫,一般都早已經適配了7.0,所以有自己path路徑,而我們因爲在項目開發的時候,自己應該也有文件選則路徑,這個結果,就是導致項目報錯。一般是下面這種錯誤,意思就是自己項目跟三方的開源庫衝突了。

        遇見這種情況,一般推薦幾種做法,第一種項目本身兩個FileProvider,兩個合成一個即可,如下圖所示

<application>
   ...
<!-- 其他 -->
 <provider
    android:name="android.support.v4.content.FileProvider"
    android:authorities="${applicationId}.fileprovider"
    android:exported="false"
    android:grantUriPermissions="true">
    <meta-data
        android:name="android.support.FILE_PROVIDER_PATHS"
        android:resource="@xml/file_paths" />
 </provider>
<!-- 廣點通 -->
 <provider
    android:name="android.support.v4.content.FileProvider"
    android:authorities="${applicationId}.fileprovider"
    android:exported="false"
    android:grantUriPermissions="true">
    <meta-data
        android:name="android.support.FILE_PROVIDER_PATHS"
        android:resource="@xml/gdt_file_path" />
  </provider>
 ...
</application>

       這個是比較明顯的,因爲使用三方的SDK,三方的有自己個處理路徑判斷,這個時候我們合併一下就OK了,把file_paths文件與gdt_file_path,兩個文件的內容合併成一個就OK。具體操作步驟就不詳細說了,貼一下示例代碼

<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android">
   <!-- 廣點通 -->
    <external-path
        name="gdt_sdk_download_path"
        path="GDTDOWNLOAD" />
    <external-cache-path
        name="gdt_sdk_download_path1"
        path="com_qq_e_download" />
    <cache-path
        name="gdt_sdk_download_path2"
        path="com_qq_e_download" />
   <!-- 其他 -->
    <external-files-path 
        name="external_files" path="."/>
</paths>

      合併完成之後,自己重新聲明一個新的file文件即可,如下圖所示:

<application>
   ...
<!-- 合併後 -->
 <provider
    android:name="android.support.v4.content.FileProvider"
    android:authorities="${applicationId}.fileprovider"
    android:exported="false"
    android:grantUriPermissions="true">
    <meta-data
        android:name="android.support.FILE_PROVIDER_PATHS"
        android:resource="@xml/news_file_paths" />
 </provider>
 ...
</application>

  針對這種方法呢,還有一個問題就是,有的時候三方庫,沒有提供FileProvider的配置文件,那這個時候需要我們自己去三方庫的源碼裏翻一下,都是同樣的路徑在xml下邊,找到之後做一下兼容即可。

       上面那種方法比較常用,還有一種辦法就是,自定義FileProvider,不直接用系統指定的,也可以解決該衝突,如代碼所示

public class MyFileProvider extends FileProvider{
}

      繼承之後也不需要處理什麼東西,在配置文件改一下名字即可

<application>
    ...
 <!-- 其他 -->
  <provider
    android:name="android.support.v4.content.FileProvider"
    android:authorities="${applicationId}.fileprovider"
    android:exported="false"
    android:grantUriPermissions="true">
     <meta-data
        android:name="android.support.FILE_PROVIDER_PATHS"
        android:resource="@xml/file_paths" />
  </provider>
 <!-- 廣點通 -->
  <provider
     android:name=".util.MyFileProvider"//自定義的FileProvider的路徑
     android:authorities="${applicationId}.fileProvider"
     android:exported="false"
     android:grantUriPermissions="true"
     tools:replace="name,authorities,exported,grantUriPermissions">
     <meta-data
        android:name="android.support.FILE_PROVIDER_PATHS"
        android:resource="@xml/gdt_file_path"
        tools:replace="name,resource" />
   </provider>
   ...
</application>

 好了以上就是處理FileProvider的兩種建議辦法,當然還有其它的辦法,像直接修改三方庫的源碼,都行,選則合適自己項目需求的就好。

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