解决Android7.0更新后无法安装的问题
程序员文章站
2022-10-25 16:19:19
最近在我们的应用中加入更新功能,按照往常一样加入代码
if (!apkfile.exists()) {
toast.maketext(mconte...
最近在我们的应用中加入更新功能,按照往常一样加入代码
if (!apkfile.exists()) { toast.maketext(mcontext, "下载的安装包不存在", toast.length_short).show(); return; } intent install = new intent(intent.action_view); install.setdataandtype(uri.fromfile(apkfile), "application/vnd.android.package-archive"); install.setflags(intent.flag_activity_new_task); mcontext.startactivity(install);
在测试机上一运行,妥妥的能安装,就此完事,然后我把它打包后发到我自己的手机上(android7.1.1)上,下载安装,居然报错了,然后我的同事就说你看看7.0以上的文件,好像加了限制了,于是上百度,果然是这样的,谷歌在android7.0引入私有目录被限制访问和strictmode api。
那么我们在7.0以上怎么适配呢?别急,谷歌给我们提供了方法就是使用fileprovider。知道这个解决方法之后我们就开始写代码吧。
if (!apkfile.exists()) { toast.maketext(mcontext, "下载的安装包不存在", toast.length_short).show(); return; } //判读版本是否在7.0以上 if (build.version.sdk_int >= build.version_codes.n) { //在androidmanifest中的android:authorities值 uri apkuri = fileprovider.geturiforfile(mcontext, "你的包名.provider", apkfile); intent install = new intent(intent.action_view); install.setflags(intent.flag_activity_new_task); //添加这一句表示对目标应用临时授权该uri所代表的文件 install.addflags(intent.flag_grant_read_uri_permission); install.setdataandtype(apkuri, "application/vnd.android.package-archive"); mcontext.startactivity(install); } else { intent install = new intent(intent.action_view); install.setdataandtype(uri.fromfile(apkfile), "application/vnd.android.package-archive"); install.setflags(intent.flag_activity_new_task); mcontext.startactivity(install); }
然后在androidmanifest.xml中配置
<provider android:name=".service.myfileprovider" android:authorities="你的包名.provider" android:exported="false" android:granturipermissions="true"> <meta-data android:name="android.support.file_provider_paths" android:resource="@xml/file_paths" /> </provider>
最后在res文件夹底下新建一个xml文件夹,里面新建file_paths.xml文件
<?xml version="1.0" encoding="utf-8"?> <resources> <paths> <external-path path="" name="download"/> </paths> </resources>
当这些都写完之后,别以为就此完事了,别忘了权限
<uses-permission android:name="android.permission.write_external_storage"/>
<uses-permission android:name="android.permission.access_network_state"/>
<uses-permission android:name="android.permission.internet"/>
最后,别忘了在代码中动态申请权限(6.0的坑)。
if (build.version.sdk_int < build.version_codes.m) { //todo 更新 } else { if (contextcompat.checkselfpermission(this, manifest.permission.write_external_storage) == packagemanager.permission_granted) { //todo 更新 } else {//申请权限 activitycompat.requestpermissions(this, new string[]{manifest.permission.write_external_storage}, 1); } } //权限请求结果 @override public void onrequestpermissionsresult(int requestcode, @nonnull string[] permissions, @nonnull int[] grantresults) { super.onrequestpermissionsresult(requestcode, permissions, grantresults); switch (requestcode) { case 1: if (grantresults[0] == packagemanager.permission_granted) { //todo 更新 } else { toast.maketext(this, "暂无读写sd卡权限", toast.length_short).show(); } break; } }
当完成以上这些代码,我们就可以愉快的去更新你的应用了。
推荐阅读
-
解决安装pycharm后不能执行python脚本的问题
-
Win2008中安装的MSSQL2005后无法访问的解决方法
-
Centos7安装完后无法联网的解决方法
-
Windows更新无法安装在Win10 / 8 / 7的解决办法
-
如何LNMP一键包安装后解决MySQL无法远程连接问题?
-
解决安装Domino for Linux时配置的Web服务器无法启动的问题
-
wamp中mysql安装时能启动重启后无法启动的解决办法
-
安装SQL Server 2016出错提示:需要安装oracle JRE7 更新 51(64位)或更高版本问题的解决方法
-
双硬盘用户必升 Win10周年更新安装后出现的冻结问题确已修复
-
完美解决安装完tensorflow后pip无法使用的问题