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