适配Android8.0无法弹出覆盖安装界面

本文详细介绍了如何解决在Android 8.0系统上进行应用版本更新时遇到的无法覆盖安装的问题。通过添加特定权限并在代码中判断是否允许安装未知来源应用,最终实现了在8.0系统上的完美版本更新。

记录一下做版本更新时候无法弹出覆盖安装界面,测试用Android8.0以下的系统是可以覆盖安装成功的,所以证明6.0的动态权限和7.0的文件读取权限是没问题的,后来google一下,发现8.0添加了新的安全措施,不允许应用内安装未经过Google play验证的应用,所以我们又得针对8.0系统做适配。

  • 在清单文件中添加如下权限:
<uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES"/> 
  • 判断是否已经获取到允许安装未知应用
    在8.0中的PackageManager类中多了 canRequestPackageInstalls() 这个方法来检查是否已经获取到允许安装未知应用,所以我们在代码中只需要通过调用packageManager.canRequestPackageInstalls()返回的boolean值来判断是否能进行下一步安装,伪代码如下:
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            boolean canInstall = getPackageManager().canRequestPackageInstalls();
            if (canInstall) {
               installApk();
            } else {
                //请求安装未知应用来源的权限
                ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.REQUEST_INSTALL_PACKAGES}, 0);
            }
        } else {
            installApk();
        }
  • 引导用户跳转到 安装未知应用 界面
    如果用户是首次更新,则canRequestPackageInstalls()默认返回false,所以我们要引导用户跳转到 安装未知应用 界面
startActivity(Intent(Settings.ACTION_MANAGE_UNKNOWN_APP_SOURCES))

进过如上步骤,那么版本更新就可以在8.0系统上完美的运行了。



作者:haegyeong
链接:https://www.jianshu.com/p/c48e391d3054
来源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

### 通知渠道的基本概念 从 Android 8.0(API 26)开始,系统引入了**通知渠道**(Notification Channels)机制。通过这一功能,开发者可以将不同类型的通知划分为多个渠道,并允许用户对每个渠道进行独立设置,例如开启或关闭、调整优先级等[^2]。这种分类方式使得用户能够更精细地控制应用的通知行为,同时也提升了用户体验。 如果一个应用只定义了一个通知渠道,则在系统通知管理界面中不会显示具体的渠道名称;而当应用创建了多个渠道时,系统会展示每个渠道的名称,方便用户进行个性化配置[^1]。 --- ### 创建与配置通知渠道 在 Android 8.0 及以上版本中,必须为每一个通知分配一个已注册的通知渠道 ID,否则通知将无法显示。以下是创建通知渠道的标准方法: ```java if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { NotificationChannel channel = new NotificationChannel( "channel_id", // 渠道唯一标识符 "渠道名称", // 用户可见的渠道名称 NotificationManager.IMPORTANCE_DEFAULT // 重要性级别 ); channel.setDescription("这是一个示例通知渠道"); channel.enableLights(true); // 启用指示灯 channel.setLightColor(Color.RED); // 设置指示灯颜色 channel.enableVibration(true); // 启用震动 channel.setVibrationPattern(new long[]{100, 200, 300, 400}); // 设置震动模式 NotificationManager manager = context.getSystemService(NotificationManager.class); manager.createNotificationChannel(channel); } ``` 其中,`importance` 参数用于设定通知的重要性等级,可选值包括 `IMPORTANCE_HIGH`、`IMPORTANCE_DEFAULT`、`IMPORTANCE_LOW` 和 `IMPORTANCE_MIN`,分别对应不同的提示行为[^5]。 --- ### 多渠道管理与用户自定义 开发者可以通过创建多个通知渠道来区分不同类别的通知内容,例如“消息通知”、“系统提醒”、“订阅更新”等。这样可以让用户选择性地屏蔽某些非关键通知,而不影响其他类型的通知体验[^3]。 此外,在系统设置中,用户可以长按某个通知以更改其关联渠道的行为,也可以进入应用通知设置页面对各个渠道进行详细配置,如设置声音、震动模式和是否允许弹出通知等[^4]。 --- ### 兼容性处理与适配建议 为了确保通知在 Android 8.0 以下设备上也能正常工作,需要根据 API 级别动态判断是否启用通知渠道机制。对于低于 API 26 的设备,系统会忽略通知渠道的设置,所有通知都会按照默认方式处理。 在实际开发过程中,建议遵循以下最佳实践: - **合理划分通知类别**,避免创建过多冗余渠道。 - **提供清晰的渠道描述**,帮助用户理解每个渠道的作用。 - **动态更新渠道设置**,根据用户的反馈或使用场景调整通知策略。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值