Android provider冲突问题,ImagePick的provider与自己的provider冲突

时间:2024-03-15 12:36:56

首先描述一下我的问题

我这个是android7.0拍照,因为更换头像是自己条用系统的拍照,为了解决Android7.0权限,所以自己在xml中配置了provider,然后项目中有上传多张图片的功能,我是使用的是第三方框架com.lzy.widget:imagepicker,这个框架里面也配置了provider的权限,然后就发生了冲突。当选择多张图片的时候,使用拍照,Android 7.0就会闪退。

开始的时候,运行是正常的,什么错都没有,就是点击拍照就闪退

这个时候的我一脸懵逼,不存在啊,这个是使用的最新的版本啊,官方也说了7.0是可以的啦,好崩溃,然后我就换了一个0.3.5版本的clear项目,在重新builder,哈哈哈哈,这回就不能运行了,报错了。哎呀报错了好呀,这样才能看到报错的原因啊。下面是报错的详细信息Android provider冲突问题,ImagePick的provider与自己的provider冲突

然后配上我的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 ̄)づ么么哒