问题描述
在Android 8.0以上的设备集成推送SDK后,发现推送的信息接收不到,查看日志显示通知已经从服务端发送到客户端,但是并未创建通知。
问题原因
自Android 8.0(API Level 26)起,Android推出了NotificationChannel机制,旨在对通知进行分类管理。如果用户App的targetSdkVersion大于等于26,且并未设置NotificaitonChannel,那么创建的通知是不会弹出显示。
解决方案
阿里云提醒您:
- 如果您对实例或数据有修改、变更等风险操作,务必注意实例的容灾、容错能力,确保数据安全。 
- 如果您对实例(包括但不限于ECS、RDS)等进行配置与数据修改,建议提前创建快照或开启RDS日志备份等功能。 
- 如果您在阿里云平台授权或者提交过登录账号、密码等安全信息,建议您及时修改。 
阿里云移动推送自V3.1.1版本开始支持NotificationChannel机制,您可以参考以下接入步骤定位并解决问题:
集成新版SDK
- 集成移动推送SDK V3.1.1及其以上版本 
- 集成服务端OpenApi SDK V3.9.0及其以上版本: - <dependency> <groupId>com.aliyun</groupId> <artifactId>aliyun-java-sdk-push</artifactId> <version>3.9.0</version> </dependency>
注册NotificationChannel
参考以下代码,在客户端创建自己的NotificationChannel。具体调用位置为Application的onCreate,阿里云移动推送初始化前后都可以注册,详情请参见Demo。
注意:修改NotificationChannel后,App需要卸载重装才会生效。
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            NotificationManager mNotificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
            // 通知渠道的id。
            String id = "1";
            // 用户可以看到的通知渠道的名字。
            CharSequence name = "notification channel";
            // 用户可以看到的通知渠道的描述。
            String description = "notification description";
            int importance = NotificationManager.IMPORTANCE_HIGH;
            NotificationChannel mChannel = new NotificationChannel(id, name, importance);
            // 配置通知渠道的属性。
            mChannel.setDescription(description);
            // 设置通知出现时的闪灯(如果Android设备支持的话)。
            mChannel.enableLights(true);
            mChannel.setLightColor(Color.RED);
            // 设置通知出现时的震动(如果Android设备支持的话)。
            mChannel.enableVibration(true);
            mChannel.setVibrationPattern(new long[]{100, 200, 300, 400, 500, 400, 300, 200, 400});
            // 最后在notificationmanager中创建该通知渠道。
            mNotificationManager.createNotificationChannel(mChannel);
        }推送通知
利用OpenApi推送
在服务端推送时指定其NotificationChannelid,详情请参见如下代码:
    @Test
    public void testAdvancedPush() throws Exception {
       PushRequest pushRequest = new PushRequest();
       // 推送目标。
       pushRequest.setAppKey(appKey);
       pushRequest.setTarget("DEVICE"); // 推送目标。DEVICE:推送给设备、ACCOUNT:推送给指定账号、TAG:推送给自定义标签、ALL:推送给全部。
       pushRequest.setTargetValue("xxxxxxxxxxxxxxx"); 
       pushRequest.setPushType("NOTICE"); // 消息类型。取值为MESSAGE、NOTICE。
       pushRequest.setDeviceType("ANDROID"); // 设备类型。取值为ANDROID、iOS、ALL。
       // 推送配置。
       pushRequest.setTitle("ALi Push Title"); // 消息的标题。
       pushRequest.setBody("Ali Push Body"); // 消息的内容。
       // 推送配置:Android。
       pushRequest.setAndroidNotifyType("BOTH");//通知的提醒方式。VIBRATE:震动、SOUND:声音、BOTH:声音和震动、NONE:静音。
       pushRequest.setAndroidOpenType("APPLICATION"); //点击通知后动作。APPLICATION:打开应用、ACTIVITY:打开AndroidActivity、URL:打开URL、NONE:无跳转。
      // 指定notificaitonchannel id。
       pushRequest.setAndroidNotificationChannel("1"); 
      ......
    }利用阿里云控制台推送
- 登录EMAS管理控制台,选择移动推送产品进入。 
- 在移动推送产品页面,从左侧导航栏选择创建任务 > 推送通知,打开推送通知页面。 
- 填写通知ID,也就是上述客户端注册的NotificationChannel的id,然后单击推送通知即可。  
NotificationChannel注意事项
- 指定NotificationChannel后,通知的提醒方式(震动、声音等)均为NotificationChannel所指定的提醒方式,服务端的提醒方式配置不再生效。 
- NotificationChannel的通知权限,一般品牌是默认给权限的,但是OPPO和VIVO默认不给权限,需要开启权限。 
适用于
- 移动推送