首先描述一下我的问题
我这个是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 ̄)づ么么哒