Уведомление 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);
Чоудхури AM
источник
пожалуйста, постарайтесь быть более лаконичным, когда задаете вопросы. Вы не упоминаете, что не работает. Фактически, вы даже не упоминаете, что что-то не работает. Ли 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());
Md Imran Choudhury
источник
Как получить CHANNEL_ID? пожалуйста, помогите
Ананта Прасад
@LAnantaPrasad CHANNEL_ID предназначен для вашего идентификатора. Это то, по чему вы группируете уведомления, например чат или групповой чат.
Casey Daniel
Спасибо, setChannelIdтребуются. Прежде чем добавить это, уведомление отображается на моем устройстве SONY, но не на устройстве SAMSUNG.
Wesely
Android.OS.BuildVersionCodes.Oравно 26?
Питер Мортенсен
2
Также включите проверку, if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.O){ mBuilder.setChannelId(channelId); }поскольку без этой проверки уведомление не будет отображаться, даже если API вашего устройства> = 26.
Choudhury
58

На самом деле ответ Чернандо Валле не кажется правильным. Опять же, ваш вопрос слишком расплывчатый, потому что вы не упомянули, что не так или не работает.

Глядя на ваш код, я предполагаю, что он Notificationпросто не отображается.

Ваше уведомление не отображается, потому что вы не указали значок. Несмотря на то, что в документации SDK не упоминается, что это необходимо, на самом деле это так, и вы Notificationне увидите его без него.

addActionдоступно только с версии 4.1. До этого вы использовали бы PendingIntentдля запуска Activity. Кажется, вы указали a PendingIntent, поэтому ваша проблема в другом. Логично сделать вывод, что это отсутствующий значок.

slinden77
источник
я нашел эту проблему. Но спасибо за правильный ответ. Я действительно ценю твою помощь.
Choudhury AM
1
Вы сказали, что addAction доступен только с 4.1, но это неправильно, я использовал его в 2.3. В справочном руководстве говорится о кнопке, а не об уведомлении: «Кнопки действий не отображаются на платформах до Android 4.1». вы можете проверить здесь: AddAction включен в android.support.v4.app
ernando Valle,
1
OP использует Notification.Builder, а не NotificationCompat.Builder, как вы предлагаете. Тот факт, что существует библиотека совместимости и ее можно использовать, не означает, что функция доступна в обычном API. Ссылка, которую вы предоставляете, фактически оговаривает это. Этот вопрос явно связан с Notification.Builder, как показывает пример. И библиотека совместимости, вероятно, включала эту функцию только после того, как была доступна версия 4.1. Ваш ответ вводит в заблуждение, потому что теперь вы предполагаете, что он доступен с версии 2.3.
slinden77
Извините, если я оговорился, я имею в виду, что это возможно в 2.3
ernando Valle
4
Ах, значок !! Даже не осознавал, что его не хватает, но добавление устранило проблему. Не увидел в консоли ничего полезного об отсутствующем значке, похоже, тихо выходит из строя.
Pete
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 и изменив параметр, чтобы просто отключить уведомления (но не скрывать их), я исправил это.

Чи-Yi
источник
9

Создание каналов уведомлений является обязательным для версий Android после Android 8.1 (Oreo) для отображения уведомлений. Если уведомления не отображаются в вашем приложении для Oreo + Android, вам необходимо вызвать следующую функцию при запуске вашего приложения:

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 09
1
Он существует, но не рекомендуется. Вместо этого вы можете передать Actionэкземпляр, с помощью которого вы можете создать Notification.Action.Builder. PS, Всегда используйте альтернативу Compat (например, NotificationCompat), поскольку Google имеет тенденцию исправлять ошибки и обеспечивать лучшую совместимость с ними
Гекхан Барыш Акер,
Если вы не хотите указывать какое-либо действие, просто используйте его .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 декларации вы можете объявить его как Private Струнный deviceToken до OnCreate вашей страницы
DragonFire
(Чтобы сделать мой собственный комментарий более ясным: есть две onSuccessбуквы - я имел в виду внутреннюю (которая пуста))
Питер Мортенсен
1

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

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

В моем случае это сработало как шарм.

Ашвин Балани
источник
0

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

Обратите внимание, что, по крайней мере, на стандартном Android (протестировано с 10) снаружи такое поведение выглядит немного случайным: иногда это происходит, а иногда - нет. Я предполагаю, что существует очень короткий временной порог, в течение которого вам не разрешено отправлять слишком много уведомлений. Звонок, NotificationManager.cancel()а затемNotificationManager.notify() может иногда вызывать такое поведение.

Если у вас есть возможность, при обновлении уведомления не отменяйте его раньше, а просто позвоните NotificationManager.notify()с обновленным уведомлением. Похоже, что это не вызывает вышеупомянутую блокировку системой.

ubuntudroid
источник
-1

Если вы используете версию> = Android 8.1 (Oreo) при использовании канала уведомлений, установите его важность на высокий уровень:

int importance = NotificationManager.IMPORTANCE_HIGH;
NotificationChannel channel = new NotificationChannel(CHANNEL_ID, name, importance);
Фейсал Насир
источник
1
Что вы имеете в виду под «одной версией> =» ? Вы имеете в виду "на версии 8.1 (или выше)" ? Пожалуйста, ответьте, отредактировав свой ответ , а не здесь, в комментариях (при необходимости).
Питер Мортенсен
@PeterMortensen, простите меня за то, что это был просто типаж, спасибо за поправку,
Фейсал Насир