android7.0手机升级问题
来源:互联网 发布:农村金融网点数据 编辑:程序博客网 时间:2024/04/28 13:57
版权声明:本文为博主原创文章,未经博主允许不得转载。
目录(?)[+]
我们使用手机的时候经常会看到应用程序提示升级,大部分应用内部都需要实现升级提醒和应用程序文件(APK文件)下载。
一般写法都差不多,比如在启动app的时候,通过api接口获得服务器最新的版本号,然后和本地的版本号比较,来判断是否需要弹出提示框下载,当然也可以通过推送的自定义消息来实现。
我们这里主要讨论的是应用程序下载,并在通知栏提醒下载完成。
实现过程大致分为三步:
- 创建一个service
- 在service启动的时候创建一个广播接受者,用于接受下载完成的广播
- 当BroadcastReceiver接受到下载完成的广播时,开始执行安装。
主要通过系统提供的DownloadManager
进行下载,DownloadManager
下载完成会发送广播,具体使用看下面完整的代码。如果详细了解可以参考Android系统下载管理DownloadManager功能介绍及使用示例下面创建新的文件DownloadService.Java
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
- 79
- 80
- 81
- 82
- 83
- 84
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
- 79
- 80
- 81
- 82
- 83
- 84
上面代码使用了RxPermissions第三方库动态申请权限,需要在app/build.gradle文件中进行配置
- 1
- 2
- 3
- 4
- 5
- 1
- 2
- 3
- 4
- 5
记得要配置服务
- 1
- 2
- 3
- 4
- 5
- 1
- 2
- 3
- 4
- 5
最后在MainActivity中添加按钮,执行操作。运行结果:
当下载的时候,会有通知栏进度条提示。下载完成会提示安装。不过当前程序如果在Android7.0上就会报错。下面是报错的日志:
- 1
- 2
- 1
- 2
这是由于Android7.0执行了“StrictMode API 政策禁”的原因,不过小伙伴们不用担心,可以用FileProvider来解决这一问题,
现在我们就来一步一步的解决这个问题。
Android 7.0错误原因
随着Android版本越来越高,Android对隐私的保护力度也越来越大。
比如:Android6.0引入的动态权限控制(Runtime Permissions),Android7.0又引入“私有目录被限制访问”,“StrictMode API 政策”。
这些更改在为用户带来更加安全的操作系统的同时也为开发者带来了一些新的任务。如何让你的APP能够适应这些改变而不是crash,是摆在每一位Android开发者身上的责任。
“私有目录被限制访问“ 是指在Android7.0中为了提高私有文件的安全性,面向 Android N 或更高版本的应用私有目录将被限制访问。这点类似iOS的沙盒机制。
” StrictMode API 政策” 是指禁止向你的应用外公开 file:// URI。 如果一项包含文件 file:// URI类型 的 Intent 离开你的应用,应用失败,并出现 FileUriExposedException 异常。
上面用到的代码中的Uri.fromFile 其实就是生成一个file://URL。
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
一旦我们通过这种办法打开其它程序(这里打开系统包安装器)就认为file:// URI类型的 Intent 离开你的应用。这样程序就会发生异常。
接下来就用FileProvider
来解决这一问题。
使用FileProvider
使用FileProvider的大致步骤如下:
第一步:
在AndroidManifest.xml清单文件中注册provider,因为provider也是Android四大组件之一,可以简单把它理解为向外提供数据的组件,这种组件在实际开发中用的频率并不高,四大组件都可以在清单文件中进行配置。
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
注意:
exported
:要求必须为false,为true则会报安全异常。grantUriPermissions:true
,表示授予 URI 临时访问权
限。authorities
组件标识,按照江湖规矩,都以包名开头,避免和其它应用发生冲突。
第二步:指定共享的目录
上面配置文件中 android:resource="@xml/file_paths"
指的是当前组件引用 res/xml/file_paths.xml
这个文件。
我们需要在资源(res)目录下创建一个xml目录,然后创建一个名为“file_paths”(名字可以随便起,只要和在manifest注册的provider所引用的resource保持一致即可)的资源文件,内容如下:
- 代表的根目录: Context.getFilesDir()
- 代表的根目录: Environment.getExternalStorageDirectory()
- 代表的根目录: getCacheDir()
上述代码中path=”“,是有特殊意义的,它代码根目录,也就是说你可以向其它的应用共享根目录及其子目录下任何一个文件了。
如果你将path设为path="pictures"
,那么它代表着根目录下的pictures目录(eg:/storage/emulated/0/pictures),如果你向其它应用分享pictures目录范围之外的文件是不行的。
第三步:使用FileProvider
上述准备工作做完之后,现在我们就可以使用FileProvider了。
我们需要将上述安装APK代码修改为如下
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
上述代码中主要有两处改变:
1. 将之前Uri改成了有FileProvider创建一个content类型的Uri。
2. 添加了intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION)
;来对目标应用临时授权该Uri所代表的文件。
上述代码通过FileProvider
的Uri getUriForFile (Context context, String authority, File file)
静态方法来获取Uri
该方法中authority参数就是清单文件中注册provider时填写的authority android:authorities="com.yll520wcf.test.fileprovider"。
按照上面步骤修改就可以兼容Android7.0了。
后期修改,之前没有考虑7.0以下的版本
但是如果此程序在Android7.0以下运行又会报错了,我们需要通过版本判断,当Android7.0及以上需要调用上面的代码,Android7.0以下需要调用7.0以下的代码。这样就OK了。修改install() 方法代码。
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
参考文献
android应用开发app手动更新通知栏下载实践
Android7.0适配教程,心得
- android7.0手机升级问题
- Android7.0升级安装APK,FileUriExposedException问题
- 解决Android7.0以上,手机拍照闪退的问题
- Android7.0的手机升级安装APK时,出现FileUriExposedException错误
- Android7.0 编译问题
- 解决Android7.0以上版本升级apk时报android.os.FileUriExposedException的问题
- 华为手机android7.0应用中百度地图加载不出来&解析包时出现问题
- Android7.0 手机reboot进入系统后wake lock锁问题
- Android7.0 获取手机蓝牙MAC地址
- android7.0 settings问题汇总
- Android7.0打包安装问题
- 1. Android7.0编译问题
- bugly自动升级在android7.0系统上重复下载 bugly与takephoto适配7.0冲突问题
- 升级安装APK兼容Android7.0,解决FileUriExposedException
- 升级安装APK兼容Android7.0,解决FileUriExposedException
- android7.0 编译问题及解决
- android7.0适配权限问题
- android7.0 源码编译问题总结
- ABC-CNN: An Attention Based Convolutional Neural Network for Visual Question Answering
- icepdf中使用BufferedImage时内存溢出的解决方法
- 数组的基本运算(1)
- Java复习-并发编程中的三个问题:原子性、可见性和有序性
- LeetCode 283. Move Zeroes
- android7.0手机升级问题
- Mac环境下利用Github搭建个人博客
- 2017年6款最佳免费Linux防火墙
- 渐入效果实现
- Python的字符串,list,tuple,set,字典操作详解
- Snapman设计中的思考
- Android性能分析(持续更新)
- LeetCode 326. Power of Three
- 小萨的烦恼