TakePhoto和蒲公英(pgyer)的android.support.v4.content.FileProvider冲突
来源:互联网 发布:怎么提高网络延迟 编辑:程序博客网 时间:2024/05/01 22:45
一 前言
先介绍一下两个框架:
1 TakePhoto
一款用于在Android设备上获取照片(拍照或从相册、文件中选择)、裁剪图片、压缩图片的开源工具库
2 蒲公英
免费的应用托管平台|App应用众测分发
二 起因
1 Android7.0及以上拍照时,由于出于安全考虑,Android 7.0[API24]以及以上版本不支持file://,使用content://URI
详见:Android7.0拍照失败FileUriExposedException
因此TakePhoto作为一款主打拍照的框架自然也适配了Android7.0.使用了android.support.v4.content.FileProvider。
2 蒲公英平台在应用自动更新时,需要获取下载在Download文件夹下的apk安装包。为了提高私有文件的安全性,面向 Android 7.0 或更高版本的应用私有目录被限制访问。
官方文档:Android7.0 - 系统权限更改(上面说到拍照需要用FileProvider也是这个原因)
三 解决方案
1 先看看对比二者的AndroidManifest.xml:
TakePhoto:
<provider android:name="android.support.v4.content.FileProvider" android:authorities="${applicationId}.fileprovider" android:grantUriPermissions="true" android:exported="false"> <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="com.pgyersdk.fileProvider" --><!-- android:exported="false" --><!-- android:grantUriPermissions="true"> --><!-- <meta-data --><!-- android:name="android.support.FILE_PROVIDER_PATHS" --><!-- android:resource="@xml/provider_paths" /> --><!-- </provider> -->
对!你没有看错,蒲公英中并没有把android.support.v4.content.FileProvider的注册写死,需要我们在自己的项目里配置。TakePhoto虽然在一定程度上使用了模板化代码的写法(${applicationId}),但终究是写在了框架中了。因此就是在这里受到了限制。
2 再看两者的provider.xml文件
TakePhoto:(file_paths.xml)
<?xml version="1.0" encoding="utf-8"?><resources> <paths> <root-path path="" name="camera_photos" /> </paths></resources>
蒲公英:(provider_paths.xml)
<?xml version="1.0" encoding="utf-8"?><paths> <external-path name="files_root" path="Android/data/com/pgyersdk" /> <external-path name="external_storage_root" path="." /></paths>
其实内容道无所谓,可以合并。主要还是文件名不同。由于前面看AndroidManifest.xml中看到TakePhoto是写死的,蒲公英是可以自定义的。那么这次要用TakePhoto的文件名。
合并后的xml文件(file_paths.xml)
<?xml version="1.0" encoding="utf-8"?><resources> <paths> <root-path name="camera_photos" path="" /> <external-path name="files_root" path="Android/data/com/pgyersdk" /> <external-path name="external_storage_root" path="." /> </paths></resources>
现在可以把AndroidManifest.xml的android.support.v4.content.FileProvider搞定了。基于前面的的结论,一切以TakePhoto为主。那么在自己项目的AndroidManifest.xml中应该这么写:
<provider android:name="android.support.v4.content.FileProvider" android:authorities="com.example.relish.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/file_paths" tools:replace="name,resource" /></provider>
还没结束,还有注意在调用蒲公英的应用更新的代码时,:
PgyUpdateManager.register(MainActivity.this, "com.example.relish.fileprovider",//这里填写注册在Manifest.xml里android:authorities中的值 new UpdateManagerListener() { @Override public void onUpdateAvailable(final String result) { // 将新版本信息封装到AppBean中 final AppBean appBean = getAppBeanFromString(result); new AlertDialog.Builder(MainActivity.this) .setTitle(R.string.update) .setMessage(getString(R.string.latest_version) + appBean.getVersionName() + "\n" + appBean.getReleaseNote()) .setNegativeButton( R.string.ensure, (dialog, which) -> startDownloadTask( MainActivity.this, appBean.getDownloadURL())).show(); } @Override public void onNoUpdateAvailable() { } });
这样就大功告成了。
- TakePhoto和蒲公英(pgyer)的android.support.v4.content.FileProvider冲突
- Unable to get provider android.support.v4.content.FileProvider
- java.lang.RuntimeException: Unable to get provider android.support.v4.content.FileProvider
- Didn't find class "android.support.v4.content.FileProvider" on path:
- Unable to get provider android.support.v4.content.FileProvider: java.lang.ClassNotFoundException: Di
- 解决android-support-v4.jar 冲突
- android-support-v4.jar文件冲突解决方案
- Android Support v4,v7,v13的区别以及 v4,v7包冲突问题
- support-V4 冲突
- Android 通过蒲公英pgyer的接口 Service 实现带进度下载App 通知栏显示 在线更新 自动更新Demo
- Android 通过蒲公英pgyer的接口 Service 实现带进度下载App 通知栏显示 在线更新 自动更新Demo
- android引入开源项目方法,和解决android-support-v4.jar冲突问题
- android引入开源项目方法,和解决android-support-v4.jar冲突问题
- Android项目引用library导致多个android-support-v4冲突的解决
- Android Support v4、v7、v13的区别和应用场景
- Android Support v4、v7、v13的区别和应用场景
- Android Support v4、v7、v13的区别和应用场景
- Android Support v4、v7、v13的区别和应用场景
- Struts.xml常用配置
- boost ipc 消息队列
- 199. Binary Tree Right Side View
- wampserver变橙色,apache 服务无法启动!问题解决小记(安装失败亦可参考)
- Springmvc异常处理
- TakePhoto和蒲公英(pgyer)的android.support.v4.content.FileProvider冲突
- 一些自己遇到的面试题
- 控制台ADB 命令安装apk到手机sdcard及安装qq过程中问题:: to '/sdcard/tmp/': Is a directory解决
- 大型网站架构的生成步骤
- 41、初始化类中的对象
- 201403第一届CCF第一题 相反数
- 【Linux】如何创建daemon进程&fork一次和fork两次有什么区别
- 句柄类
- popupWindow的弹窗在正上方