衆所周知,在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的兩種建議辦法,當然還有其它的辦法,像直接修改三方庫的源碼,都行,選則合適自己項目需求的就好。