Повідомлення Android не відображається


115

Мені потрібна програма, яка додасть сповіщення на Android. І коли хтось натискає на сповіщення, це повинно привести їх до моєї другої діяльності.

Я встановив код. Повідомлення має працювати, але з певних причин воно не працює. Це Notificationне відображається зовсім. Я не знаю, чого мені не вистачає.

Код цих файлів:

Notification n = new Notification.Builder(this)
        .setContentTitle("New mail from " + "test@gmail.com")
        .setContentText("Subject")
        .setContentIntent(pIntent).setAutoCancel(true)
        .setStyle(new Notification.BigTextStyle().bigText(longText))
        .build();

NotificationManager notificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
// Hide the notification after it's selected

notificationManager.notify(0, n);

будь ласка, спробуйте бути більш стислими, коли ви ставите запитання. Ви не зазначаєте те, що не працює. Насправді ви навіть не згадуєте, що щось не працює. Чи Activityне запущено? Чи NotificationНЕ показувати?
slinden77

3
@dmmh я сказав у своєму питанні, у чому моя проблема! І я не знайшов нічого поганого в питанні. Моє запитання було конкретним щодо проблеми. Якщо ви не фахівець, не потрібно кидатись! І відповідь tato469 була чудовою.
Choudhury AM

3
Я вказую, що ціль цього веб-сайту не в тому, щоб ви вирішили свої проблеми, а в тому, щоб інші могли знайти рішення і для проблем. Я не тикаю. Мені шкода, що я зашкодив вашим почуттям, але факт у тому, що ваше питання було неправильним, відповідь було неправильним, і вся ця оманлива інформація призведе до інших початківців програмістів, які мають те саме питання, що ви описуєте, вдаючись до спроб рішення, які не працюють. на основі коду, який ви надали. Це ні в якому разі не стосується чи ні, я я експерт чи ні. Тим більше не з того, що я правий, ваше запитання розпливчасте, а інша відповідь - неправильна.
slinden77

Я прошу видалити це питання та відповідь, оскільки це вводить в оману. Гарного дня.
slinden77

1
змінив питання, щоб люди могли зрозуміти, у чому проблема.
Choudhury AM

Відповіді:


412

Код не працюватиме без піктограми. Отже, додайте setSmallIconвиклик до ланцюжка будівельника так, щоб він працював:

.setSmallIcon(R.drawable.icon)

Android Oreo (8.0) та вище

Android 8 представив нову вимогу налаштування channelIdвластивості за допомогою NotificationChannel.

private NotificationManager mNotificationManager;

NotificationCompat.Builder mBuilder =
    new NotificationCompat.Builder(mContext.getApplicationContext(), "notify_001");
Intent ii = new Intent(mContext.getApplicationContext(), RootActivity.class);
PendingIntent pendingIntent = PendingIntent.getActivity(mContext, 0, ii, 0);

NotificationCompat.BigTextStyle bigText = new NotificationCompat.BigTextStyle();
bigText.bigText(verseurl);
bigText.setBigContentTitle("Today's Bible Verse");
bigText.setSummaryText("Text in detail");

mBuilder.setContentIntent(pendingIntent);
mBuilder.setSmallIcon(R.mipmap.ic_launcher_round);
mBuilder.setContentTitle("Your Title");
mBuilder.setContentText("Your text");
mBuilder.setPriority(Notification.PRIORITY_MAX);
mBuilder.setStyle(bigText);

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

// === Removed some obsoletes
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O)
{
    String channelId = "Your_channel_id";
    NotificationChannel channel = new NotificationChannel(
                                        channelId,
                                        "Channel human readable title",
                                        NotificationManager.IMPORTANCE_HIGH);
   mNotificationManager.createNotificationChannel(channel);
  mBuilder.setChannelId(channelId);
}

mNotificationManager.notify(0, mBuilder.build());

Як отримати CHANNEL_ID? будь ласка, допоможіть
Ананта Прасад

@LAnantaPrasad CHANNEL_ID призначений для вас ідентифікатором. Це групування сповіщень, як, наприклад, розмова в чаті або груповий чат.
Кейсі Даніель

Спасибі, setChannelIdпотрібні. Перш ніж додати це, сповіщення відображається на моєму пристрої SONY, але не на пристрої SAMSUNG.
Веселі


