3

У меня есть приложение для Android, где я использую какой-либо метод для отображения номера уведомления на значке приложения. Теперь я хочу установить этот номер при получении уведомления.FCM - Установка значка в onMessageReceived

Я думал, что должен установить номер при получении уведомления, поэтому я установил его внутри метода onMessageReceived. Но, моя проблема , когда мое приложение находится в фоновом режиме, метод onMessageReceived не вызывается, поэтому номер уведомления не установлен.

Ниже приведен мой код. Я установил номер внутри onMessageReceived. Я уже протестировал метод setBadge и могу проверить, что он работает. Проблема onMessageReceived не вызывается, поэтому setBadge также не вызывается, что не устанавливает номер.

@Override 
public void onMessageReceived(RemoteMessage remoteMessage) { 

    // TODO(developer): Handle FCM messages here. 
    Log.d(TAG, "From: " + remoteMessage.getFrom()); 
    Conts.notificationCounter ++; 
    //I am setting in here. 
    setBadge(getApplicationContext(),Conts.notificationCounter ); 
    Log.e("notificationNUmber",":"+ Conts.notificationCounter); 

    // Check if message contains a data payload. 
    if (remoteMessage.getData().size() > 0) { 
     Log.d(TAG, "Message data payload: " + remoteMessage.getData()); 
    } 

    // Check if message contains a notification payload. 
    if (remoteMessage.getNotification() != null) { 
     Log.d(TAG, "Message Notification Body: " + remoteMessage.getNotification().getBody()); 
    } 

    // Also if you intend on generating your own notifications as a result of a received FCM 
    // message, here is where that should be initiated. See sendNotification method below. 
} 
// [END receive_message] 



public static void setBadge(Context context, int count) { 
    String launcherClassName = getLauncherClassName(context); 
    if (launcherClassName == null) { 
     Log.e("classname","null"); 
     return; 
    } 
    Intent intent = new Intent("android.intent.action.BADGE_COUNT_UPDATE"); 
    intent.putExtra("badge_count", count); 
    intent.putExtra("badge_count_package_name", context.getPackageName()); 
    intent.putExtra("badge_count_class_name", launcherClassName); 
    context.sendBroadcast(intent); 
} 

public static String getLauncherClassName(Context context) { 

    PackageManager pm = context.getPackageManager(); 

    Intent intent = new Intent(Intent.ACTION_MAIN); 
    intent.addCategory(Intent.CATEGORY_LAUNCHER); 

    List<ResolveInfo> resolveInfos = pm.queryIntentActivities(intent, 0); 
    for (ResolveInfo resolveInfo : resolveInfos) { 
     String pkgName = resolveInfo.activityInfo.applicationInfo.packageName; 
     if (pkgName.equalsIgnoreCase(context.getPackageName())) { 
      String className = resolveInfo.activityInfo.name; 
      return className; 
     } 
    } 
    return null; 
} 

Когда я искал этот issue, я обнаружил, что если приходит сообщение дисплей сообщение затем onMessageReceived вызывается только если приложение на переднем плане. Но если появилось сообщение , то сообщение тогда onMessageReceived вызывается, даже если приложение является фоном.

Но мой друг сказал мне, кто отправляет уведомление (на стороне сервера), сообщение уже идет как как сообщение, так и сообщение данных. Он сказал, что объект данных заполнен.

Ниже приводится JSON для наступающего сообщения, это объект данные.

{ 
    "to":"my_device_id", 
    "priority":"high", 

    "notification":{ 
     "body":"Notification Body", 
     "title":"Notification Title", 
     "icon":"myicon", 
     "sound":"default" 
    }, 

    "data":{ 
     "Nick":"DataNick", 
     "Room":"DataRoom" 
    } 
} 

Если я использую только объект данных, onMessageReceived называется, как они сказали, но это уведомление время не появляется в верхней части.

Теперь почему onMessageReceived не вызывается, если сообщение также является информационным сообщением. Должен ли я делать что-то другое для обработки данных? Работает ли она так же, что и на клиентской стороне.

Любая помощь будет оценена по достоинству. Заранее спасибо.

+0

Почему downvote? Почему вы не комментируете, что случилось? – Hilal

+0

Вы должны указать коды, которые вы используете. Просто сказать, что сценарий не поможет. http://stackoverflow.com/help/mcve –

+0

Отправьте сюда код –

ответ

3

Нет способ вызова onMessageReceived если приход не включает в себя JSON полезной нагрузкитолько данные, как я узнал от Firebase поддержки.

Поэтому я должен использовать полезную нагрузку данных, но если вы используете данные, то это не отображает уведомление наверху, поэтому вы должны создать свое собственное уведомление с использованием данных полезной информации.

Так что я послал уведомление самого, когда я получаю полезную нагрузку данных в onMessageReceived. И я установил значок в onMessageReceived сразу после отправки уведомления самому себе.

Следующий код - окончательная версия.

