软件编程
位置:首页>> 软件编程>> Android编程>> Android 8.0升级不跳转应用安装页面的解决方法

Android 8.0升级不跳转应用安装页面的解决方法

作者:zj_blog  发布时间:2022-03-20 03:30:13 

标签:Android,升级

最近开发遇到了个问题,app升级的时候,其他手机都能正常升级,下载完安装包,跳到安装页面进行新版本的安装。但却有用户反映,华为P10和华为Mate 9升级时,怎么也无法跳转到安装页面。起初我以为是华为手机自身系统的问题(因为手上的华为测试机都是正常的),还特地对比了几种配置的华为手机,最后发现,是Android 8.0系统版本的锅,不是手机的问题。

2017年8月22日,Google发布了Android 8.0的正式版,其正式名称为:Android Oreo(奥利奥),Android 8.0强化了权限管理,变得更加安全。在Android 8.0以前,所有的未知来源应用都可以被安装,或者会弹窗给用户一个提示,如此设计虽然方便,但是若被引诱安装了恶意软件,安装"未知来源"的应用有可能会对手机系统带来潜在的危害;

而在Android 8.0的系统中,**未知来源应用权限**的开关被移除掉了,取而代之的是未知来源应用的管理列表,如果你想要安装某个被自己所信任的开发者的app,则需要在每一次都手动授权"安装未知应用"的许可。设置页面如下图:(在华为Android 8.0中,打开该设置页面:设置列表—>安全与隐私—>更多安全设置—>安装未知应用)

Android 8.0升级不跳转应用安装页面的解决方法

*如图所示*,若某个应用选择的是“不允许”,那么假设app手动升级的时候,就无法成功跳转到安装页面进行正常的App升级流程了,此时需要手动去授权才行,但是很多用户并不知道需要这么设置。
废话说了一大堆,解决其实很简单。

1.在AndroidManifest.xml文件中,添加REQUEST_INSTALL_PACKAGES权限


<uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES" />

2.在打开安装包的代码中添加**兼容Android 8.0**的代码。


/**
 * 打开安装包
 *
 * @param mContext
 * @param fileUri
 */
 public void openAPKFile(Activity mContext, String fileUri) {
   DataEmbeddingUtil.dataEmbeddingAPPUpdate(fileUri);
   // 核心是下面几句代码
   if (null != fileUri) {
     try {
       Intent intent = new Intent(Intent.ACTION_VIEW);
       File apkFile = new File(fileUri);
       //兼容7.0
       if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
         intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
         Uri contentUri = FileProvider.getUriForFile(mContext, mContext.getPackageName() + ".fileProvider", apkFile);
         intent.setDataAndType(contentUri, "application/vnd.android.package-archive");
         //兼容8.0
         if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
           boolean hasInstallPermission = mContext.getPackageManager().canRequestPackageInstalls();
           if (!hasInstallPermission) {
             ToastUtil.makeText(MyApplication.getContext(), MyApplication.getContext().getString(R.string.string_install_unknow_apk_note), false);
             startInstallPermissionSettingActivity();
             return;
           }
         }
       } else {
         intent.setDataAndType(Uri.fromFile(apkFile), "application/vnd.android.package-archive");
         intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
       }
       if (mContext.getPackageManager().queryIntentActivities(intent, 0).size() > 0) {
         mContext.startActivity(intent);
       }
     } catch (Throwable e) {
       e.printStackTrace();
       DataEmbeddingUtil.dataEmbeddingAPPUpdate(e.toString());
       CommonUtils.makeEventToast(MyApplication.getContext(), MyApplication.getContext().getString(R.string.download_hint), false);
     }
   }
 }

/**
 * 跳转到设置-允许安装未知来源-页面
 */
 @RequiresApi(api = Build.VERSION_CODES.O)
 private void startInstallPermissionSettingActivity() {
   //注意这个是8.0新API
   Intent intent = new Intent(Settings.ACTION_MANAGE_UNKNOWN_APP_SOURCES);
   intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
   mContext.startActivity(intent);
 }

来源:https://blog.csdn.net/zj_blog/article/details/79897241

0
投稿

猜你喜欢

  • 背景在 Java 中实现线程安全的传统方式是 synchronized 关键字,虽然它提供了一定的同步能力,但它在使用上
  • 在LINUX上部署带有JAR包的JAVA项目首先eclipse上要装上一个小插件,叫做Fat Jar点击Fat Jar红框里选上主类点击Ne
  • 如下所示:import java.security.MessageDigest;import java.security.NoSuchAlg
  • 本文实例讲述了C#基于QRCode实现动态生成自定义二维码图片功能。分享给大家供大家参考,具体如下:二维码早就传遍大江南北了,总以为它是个神
  • 本文实例讲述了Java中的匿名对象定义与用法。分享给大家供大家参考,具体如下:一 点睛匿名对象是指没有名字的对象。实际上,对于对象实例化操作
  • Java是一门面向对象编程语言,不仅吸收了C++语言的各种优点,还摒弃了C++里难以理解的多继承、指针等概念,因此Java语言具有功能强大和
  • Java在1.5开始引入了注解,目前流行的框架都在用注解,可想而知注解的强大之处。以下通过自定义注解来深入了解java注解。一、创建自定义注
  • 我们经常在项目中使用的线程池,但是是否关心过线程池的关闭呢,可能很多时候直接再项目中直接创建线程池让它一直运行当任务执行结束不在需要了也不去
  • 1.XxlJob简介官方网址:https://www.xuxueli.com/xxl-jobXXL-JOB是一个分布式任务调度平台,其核心设
  • Android手势解锁本文讲述的是一个手势解锁的库,可以定制显示隐藏宫格点、路径、并且带有小九宫格显示图,和震动!让你学会使用这个简单,高效
  • 多态是同一个行为具有多个不同表现形式或形态的能力。多态性意味着有多重形式。在面向对象编程范式中,多态性往往表现为"一个接口,多个功
  • 前言Java8 的新特性:Lambda表达式、强大的 Stream API、全新时间日期 API、ConcurrentHashMap、Met
  • 前言关键字Final不仅可以用来修饰变量,而且对类及其方法的继承也有很大的影响,本文将从类与方法两个方面介绍final关键字的功能。Fina
  • 本节作为主要讲解Spring Data的环境搭建JPA Spring Data :致力于减少数据访问层(DAO)的开发量。开发者唯一要做的就
  • 对JVM运行参数进行修改是JVM性能调优的重要手段,下面介绍在应用程序开发过程中JVM参数设置的几种方式。方式一java程序运行时指定 -D
  • 通常C#使用基于XML的配置文件,不过如果有需要的话,比如要兼顾较老的系统,可能还是要用到INI文件。但C#本身并不具备读写INI文件的AP
  • 1、反射的概念1、概念反射,指在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法,对任意一个对象,都能调用它的任意一个方法。这种
  • 本文实例为大家分享了springboot实现异步任务的具体代码,供大家参考,具体内容如下1.什么异步任务同步:一定要等任务执行完了,得到结果
  • HashMap 概述HashMap 是通过 put(key,value) 存储,get(key)来获取。当传入 key 时,HashMap
  • 一、类加载器类加载器(ClassLoader),顾名思义,即加载类的东西。在我们使用一个类之前,JVM需要先将该类的字节码文件(.class
手机版 软件编程 asp之家 www.aspxhome.com