Android 8.0 版本更新的适配

作者: 代码君_Coder | 来源:发表于2018-01-23 10:31 被阅读421次

    最近代码君在测试公司的项目时候,发现项目在Android 8.0机型上运行的时候,版本更新功能会出现异常,启动下载的时候Android通知栏报错 : Failed to post notification on channel "null",根据字面意思应该是Notification中的channel为空

    Notification Channels 是什么

    这个是从Android 8.0 引入的概念,目的是提供统一的系统来帮助用户管理通知,开发者可以为需要发送的每个不同的通知类型创建一个通知渠道。还可以创建通知渠道来反映应用的用户做出的选择。例如,可以为聊天应用的用户创建的每个聊天组建立单独的通知渠道。

    Android 8.0 的用户可以使用一致的系统 UI 管理大多数与通知有关的设置,用过iPhone的就可以很好理解这个功能,就是以后Android的app,不能随意提示通知栏啦,用户可以设置消息在锁屏上显示、免打扰、消息震动提示、声音提示等,换句话说如果用户禁止在通知栏提示,那么apk就无法在通知栏提示了,这点对于Android用户来说是好事,省的一些app乱用权限,给用户一直弹消息

    如何使用Notification Channels

    一、创建通知渠道

      if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
                NotificationManager manager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
    
                NotificationChannel mChannel = new NotificationChannel("channel_01",
                        "消息推送", NotificationManager.IMPORTANCE_DEFAULT);
                manager.createNotificationChannel(mChannel);
            }
    

    NotificationChannel 方法有三个参数channel_id、channel_name、channel_importce,这几个参数的代表的是channel的ID,名字以及消息的重要等级,id和name都可以谁便起,id保证唯一就好,重要等级代码君就填写默认的啦

    二、创建完channel,调用Notification.Builder.build()

            Context context = DJApplication.getInstance();
            Notification.Builder builder = new Notification.Builder(context);
            builder.setTicker("开始下载");
            builder.setSmallIcon(R.mipmap.ic_launcher);
            builder.setLargeIcon(BitmapFactory.decodeResource(DJApplication.getInstance().getResources(), R.mipmap.ic_launcher));
            builder.setAutoCancel(true);
            PendingIntent pIntent = PendingIntent.getActivity(context, 0, new Intent(), PendingIntent.FLAG_UPDATE_CURRENT);
            builder.setContentTitle("下载中");
            builder.setContentIntent(pIntent);
            builder.setContentText(text);
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
                builder.setChannelId("channel_01");
            }
            manager.notify(1,  builder.build());
    

    builder.setChannelId 设置有效的通知渠道 ID,这个ID要和之前创建时候的Channel_ID相同,运行之后就不好报上面的错误啦

    Android 8.0 安装权限问题

    版本更新后,正常是需要通过Intent,调用apk文件路径,进行自动安装的,但是8.0 下载完文件,并没有调用成功,bug排查之后发现的问题是:

    在 Android 8.0 中,安装未知应用权限提高了安装未知来源应用时的安全性。此权限与其他运行时权限一样,会与应用绑定,在安装时进行提示,确保用户授予使用安装来源的权限后,此权限才会提示用户安装应用。在运行 Android 8.0 或更高版本的设备上使用此权限时,恶意下载程序将无法骗取用户安装未获得预先授权的应用,所以我们需要加入安装apk文件的权限

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

    总结

    目前发现Android 8.0 的坑就这些,如果读者发现有其他8.0 的坑,或者遇到8.0 的坑,欢迎留言交流

    相关文章

      网友评论

      本文标题:Android 8.0 版本更新的适配

      本文链接:https://www.haomeiwen.com/subject/fuijaxtx.html