@Override 
public void onMessageReceived(RemoteMessage remoteMessage) { 
    //for data payload 
    // Check if message contains a data payload. 
    if (remoteMessage.getData().size() > 0) { 

     Log.d(TAG, "Message data payload: " + remoteMessage.getData()); 
     title = remoteMessage.getData().get("title"); 
     sendNotification(remoteMessage.getData().get("body"), title); 
     badge = Integer.parseInt(remoteMessage.getData().get("badge")); 
     Log.e("notificationNUmber",":"+badge); 
     setBadge(getApplicationContext(), badge); 

    } 
    //for notification payload so I did not use here 
    // Check if message contains a notification payload. 
    if (remoteMessage.getNotification() != null) { 

     Log.d(TAG, "Message Notification Body: " + remoteMessage.getNotification().getBody()); 

    } 

    // Also if you intend on generating your own notifications as a result of a received FCM 
    // message, here is where that should be initiated. See sendNotification method below. 
} 
// [END receive_message] 

private void sendNotification(String messageBody, String title) { 
    Intent intent = new Intent(this, MainMenuActivity.class); 
    intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 
    PendingIntent pendingIntent = PendingIntent.getActivity(this, notify_no /* Request code */, intent, 
      PendingIntent.FLAG_ONE_SHOT); 
    if (notify_no < 9) { 
     notify_no = notify_no + 1; 
    } else { 
     notify_no = 0; 
    } 
    Uri defaultSoundUri= RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION); 
    NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(this) 
      .setSmallIcon(R.drawable.ic_launcher_3_web) 
      .setContentTitle(title) 
      .setContentText(messageBody) 
      .setAutoCancel(true) 
      .setSound(defaultSoundUri) 
      .setContentIntent(pendingIntent); 

    NotificationManager notificationManager = 
      (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); 

    notificationManager.notify(notify_no + 2 /* ID of notification */, notificationBuilder.build()); 
} 

Благодарим за всех.

+0

** метод setBadge по умолчанию? ** > setBadge (getApplicationContext(), значок); – Pratik

+0

Нет, это не так. Я использовал некоторые коды github. Setbadge является частью этого. – Hilal

-1

Android («ванильный» андроид без пользовательских пусковых установок и сенсорных интерфейсов) не позволяет изменять значок приложения, поскольку он плотно запечатан в .apk после компиляции программы. Невозможно изменить его программно с помощью стандартных API. Вы можете достичь своей цели, используя виджет вместо значка. Виджеты настраиваются. Прочтите следующее: http://www.cnet.com/8301-19736_1-10278814-251.html и этот номер http://developer.android.com/guide/topics/appwidgets/index.html. Также смотрите здесь: https://github.com/jgilfelt/android-viewbadger. Это может помочь вам.

+0

Номер моего уведомления работает, когда я устанавливаю номер вручную. Моя проблема в том, что я не могу установить его внутри onMessageReceived – Hilal

0

enter image description here

Android без пользовательских пусковых и сенсорных интерфейсов не позволяет изменять значок приложения, потому что она запечатана в .apk плотно, как только программа будет скомпилирована. Там нет никакого способа, чтобы изменить его на «вытяжке» программно с использованием стандарта APIs.So ниже код работает только в Samsung, Htc, Sony и т.д.

для получения дополнительной информации нажмите here

2

Чтобы сделать вещи при получении уведомления о -payloads в фоновом режиме, просто переопределите zzE в FirebaseMessagingService. Имя метода может меняться между версиями, просто введите @Override в класс и посмотрите, что он предлагает для вас. В моем случае я нашел zzD и zzE, и, попробовав их, я заметил, что zzE имеет нужные мне данные. У zzD было какое-то wakelock-stuff в его дополнениях. Возвращаемое значение zzE в основном указывает, было ли обработано уведомление, поэтому, если вы вернете true, ОС не будет отображать уведомление. Я предпочитаю возвращать super.zzE (намерение) после того, как выполнил свои действия, чтобы ОС обработала уведомление.

Обновление значка будет работать только на пусковых установках, поддерживаемых ShortcutBadger. Тем не менее, вы можете делать все, что захотите.

Вот мой код (мои уведомления содержат "значок" в полезной нагрузке данных):

public class PushNotificationService extends FirebaseMessagingService 
{ 
    @Override 
    public void onMessageReceived(RemoteMessage remoteMessage) 
    { 
     // This is called when the app is in the foreground 
     // Show a custom notification or send a broadcast to update the UI here 
    } 

    @Override 
    public boolean zzE(Intent intent) 
    { 
     if(intent.hasExtra("badge")) 
     { 
      try 
      { 
       ShortcutBadger.applyCount(getApplicationContext(), Integer.parseInt(intent.getStringExtra("badge")); 
      } 
      catch (Exception e) 
      { 
       Log.e("failedToParse", "Badge!?"); 
      } 
     } 
     // pass the intent through to the non-overriden zzE 
     // to show the default notification. 
     return super.zzE(intent); 

     // You could also show a custom notification here 
     // and return true instead of this if you 
     // don't want the default notifications. 
    } 

} 
+0

Человек, вы волшебник. спасибо за это –

+0

Не удалось найти zzE() – Mehta

+0

Это работает с firebase 10.2.1, в более поздних версиях этот метод был скрыт. Эта старая версия по-прежнему работает хорошо, поэтому я придерживаюсь этого, пока не появится другое решение. Я действительно не понимаю, почему они скрывают это, хотя я не вижу, какой вред он может сделать, чтобы разработчики могли переопределить способы отображения уведомлений ... –

Смежные вопросы