2
Також включіть чек, if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.O){ mBuilder.setChannelId(channelId); }оскільки без цієї перевірки повідомлення не з’явиться, навіть якщо API вашого пристрою> = 26.
Koushik Shom Choudhury

58

Насправді відповідь Ернандо Валле не здається правильною. Знову ж таки, ваше запитання є надто розпливчастим, оскільки ви не можете згадати, що не так чи не працює.

Дивлячись на ваш код, я припускаю, що Notificationпросто не відображається.

Ваше повідомлення не відображається, оскільки ви не вказали значок. Незважаючи на те, що в документації SDK не зазначається, що вона потрібна, вона насправді дуже велика і Notificationбез неї не з’явиться.

addActionдоступний лише з 4.1. До цього ви будете використовувати PendingIntentдля запуску Activity. Ви, схоже, вказуєте а PendingIntent, тому ваша проблема полягає в іншому місці. За логікою, слід зробити висновок, що це значок, що відсутній.


Я знайшов це питання. Але дякую за належну відповідь. Я дуже ціную вашу допомогу.
Choudhury AM

1
Ви сказали, що addAction доступний лише з 4.1, але це неправильно, я використовував його в 2.3. У довідковому посібнику йдеться про кнопку, а не про сповіщення: "Кнопки дій не з'являться на платформах до Android 4.1." Ви можете перевірити тут: AddAction включений у android.support.v4.app
naernando Valle

1
ОП використовує Notification.Builder, не так NotificationCompat.Builder, як ви пропонуєте. Тільки тому, що є бібліотека сумісності, і її можна використовувати, не означає, що функція доступна у звичайному API. Посилання, яке ви надаєте, фактично обумовлює це. Це питання чітко пов'язане Notification.Builder, як показує приклад. І бібліотека сумісності, ймовірно, включала цю функцію лише після того, як 4.1 був доступний. Ваша відповідь вводить в оману, оскільки зараз ви припускаєте, що вона доступна з 2.3.
slinden77

Вибачте, якщо я
пропустив помилку

4
Зігніть іконку !! Навіть не зрозумів, що він відсутній, але додавши це вирішив проблему. Не побачивши в консолі нічого корисного про відсутню піктограму, здається, мовчки виходять з ладу.
Піт

33

Ви пропустили маленьку іконку. Я зробив ту саму помилку і вищевказаний крок вирішив її.

Відповідно до офіційної документації: Об’єкт сповіщення повинен містити:

  1. Невеликий значок, встановлений setSmallIcon ()

  2. Назва, встановлена setContentTitle ()

  3. Детальний текст, встановлений setContentText ()

  4. На ОС Android 8.0 (рівень API 26) і вище - дійсний ідентифікатор каналу сповіщень, встановлений setChannelId () або наданий у конструкторі NotificationCompat.Builder при створенні каналу.

Див. Http://developer.android.com/guide/topics/ui/notifiers/notifications.html


3
Це не правда. Якщо ви використовуєте спеціальний макет сповіщень за допомогою setContent, не потрібно вказати заголовка чи тексту.
Рей Лі

11

Це спричинило мене сьогодні, але я зрозумів, що це тому, що на Android 9.0 (Pie) за замовчуванням « Не турбуй» також ховаються всі сповіщення, а не просто замовчувати їх, як в Android 8.1 (Oreo) та раніше. Це не стосується сповіщень.

Мені подобається увімкнути DND для свого пристрою розробки, тому входження в налаштування DND та зміна налаштування просто заглушити сповіщення (але не приховувати їх) зафіксував це для мене.


9

Створення каналів сповіщень є обов'язковим для версій Android після Android 8.1 (Oreo), щоб зробити сповіщення видимими. Якщо сповіщення не відображаються у вашій програмі для Oreo + Androids, вам потрібно викликати таку функцію, коли ваш додаток запускається -

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.channel_name);
        String description = getString(R.string.channel_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 behaviours after this
        NotificationManager notificationManager =
        getSystemService(NotificationManager.class);
        notificationManager.createNotificationChannel(channel);
   }
}

1

Я думаю, що ти забув

addAction(int icon, CharSequence title, PendingIntent intent)

Подивіться тут: Додати дію


1
метод addAction()недоступний на Notification.Builder.
slinden77

