Android Pie 无法接收百度推送通知

Posted

技术标签:

【中文标题】Android Pie 无法接收百度推送通知【英文标题】:Unable to receive Baidu push notification in Android Pie 【发布时间】:2019-06-13 09:45:52 【问题描述】:

我在我的 android 应用中实现了Baidu push notifications。无论应用程序是否正在运行,推送通知在旧版本的 Android 之前都可以正常工作。但是,在Android Pie (Android-9) 中,我只能在应用程序位于前台或后台堆栈中获得推送通知。

如果应用程序从应用程序的后台堆栈中删除,则应用程序不会收到通知。

我使用的是最新版本的百度推送 SDK,下载自: https://push.baidu.com/sdk/push_client_sdk_for_android

我在 Android Pie 上尝试了官方百度推送 SDK 包中的示例。但我面临同样的问题。如果应用在前台或后台堆栈中,我们会收到通知,否则我们不会收到通知。

下面是我的推送通知接收器类:

public class BaiduPushReceiver extends PushMessageReceiver 

    Context mContext;
    public static final int NOTIFICATION_ID = 1;
    NotificationCompat.Builder builder;
    private NotificationManager mNotificationManager;

    @Override
    public void onBind(Context context, int errorCode, String appid,
                       String userId, String channelId, String requestId)
        Log.d("MY_APP","----*-*-*-*-*-* ChannelID:"+channelId+"*-*-*-*-*-------");
        Log.d("MY_APP","ErrorCode:"+errorCode+"  AppId:"+appid+"   UserId:"+userId+"  ChannelId:"+channelId+"  RequestId:"+requestId);

        SharedPreferencesManager.storeValue(SharedPreferencesManager.DEVICE_TOKEN, channelId);
    
    private void sendNotification(String msgContent, Context context)
    
        Bundle extra = new Bundle();
        extra.putString("message_data",msgContent);
        String message="";
        String type;
        String id;
        try
            JSONObject jsob = new JSONObject(msgContent);
            String description = jsob.getString("description");
            jsob = new JSONObject(description);
            message = jsob.getString("message");
            type = jsob.getString("type");
            id = jsob.getString("id");
            Log.d("MY_APP","Message:"+message);
            Log.d("MY_APP","Type:"+type);
            Log.d("MY_APP","Id:"+id);
        
        catch (Exception e)
        
            e.printStackTrace();
        


        Uri alarmSound = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);

        Intent intent;

        if(SharedPreferencesManager.isEmpty(SharedPreferencesManager.TOKEN))
            intent = new Intent(context, poiuy.class);
        else
            intent = new Intent(context, asdf.class);

        intent.putExtras(extra);

        PendingIntent contentIntent = PendingIntent.getActivity(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);

        try 
            message = java.net.URLDecoder.decode(message, "UTF-8");

         catch (UnsupportedEncodingException e) 
            e.printStackTrace();
        

        mNotificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);

        //contentIntent.put("NotificationMessage", notificationMessage);

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) 
            NotificationChannel notificationChannel = new NotificationChannel("MY_APP_CHANNEL_1", "my app Channel", NotificationManager.IMPORTANCE_HIGH);
            notificationChannel.setVibrationPattern(new long[]500, 500, 500, 500);
            mNotificationManager.createNotificationChannel(notificationChannel);
            NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(context,"MY_APP_CHANNEL_1")
                    .setSmallIcon(R.drawable.ic_launcher)
                    .setContentTitle(context.getString(R.string.app_name))
                    .setStyle(new NotificationCompat.BigTextStyle().bigText(message))
                    .setContentText(message)
                    .setVibrate(new long[]500, 500, 500, 500)
                    .setSound(alarmSound)
                    .setAutoCancel(true)
                    .setContentIntent(contentIntent);
            mNotificationManager.notify(NOTIFICATION_ID, mBuilder.build());
        
        else
        
            NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(context)
                    .setSmallIcon(R.drawable.ic_launcher)
                    .setContentTitle(context.getString(R.string.app_name))
                    .setStyle(new NotificationCompat.BigTextStyle().bigText(message))
                    .setContentText(message)
                    .setVibrate(new long[]500, 500, 500, 500)
                    .setSound(alarmSound)
                    .setAutoCancel(true)
                    .setContentIntent(contentIntent);

            mNotificationManager.notify(NOTIFICATION_ID, mBuilder.build());
        
    
        @Override
    public void onUnbind(Context context, int i, String s) 

    

    @Override
    public void onSetTags(Context context, int i, List<String> list, List<String> list1, String s) 

    

    @Override
    public void onDelTags(Context context, int i, List<String> list, List<String> list1, String s) 

    

    @Override
    public void onListTags(Context context, int i, List<String> list, String s) 

    

    @Override
    public void onMessage(Context context, String s, String s1) 
        Log.d("MY_APP","OnMessage Called......"+"\nS="+s+"\ns1="+s1);
        sendNotification(s,context);
    

    @Override
    public void onNotificationClicked(Context context, String s, String s1, String s2) 
        Log.d("BAIDU_PUSH","OnNotificationClicked called......");
    

    @Override
    public void onNotificationArrived(Context context, String s, String s1, String s2) 
        Log.d("BAIDU_PUSH","onNotificationArrived called......");
    

在上述代码中,如果应用未运行(前台或后台),则不会调用 onMessage(...) 回调方法本身。

附:请注意,这与Oreo 中引入的Notification Channels 无关,因为我已经在我的应用程序中处理了这个问题,并且在 Push SDK 示例中也处理了同样的问题。

在 Android Oreo 和 Pie 中处理此问题的任何修复/解决方法都会非常有帮助。

谢谢。

【问题讨论】:

嗨,Zax,您找到解决此问题的任何方法或解决方法了吗? 我猜这是因为 Android O 引入了一些后台优化。 @Sparkzz:我唯一能做的解决方法是通过将前台服务与通知相关联来运行它。同样在电话启动时,您需要 srart 此服务。这可确保应用程序的一部分始终在运行,并且您将能够接收通知。我知道这是一个非常糟糕的解决方案,但我找不到任何其他方法。如果您找到了,请将其添加为答案。 【参考方案1】:

我在使用百度推送 SDK 时也遇到了同样的问题。由于自 Android O 以来对应用程序强制执行电池优化,许多设备在终止状态下无法接收来自百度的消息。当我撤销应用程序的所有电池优化限制时,它开始在终止状态下工作。

我建议您使用 FCM 而不是百度推送通知。它的性能总是比百度好。

【讨论】:

是的,FCM 在那里不工作,但你可以尝试其他供应商,如小米推送和华为推送。我一直在用小米推送服务,比百度好用。但与百度一样,某些设备的通知无法在终止状态下工作。

以上是关于Android Pie 无法接收百度推送通知的主要内容,如果未能解决你的问题,请参考以下文章

无法从 android 上的解析推送通知接收额外数据

无法使用 Parse 在 Android 中接收推送通知

当应用程序被杀死Android时无法接收解析推送通知

Android - 所有 Android 版本都可以接收 Firebase 推送通知吗

IONIC FCM推送通知ios,无法接收

怎样做点击推送消息,跳转到指定页面