解决Android7.0更新后无法安装的问题
程序员文章站
2022-03-22 23:53:08
最近在我们的应用中加入更新功能,按照往常一样加入代码
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; } }
当完成以上这些代码,我们就可以愉快的去更新你的应用了。
推荐阅读
-
安装xampp后apache无法启动的原因及解决方法
-
Citrix XenDesktop License Server 卸载后无法再次安装的问题
-
在IE7浏览器的基础上无法安装IE6(提示有最新版本)的问题解决
-
SQLServer 数据库变成单个用户后无法访问问题的解决方法
-
Win10 14393.479累积更新补丁KB3201845升级后DHCP服务无法正常使用的解决方法
-
wamp中mysql安装时能启动重启后无法启动的解决办法
-
完美解决Android Studio集成crashlytics后无法编译的问题
-
Citrix XenDesktop License Server 卸载后无法再次安装的问题
-
安装xampp后apache无法启动的原因及解决方法
-
解决Python安装后pip不能用的问题