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

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

最近开发遇到了个问题,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

标签:Android,升级
0
投稿

猜你喜欢

  • C# WinForm制作登录界面的实现步骤

    2022-09-06 18:32:54
  • Seata AT模式TM处理流程图文示例详解

    2022-05-03 02:28:39
  • Spring注解@Scope原理及用法解析

    2023-12-06 14:08:17
  • 重新认识Java的System.in

    2023-08-24 01:55:18
  • Mybatis无法获取带有下划线前缀的字段的值问题

    2023-07-20 10:06:33
  • springboot下mybatis-plus如何打印sql日志和参数到日志文件

    2023-06-15 12:34:05
  • Mybatis的详细使用教程

    2022-02-15 21:08:20
  • java中对象调用成员变量与成员实例方法

    2023-08-04 11:42:49
  • Java聊天室之解决连接超时问题

    2021-06-07 16:30:54
  • java 优雅关闭线程池的方案

    2022-03-20 23:05:44
  • 代码详解Java猴子选王问题(约瑟夫环)

    2023-09-16 07:33:43
  • springboot整合Shiro

    2022-11-13 11:07:52
  • 浅析Java自定义注解的用法

    2022-06-08 01:52:58
  • SpringBoot集成redis实现分布式锁的示例代码

    2022-08-24 19:21:56
  • java8 实现提取集合对象的每个属性

    2023-10-17 19:37:27
  • 解决Mybatis-plus和pagehelper依赖冲突的方法示例

    2022-06-28 16:52:59
  • C#创建安全的栈(Stack)存储结构

    2021-11-21 08:01:33
  • SpringBoot如何实现定时任务示例详解

    2023-10-11 23:24:42
  • 基于Transactional事务的使用以及注意说明

    2022-02-24 12:23:08
  • spring mvc实现文件上传与下载功能

    2022-05-13 09:50:14
  • asp之家 软件编程 m.aspxhome.com