【问题标题】:Notification android on foreground not displayed (Oreo)未显示前台通知android(奥利奥)
【发布时间】:2018-02-09 08:10:45
【问题描述】:

当应用位于前台时,我正在尝试使用 firebase 显示通知。当我从服务器推送通知时调用了 onMessageReceived 方法,但通知不显示

这是我的代码:

public class MyFirebaseMessagingService extends FirebaseMessagingService {

    @Override
    public void onMessageReceived(final RemoteMessage remoteMessage) {
        Timber.d("FCM-From: " + remoteMessage.getFrom());

            new Handler(Looper.getMainLooper()).post(new Runnable() {
                public void run() {
                    if (remoteMessage.getNotification() != null) {
                        Timber.d("FCM-Message Notification Body: " + remoteMessage.getNotification().getBody());

                        NotificationCompat.Builder builder = new  NotificationCompat.Builder(
                                getApplicationContext(), "CHANNEL_NOTIF")
                                .setSmallIcon(R.mipmap.ic_launcher)
                                .setContentTitle("test")
                                .setContentText("test content");
                        NotificationManager manager = (NotificationManager)     getSystemService(NOTIFICATION_SERVICE);
                        if (manager != null) {
                            Timber.d("FCM-Notif");
                            manager.notify(1, builder.build());
                        }
                    }
                }
            });
    }
}

在我的 logcat 中我可以看到:

FCM-消息通知正文:202018105166

FCM-发件人:1049809400953

FCM 通知

我关注了https://developer.android.com/training/notify-user/build-notification.html#builder

我在奥利奥上跑步

解决方案

在这里找到答案:Android foreground service notification not showing

这是奥利奥的问题,感谢@Yashaswi N P

【问题讨论】:

  • 我尝试使用 ".setContentText("content")" 但不起作用
  • 是的,我得到了 null,真正的内容在 remoteMessage.getNotification().getBody()

标签: android firebase push-notification firebase-cloud-messaging android-8.0-oreo


【解决方案1】:

发生这种情况是因为 Android Oreo 和更高的 API 级别。因此,您必须在 Android 8.0 及更高版本上发布任何通知之前创建通知通道,您应该在应用启动后立即执行此代码。重复调用它是安全的,因为创建现有通知通道不会执行任何操作。

并使用以下代码解决此问题:

public class MyFirebaseMessagingService extends FirebaseMessagingService {

    private static final String TAG = MyFirebaseMessagingService.class.getSimpleName();
    private NotificationUtils notificationUtils;
    private String title,message,click_action;
    private  String CHANNEL_ID = "MyApp";

    @Override
    public void onMessageReceived(RemoteMessage remoteMessage) {

        // Check if message contains a data payload.
        if (remoteMessage.getData().size() > 0) {

            try {
                JSONObject data = new JSONObject(remoteMessage.getData());
            } catch (JSONException e) {
                e.printStackTrace();
            }
        }

        // Check if message contains a notification payload.
        if (remoteMessage.getNotification() != null) {
             title = remoteMessage.getNotification().getTitle(); //get title
             message = remoteMessage.getNotification().getBody(); //get message
             click_action = remoteMessage.getNotification().getClickAction(); //get click_action

            Log.d(TAG, "Notification Title: " + title);
            Log.d(TAG, "Notification Body: " + message);
            Log.d(TAG, "Notification click_action: " + click_action);

            sendNotification(title, message,click_action);
        }
    }

    private void sendNotification(String title,String messageBody, String click_action) {
        Intent intent = new Intent(this, TargetActivity.class);
        intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);

        PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, intent, 0);

        NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(this, CHANNEL_ID)
                .setSmallIcon(R.drawable.logo_heart)
                .setContentTitle(title)
                .setContentText(messageBody)
                .setPriority(NotificationCompat.PRIORITY_DEFAULT)
                .setContentIntent(pendingIntent)// Set the intent that will fire when the user taps the notification
                .setAutoCancel(true);

        NotificationManagerCompat notificationManager = NotificationManagerCompat.from(this);

        // notificationId is a unique int for each notification that you must define
        notificationManager.notify(1, mBuilder.build());

        createNotificationChannel();
    }

    private void createNotificationChannel() {
        // Create the NotificationChannel, but only on API 26+ because
        // the NotificationChannel class is new and not in the support library
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            CharSequence name = getString(R.string.app_name);
            String description = getString(R.string.description);
            int importance = NotificationManager.IMPORTANCE_DEFAULT;
            NotificationChannel channel = new NotificationChannel(CHANNEL_ID, name, importance);
            channel.setDescription(description);
            // Register the channel with the system; you can't change the importance or other notification behaviors after this
            NotificationManager notificationManager = getSystemService(NotificationManager.class);
            notificationManager.createNotificationChannel(channel);
        }
    }

}

【讨论】:

    【解决方案2】:

    在这里找到答案:Android foreground service notification not showing

    需要用奥利奥处理频道

       mNotifyManager = (NotificationManager) mActivity.getSystemService(Context.NOTIFICATION_SERVICE);
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) createChannel(mNotifyManager);
        mBuilder = new NotificationCompat.Builder(mActivity, "YOUR_TEXT_HERE").setSmallIcon(android.R.drawable.stat_sys_download).setColor
                (ContextCompat.getColor(mActivity, R.color.colorNotification)).setContentTitle(YOUR_TITLE_HERE).setContentText(YOUR_DESCRIPTION_HERE);
        mNotifyManager.notify(mFile.getId().hashCode(), mBuilder.build());
    
    @TargetApi(26)
    private void createChannel(NotificationManager notificationManager) {
        String name = "FileDownload";
        String description = "Notifications for download status";
        int importance = NotificationManager.IMPORTANCE_DEFAULT;
    
        NotificationChannel mChannel = new NotificationChannel(name, name, importance);
        mChannel.setDescription(description);
        mChannel.enableLights(true);
        mChannel.setLightColor(Color.BLUE);
        notificationManager.createNotificationChannel(mChannel);
    }
    

    感谢@Yashaswi N P

    【讨论】:

      【解决方案3】:

      下面提到的代码行 sn-p 将帮助您修复它:

      if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
      
      int importance = NotificationManager.IMPORTANCE_HIGH;
      NotificationChannel mChannel = new 
      NotificationChannel(NOTIFICATION_CHANNEL_ID, title, importance);
      mChannel.setDescription(notification);
      mChannel.enableLights(true);
      mChannel.setLightColor(ContextCompat.getColor
      (getApplicationContext(),R.color.colorPrimary));
      notificationManager.createNotificationChannel(mChannel);
      
      }
      

      我在我的项目中使用了这个代码sn-p,它确实解决了这个问题。

      【讨论】:

        【解决方案4】:

        我在清单文件中添加了以下权限。

        我的问题解决了。

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

        【讨论】:

          猜你喜欢
          • 2017-08-22
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多