1. 程式人生 > >Android provider衝突問題,ImagePick的provider與自己的provider衝突

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 ̄)づ麼麼噠