Android provider衝突問題,ImagePick的provider與自己的provider衝突
老鐵們掃描一下支付寶二維碼,讓我賺點賞金把,我要窮死了,麼麼噠,愛你們
首先描述一下我的問題
我這個是android7.0拍照,因為更換頭像是自己條用系統的拍照,為了解決Android7.0許可權,所以自己在xml中配置了provider,然後專案中有上傳多張圖片的功能,我是使用的是第三方框架com.lzy.widget:imagepicker,這個框架裡面也配置了provider的許可權,然後就發生了衝突。當選擇多張圖片的時候,使用拍照,Android 7.0就會閃退。
開始的時候,執行是正常的,什麼錯都沒有,就是點選拍照就閃退
這個時候的我一臉懵逼,不存在啊,這個是使用的最新的版本啊,官方也說了7.0是可以的啦,好崩潰,然後我就換了一個0.3.5版本的clear專案,在重新builder,哈哈哈哈,這回就不能運行了,報錯了。哎呀報錯了好呀,這樣才能看到報錯的原因啊。下面是報錯的詳細資訊
然後配上我的xml配置
<!-- Android7.0系統 拍照 --> <provider android:name="android.support.v4.content.FileProvider" android:authorities="com.example.ruidun.ShanXunApplication.fileprovider" android:exported="false" android:grantUriPermissions="true" > <meta-data android:name="android.support.FILE_PROVIDER_PATHS" android:resource="@xml/file_paths" /> </provider>
分析報錯可以看到說的是provider這個標籤裡面的
android:authorities
這個的值是錯的,imagepicker不是用的這個值,然後說要加上 tools:replace=“android:authorities”
還有一個地方就是meta-data標籤下的這個resource值也不對,這個是用 @xml = "provier_paths"
android:resource
根據報錯資訊,說是要加入
tools:replace=“android:authorities”
然後我按照報錯的資訊又加入相應的tools,然後重新執行專案,現在執行的試試不報錯了,但是點選imagepick的拍照功能還是閃退。
然後網上搜索了一下,也沒有解決這個問題,然後我吧版本換到最新的版本,然後下載官網的原始碼去看看原始碼裡面怎麼配置的。
下面是原始碼裡面的provider配置的相關程式碼,
1.在AndroidMain裡面
<provider
android:name=".ImagePickerProvider"
android:authorities="${applicationId}.provider"
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/provider_paths"/>
</provider>
[email protected]/provider_paths裡面的東西
<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android">
<external-path name="external_files" path="."/>
</paths>
3.ImagePickerProvider中的程式碼
package com.lzy.imagepicker;
import android.support.v4.content.FileProvider;
/**
* 自定義一個Provider,以免和引入的專案的provider衝突
*
* Author: nanchen
* Email: [email protected]
* Date: 2017-03-17 16:10
*/
public class ImagePickerProvider extends FileProvider {
}
然後我就嘗試自己再按照原始碼的配置再配一次,出現這樣問題是因為provider檔案不能共享
下面我就直接貼程式碼了
1.自定義的MyProvider繼承自
import com.lzy.imagepicker.ImagePickerProvider;
import com.lzy.imagepicker.ImagePickerProvider;
/**
* C
* 專案名稱:¥{PROJECT_NAME}
* 建立人:瀟瀟
*
*/
public class MyProvider extends ImagePickerProvider {
}
2.在res-value新建一個xml檔案,然後建立provider_paths
<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android">
<!--解決 imagePick 7.0拍照是 與自己配置的 provider的衝突-->
<external-path
name="external_files"
path="." />
</paths>
3.在AndroidManifest中配置
<!--imagePick 拍照7.0系統-->
<provider
android:name=".ui.activity.MyProvider"
android:authorities="com.lzy.imagepicker.ImagePickerProvider"
android:exported="false"
android:grantUriPermissions="true"
tools:replace="name,authorities,exported,grantUriPermissions"
>
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/provider_paths"
tools:replace="name,resource"
/>
</provider>
O(∩_∩)O哈哈~,就這樣完美解決了,如果對你有幫助,記得點贊哦,(づ ̄ 3 ̄)づ麼麼噠