安卓开发相关Android开发经验谈Android开发

Android 8.0 版本更新的适配

2018-01-23  本文已影响421人  代码君_Coder

最近代码君在测试公司的项目时候,发现项目在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 的坑,欢迎留言交流

上一篇下一篇

猜你喜欢

热点阅读