NotificationManager.notify создает уведомления, в которых *изначально* отсутствует contentText

При публикации push-уведомления в списке/панели уведомлений .contentText и .number изначально не отображаются (.ticker, .icon и .contentTitle отображаются нормально). Однако после публикации другого уведомления (с другим идентификатором), когда первое удаляется в списке, оно отображает текст и номер содержимого. А то в новом отсутствует текст и так далее.

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

Проблема возникает только на некоторых устройствах — в основном на планшетах Nexus (под управлением 4.2.2). На большинстве телефонов работает нормально. На любом данном устройстве он либо всегда работает, либо никогда не работает. В этом смысле он не прерывистый.

Вот код, который отвечает на push-уведомления и отправляет сообщения в центр уведомлений.

public class GcmBroadcastReceiver extends BroadcastReceiver {
   static final String TAG = "GmcBroadcastReceiver";
   Context ctx;

   @Override
   public void onReceive(Context context, Intent intent) {
       GoogleCloudMessaging gcm = GoogleCloudMessaging.getInstance(context);
       ctx = context;
       String messageType = gcm.getMessageType(intent);
       if (GoogleCloudMessaging.MESSAGE_TYPE_SEND_ERROR.equals(messageType)) 
           Log.i(TAG, "PUSH RECEIVED WITH ERROR: " + intent.getExtras().toString());
       else if (GoogleCloudMessaging.MESSAGE_TYPE_DELETED.equals(messageType)) 
           Log.i(TAG, "DELETED PUSH MESSAGE: " + intent.getExtras().toString());
       else
       {
           Log.i(TAG, "Received PUSH: " + intent.getExtras().toString());
           if (MyApp.isAppForeground == false)
              postNotification(intent.getExtras());
       }
       setResultCode(Activity.RESULT_OK);
   }

  // post GCM message to notification center.
  private void postNotification(Bundle data) {
     String msg = data.getString("alert");
     Log.i(TAG, "message: " + msg);

     if (msg == null)  // on app startup, this was always getting called with empty message
        return;

     int badge = Integer.parseInt(data.getString("badge","0"));

     Intent intent = new Intent(ctx, WordChums.class);
     PendingIntent contentIntent = PendingIntent.getActivity(ctx, 0, intent, 0); //, data);

     Uri sound = Uri.parse("android.resource://com.peoplefun.wordchums/raw/push");
     NotificationCompat.Builder builder = new NotificationCompat.Builder(ctx)
     .setSmallIcon(R.drawable.ic_stat_gcm)
     .setContentTitle("Word Chums")
     .setContentText(msg)
     .setTicker(msg)
     .setStyle(new NotificationCompat.BigTextStyle())
     .setAutoCancel(true)
     .setOnlyAlertOnce(true)
     .setSound(sound)
     .setDefaults(Notification.DEFAULT_VIBRATE); 
     if (badge > 0)
        builder.setNumber(badge);

     builder.setContentIntent(contentIntent);
     NotificationManager notificationManager = (NotificationManager)ctx.getSystemService(Context.NOTIFICATION_SERVICE);
     notificationManager.notify((int)System.currentTimeMillis(), builder.build());
  }
}

Записи журнала, которые печатаются, соответствуют ожиданиям.

I/GmcBroadcastReceiver( 2081): Received PUSH: Bundle[{gm=37206155, collapse_key=do_not_collapse, alert=TestUser said: 'Message 1', sound=push, badge=6, from=550952899880, pfok=1, ct=1}]
I/GmcBroadcastReceiver( 2081): message: TestUser said: 'Message 1'
I/GmcBroadcastReceiver( 2081): Received PUSH: Bundle[{gm=37206155, collapse_key=do_not_collapse, alert=TestUser said: 'Message 2', sound=push, badge=6, from=550952899880, pfok=1, ct=1}]
I/GmcBroadcastReceiver( 2081): message: TestUser said: 'Message 2'
I/GmcBroadcastReceiver( 2081): Received PUSH: Bundle[{gm=37206155, collapse_key=do_not_collapse, alert=TestUser said: 'Message 3', sound=push, badge=6, from=550952899880, pfok=1, ct=1}]
I/GmcBroadcastReceiver( 2081): message: TestUser said: 'Message 3'



Ответы (3)


Возможно, что ваш contentText не отображается на устройствах, поддерживающих стиль большого текста, потому что вы установили стиль BigTextStyle без установки большого текста.

Вместо

.setStyle(new NotificationCompat.BigTextStyle())

Тебе стоит попробовать

.setStyle(new NotificationCompat.BigTextStyle().bigText(msg))

Это объясняет, почему на некоторых устройствах вы не сталкиваетесь с проблемой:

NotificationCompat.BigTextStyle

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

И это объясняет, почему на некоторых устройствах вы делаете:

public NotificationCompat.BigTextStyle bigText (CharSequence cs)

Укажите более длинный текст, который будет отображаться в большой форме шаблона вместо текста содержимого.

Цитаты взяты из здесь.

person Eran    schedule 23.08.2013
comment
Да, изменение этой одной строки - это именно то, что исправило это. На устройстве, которое поддерживает большой стиль, и когда уведомление находится сверху, оно отображает bigText вместо contentText. - person leontx; 24.08.2013

NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(this)
.setSmallIcon(R.drawable.notification_icon)
.setContentTitle("Event tracker")
.setContentText("Events received")

NotificationCompat.InboxStyle inboxStyle =
    new NotificationCompat.InboxStyle();

String[] events = new String[6];
// Sets a title for the Inbox style big view
inboxStyle.setBigContentTitle("Event tracker details:");
...
// Moves events into the big view
for (int i=0; i < events.length; i++) {

    inboxStyle.addLine(events[i]);
}
// Moves the big view style object into the notification object.
mBuilder.setStyle(inBoxStyle);
...
// Issue the notification here.

См. раздел уведомления Android.

person Kirit Vaghela    schedule 23.08.2013
comment
Я не пробовал этот код, но, возможно, он тоже сработал (+1). Но одно изменение строки Эрана было кратким исправлением. - person leontx; 24.08.2013

Проверьте поле msg, сохранив syso или отладив. Я думаю, что это может быть пустая строка, которую вы получаете.

(or)

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

NotificationCompat.Builder nBuilder;
    Uri alarmSound = RingtoneManager
            .getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
    nBuilder = new NotificationCompat.Builder(context)
            .setSmallIcon(R.drawable.ic_launcher)
            .setContentTitle("Kluebook - " + keys)
            .setLights(Color.BLUE, 500, 500).setContentText(message)
            .setAutoCancel(true).setTicker("Notification from kluebook")
            .setVibrate(new long[] { 100, 250, 100, 250, 100, 250 })
            .setSound(alarmSound);
    Intent resultIntent = null;
    resultIntent = new Intent(context, MainLoginSignUpActivity.class);
    PendingIntent resultPendingIntent = PendingIntent.getActivity(context,
            notify_no, resultIntent, PendingIntent.FLAG_UPDATE_CURRENT);
    if (notify_no < 9) {
        notify_no = notify_no + 1;
    } else {
        notify_no = 0;
    }
    nBuilder.setContentIntent(resultPendingIntent);
    NotificationManager nNotifyMgr = (NotificationManager) context
            .getSystemService(context.NOTIFICATION_SERVICE);
    nNotifyMgr.notify(notify_no + 2, nBuilder.build());
}
person Kartheek s    schedule 23.08.2013