Android 7.0之后安装APK,拍照 出现FileUriExposedException,多个provider配置
2017-07-20 11:37
627 查看
做项目在主页检查更新的时候,检查到apk需要更新,于是我美滋滋的得到了下载的apk,然后调用一下去安装apk方法,以为理所当然的没啥问题,可是当我下载完了的时候,在调用安装的代码时,抛出了一个异常FileUriExposedException,MMP 这是个什么鬼,欺负我英语不好吗,于是日常百度,搜嘎,原来由于
在android7.0,修改了对私有存储的限制,而我的编译版本为25,导致在获取资源的时候,不能通过Uri.fromFile(..)来获取uri了,但是在写入数据的时候是可以通过Uri.fromFile(..)来获取uri的,android
原来如此那就好整了,开干开干
第一步: 在AndroidManifest.xml文件添加 provider节点配置
注意了,这个applacationId 必须要在grade文件里面配置哦 如果你不配置的话你可以直接写上你的包名
第二步: 在res文件夹下面新建一个xml文件夹,然后在xml文件夹中新建一个xml 这个xml的名字
必须与你在第一步的配置文件里面名字一致,如图
第三步 xml 里面的内容
注意了 这里请必须要填上你自己的包名,
ok了,文件都配置好了,就差最后的代码了,
第四步
这里要注意的是这句代码,这里BuildConfig
是导入的我当前项目的包名,如果你不想这么做的话,你可以直接写你自己的包名列如: 包名com.test 来替换
题外:
在android7.0,修改了对私有存储的限制,而我的编译版本为25,导致在获取资源的时候,不能通过Uri.fromFile(..)来获取uri了,但是在写入数据的时候是可以通过Uri.fromFile(..)来获取uri的,android
官网给出的解决办法是通过FileProvider来解决这一问题,我们需要在AndroidManifest.xml 配制provider节点
原来如此那就好整了,开干开干第一步: 在AndroidManifest.xml文件添加 provider节点配置
<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_path" /> </provider>
注意了,这个applacationId 必须要在grade文件里面配置哦 如果你不配置的话你可以直接写上你的包名
第二步: 在res文件夹下面新建一个xml文件夹,然后在xml文件夹中新建一个xml 这个xml的名字
必须与你在第一步的配置文件里面名字一致,如图
第三步 xml 里面的内容
<?xml version="1.0" encoding="utf-8"?> <paths> <external-path path="Android/data/你的包名/" name="files_root" /> <external-path path="." name="external_storage_root" /> </paths>
注意了 这里请必须要填上你自己的包名,
ok了,文件都配置好了,就差最后的代码了,
第四步
/** 安装一个apk文件 */ public static void install(Context context, File uriFile) { Intent intent = new Intent(Intent.ACTION_VIEW); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); Uri contentUri = FileProvider.getUriForFile(context, BuildConfig.APPLICATION_ID+".fileprovider", uriFile); intent.setDataAndType(contentUri, "application/vnd.android.package-archive"); } else { intent.setDataAndType(Uri.fromFile(uriFile), "application/vnd.android.package-archive"); intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); } if (App.getIntence().getPackageManager().queryIntentActivities(intent, 0).size() > 0) { App.getIntence().startActivity(intent); } }
这里要注意的是这句代码,这里BuildConfig
是导入的我当前项目的包名,如果你不想这么做的话,你可以直接写你自己的包名列如: 包名com.test 来替换
题外:
我们项目中可能会用到其他一些第三方sdk有用到拍照功能或者关于某些获取资源操作的话,他为了适配android7.0也添加了这个节点,此时有些人可能就不知道如何下手了,其实很简单我们只要重写一个类 继承自FileProvider,然后就按上述方法在添加一个节点就可以了;例如:
public class MyFileProvider extends FileProvider { }
然后
<provider android:name=".util.MyFileProvider" android:authorities="${applicationId}.provider" android:grantUriPermissions="true" android:exported="false"> <meta-dataandroid:name="android.support.FILE_PROVIDER_PATHS" android:resource="@xml/file_paths" /> </provider>
这个file_paths文件 是第三方sdk的 而不是我新建的那个
大功告成~~~
相关文章推荐
- Android7.0的手机升级安装APK时,出现FileUriExposedException错误
- android7.0 FileProvider配置安装apk文件的姿势
- Android 7.0 自动安装APK及拍照崩溃问题
- Android 7.0配置fileprovider共享文件 解决FileUriExposedException
- android 7.0之后安装apk
- Android 7.0 app升级内部安装apk—FileProvider使用
- android 7.0 apk版本更新,下载之后自动安装
- 开发中碰到的问题:Android 7.0 更新APK在安装时的报错 android.os.FileUriExposedException: file:///storage/emulated/0/And
- Android 7.0下载完apk,安装时闪退,报FileUriExposedExceotion异常
- Android 7.0 更新APK在安装时的报错 android.os.FileUriExposedException(已修复)
- android 使用FileProvider 兼容apk 在7.0版本无法安装
- Android 7.0 拍照并显示照片出现"FileUriExposedException"
- Android系统移植与调试之安装apk时MTK命令和出现Failure [INSTALL_FAILED_DEXOPT]问题解决方法
- android手机上安装apk时出现解析包错误的一个解决办法
- 怎么让一个android APK安装之后无法卸载?
- android应用安装之后删除apk
- android+https网址屏蔽证书+IntentService+NotifyManager通知栏+下载apk文件+在通知栏显示下载进度+完成之后提示安装
- Android安装apk文件之后不弹出安装完成的界面的解决方法
- Android混淆打包出错,出现类似 there were 100 duplicate class definitions解决办法 分类: Android安装及配置 2014-12-20 10:31 171人阅读 评论(0) 收藏
- Android安装APK时出现Local path doesn't exist.错误