1
Вона існує, але застаріла. Натомість ви можете передавати Actionекземпляр, який ви можете створити Notification.Action.Builder. PS, Завжди використовуйте альтернативу Compat (тобто NotificationCompat), оскільки Google прагне виправити помилки та забезпечити кращу сумісність з ними
Gökhan Barış Aker

Якщо ви не хочете вказувати жодних дій, просто скористайтеся .setContentIntent(null)програмою-конструктором.
Gökhan Barış Aker

1

У мене була така ж проблема з моїм додатком Android. Я випробовував сповіщення і виявив, що сповіщення відображаються на моєму емуляторі Android, на якому працює система Android 7.0 (Nougat), тоді як він не працював на моєму телефоні з ОС Android 8.1 (Oreo).

Прочитавши документацію, я виявив, що Android має функцію під назвою канал сповіщень, без якого сповіщення не з’являтимуться на пристроях Oreo. Нижче посилання на офіційну документацію Android на каналах сповіщень.


1

Для мене це було проблемою deviceToken. Перевірте, чи належним чином оновлено маркер приймача та відправника пристрою у вашій базі даних або де б ви не отримували доступ до нього, щоб надсилати сповіщення.

Наприклад, скористайтеся наступним, щоб оновити маркер пристрою під час запуску програми. Тому він завжди буде належним чином оновлюватися.

// Device token for push notifications
FirebaseInstanceId.getInstance().getInstanceId().addOnSuccessListener(
  new OnSuccessListener<InstanceIdResult>() {

    @Override
    public void onSuccess(InstanceIdResult instanceIdResult) {

        deviceToken = instanceIdResult.getToken();

        // Insert device token into Firebase database
        fbDbRefRoot.child("user_detail_profile").child(currentUserId).child("device_token")).setValue(deviceToken)
                .addOnSuccessListener(
                  new OnSuccessListener<Void>() {

                    @Override
                    public void onSuccess(Void aVoid) {

                    }
                });
    }
});

Де це deviceTokenзадекларовано?
Пітер Мортенсен

Чому onSuccessпорожній?
Пітер Мортенсен

@PeterMortensen .. на успіх ви можете робити все, що дозволяє ваша логіка, наприклад, почати новий намір, дати тост або залишитися на тій же сторінці. Що стосується декларації deviceToken, то ви можете оголосити її як приватний струнний пристрійЗаймався раніше onCreate на своїй сторінці
DragonFire

(Щоб зробити свій власний коментар більш зрозумілим: Є два onSuccesss - я мав на увазі внутрішнє (яке порожнє))
Peter Mortensen

1

Вам також потрібно змінити файл build.gradle і додати до нього використану версію Android SDK:

implementation 'com.android.support:appcompat-v7:28.0.0'

Це спрацювало як шарм у моєму випадку.


0

Сповіщення можуть не відображатися, якщо ви швидко показуєте сповіщення одне за іншим або скасовуєте існуюче, а потім відразу ж показуєте його знову (наприклад, для запуску головного повідомлення для сповіщення користувача про зміну поточного сповіщення). У цих випадках система може вирішити просто заблокувати сповіщення, коли відчуває, що може стати занадто непосильним / спам-користувачем.

Зауважте, що принаймні на Android Android (тестується з 10) зовні ця поведінка виглядає дещо випадково: це просто іноді трапляється, а іноді - ні. Напевно, існує дуже короткий поріг часу, протягом якого вам не дозволяється надсилати занадто багато сповіщень. Дзвінки, NotificationManager.cancel()а потім NotificationManager.notify()іноді можуть викликати таку поведінку.

Якщо у вас є можливість, оновлення сповіщення не скасовуйте його раніше, а просто зателефонуйте NotificationManager.notify()з оновленим сповіщенням. Це, мабуть, не викликає згадане вище блокування системою.


-1

Якщо ви використовуєте версію> = Android 8.1 (Oreo) під час використання каналу сповіщень, встановіть його значення на високе:

int importance = NotificationManager.IMPORTANCE_HIGH;
NotificationChannel channel = new NotificationChannel(CHANNEL_ID, name, importance);

1
Що ви маєте на увазі під "однією версією> =" ? Ви маєте на увазі "у версії 8.1 (або вище)" ? Будь ласка, дайте відповідь, відредагувавши свою відповідь , а не тут, у коментарях (якщо потрібно).
Пітер Мортенсен

@PeterMortensen пробач мене за те, що це був просто тип спасибі за те, що мене
Faisal
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.