Оповещающие уведомления — Android Lollipop

Я пытаюсь показать хедз-ап типа уведомления, но не смог. Что я пробовал

final Notification.Builder notif = new Builder(getApplicationContext())
    .setContentTitle(getString(R.string.title))
    .setContentText(getString(R.string.text))
//  .setTicker(getString(R.string.tick)) removed, seems to not show at all
//  .setWhen(System.currentTimeMillis()) removed, match default
//  .setContentIntent(contentIntent) removed, I don't neet it
    .setColor(Color.parseColor(getString(R.color.yellow))) //ok
    .setSmallIcon(R.drawable.ic_small) //ok
    .setLargeIcon(BitmapFactory.decodeResource(getResources(), R.drawable.ic_launcher))
//  .setCategory(Notification.CATEGORY_CALL) does not seem to make a difference
    .setPriority(Notification.PRIORITY_MAX); //does not seem to make a difference
//  .setVisibility(Notification.VISIBILITY_PRIVATE); //does not seem to make a difference

mNotificationManager.notify(Constants.NOTIFICATION_ID, notif.build());

Уведомление отображается только в виде значка на панели. Я использую API 21 на эмуляторе API 21 (не предварительная версия L). Я пробовал:
android:Theme.Holo.NoActionBar,
android:Theme.Holo.NoActionBar.Fullscreen
и NotificationCompat.Builder

Примеры SDK недоступны. кто нибудь знает как это сделать?

Я заставил его работать, добавив:

.setDefaults(Notification.DEFAULT_VIBRATE)

это лучший способ?


person user1719863    schedule 19.10.2014    source источник
comment
если это сработало для вас, то вы должны добавить это как ответ.   -  person ProllyGeek    schedule 09.12.2014
comment
Обратите внимание, что всплывающие уведомления могут ОЧЕНЬ раздражать при просмотре мультимедиа или использовании любого приложения — неудивительно, что почти каждое приложение использует верхнюю часть экрана. Они отбрасывают тень на верхнюю треть экрана (проверено на моем Tegra Shield 8). Если вы ДОЛЖНЫ использовать их (небеса знают почему), по крайней мере, сделайте возможность отключить их в своем приложении, пожалуйста!   -  person    schedule 21.02.2015
comment
@ user1499731 Android имеет встроенную поддержку отключения просмотра уведомлений для приложения IIRC.   -  person Mygod    schedule 06.03.2016
comment
setDefaults(Notification.DEFAULT_VIBRATE) работает   -  person Kit    schedule 18.10.2017
comment
Я разместил краткую информацию об отображении хедз-ап уведомлений по адресу medium.com/@md.noor.asad/   -  person Asad    schedule 26.02.2019
comment
Вы также можете следить за моим ответом stackoverflow.com/a/54890459/4932661   -  person Asad    schedule 26.02.2019


Ответы (9)


В соответствии с Уведомлениями вам необходимо установить вибрация или мелодия звонка для работы Heads-up. Тем не менее, вот быстрый хак, который не требует разрешения VIBRATE для создания предварительного уведомления:

notificationBuilder.setPriority(Notification.PRIORITY_HIGH);
if (Build.VERSION.SDK_INT >= 21) notificationBuilder.setVibrate(new long[0]);

РЕДАКТИРОВАТЬ:

Не злоупотребляйте хедз-ап уведомлением. См. здесь, когда следует использовать всплывающие уведомления:

МАКС. Для критических и срочных уведомлений, которые предупреждают пользователя о состоянии, которое критично по времени или требует разрешения, прежде чем он сможет продолжить выполнение конкретной задачи.

ВЫСОКИЙ: В первую очередь для важных сообщений, таких как сообщения или события чата с содержанием, которое особенно интересно для пользователя. Уведомления с высоким приоритетом вызывают всплывающее окно уведомлений.

person Mygod    schedule 21.12.2014
comment
Это неправда - недавно я получил отчет о сбое для SecurityException на устройстве Samsung Android 4, используя этот метод. - person Daiwik Daarun; 01.01.2016
comment
@DaiwikDaarun Это бросил setVibrate? Если это воспроизводимо только на Android 4.x, мы можем добавить проверку версии во время выполнения. - person Mygod; 01.01.2016

Согласно Google: https://developer.android.com/design/patterns/notifications.html

Если приоритет уведомления помечен как Высокий, Максимальный или полноэкранный, оно получает всплывающее уведомление.

Таким образом, следующий код должен генерировать хедз-ап уведомление:

.setPriority(Notification.PRIORITY_MAX)

Должно быть достаточно. Но, по-видимому, также необходимо установить .setDefaults(Notification.DEFAULT_VIBRATE). Надеюсь, Google исправит это в своем последнем выпуске Android 5.0.

Не знаю, баг или фича...

person MLS    schedule 22.10.2014
comment
Notification.PRIORITY_HIGH достаточно высок, вам не нужно (и, вероятно, не следует) устанавливать PRIORITY_MAX только потому, что вы хотите, чтобы ваши уведомления отображались в режиме хедз-ап. - person Marcel Bro; 27.11.2014
comment
Похоже, что в уведомлении должен быть установлен звук и/или вибрация, чтобы оно отображалось как хедз-ап. Это на самом деле имеет смысл, так как было бы странно видеть молчаливое уведомление, и в противном случае может быть неочевидно, что это системное уведомление. - person Steven Byle; 12.12.2014
comment
В Android M теперь можно отключить всплывающие уведомления/подглядывание для каждого приложения. Поэтому, если этот просмотр отключен, что бы вы ни делали, ваши уведомления не будут отображаться. Имейте это в виду. - person MLS; 17.06.2015
comment
Хотя он плохо документирован, он находится здесь: разработчику. android.com/guide/topics/ui/notifiers/ The notification has high priority **and** uses ringtones or vibrations - person boltup_im_coding; 07.01.2016

Все мои приложения не отображают уведомление, например, у меня Nexus 6 с Android 5.1.1, но я думаю, что это проблема с Android 5.0, мне пришлось установить:

.setPriority(Notification.PRIORITY_HIGH)

Правильно установить и управлять приоритетом уведомлений

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

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

ВЫСОКАЯ Используйте в основном для важных сообщений, таких как сообщения или события чата с содержанием, особенно интересным для пользователя. Уведомления с высоким приоритетом вызывают всплывающее окно уведомлений.

ПО УМОЛЧАНИЮ Используйте для всех уведомлений, которые не подпадают ни под один из других приоритетов, описанных здесь, и если приложение не отдает приоритет своим собственным уведомлениям.

LOW Используйте для уведомлений, о которых вы хотите, чтобы пользователь был проинформирован, но которые менее срочные. Уведомления с низким приоритетом, как правило, отображаются в нижней части списка, что делает их хорошим выбором для таких вещей, как общедоступные или ненаправленные обновления в социальных сетях: пользователь попросил получать уведомления о них, но эти уведомления никогда не должны иметь приоритет над срочными или прямое общение.

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

person Jorgesys    schedule 21.09.2015

Чтобы установить приоритет, используйте setPriority (представлена ​​в API 16) вместе с setDefaults (добавлено в API 11) из Построитель уведомлений. Выберите приоритет DEFAULT, HIGH, LOW, MAX, MIN как в соответствии с требованиями вашего приложения. Значения по умолчанию также можно выбрать здесь.

Небольшой фрагмент:

notification = NotificationBuilder(service)
notification.setPriority(Notification.PRIORITY_MAX)
notification.setDefaults(Notification.DEFAULT_ALL)
person unixia    schedule 04.01.2017

Убедитесь, что ваш телефон не находится в режиме «без звука» или «не беспокоить». Я потратил день, прежде чем нашел его. Я просто оставляю этот комментарий для тех, кто сталкивается с той же проблемой и нашел этот вопрос.

person Zeon    schedule 25.06.2020
comment
Спасибо! Будьте здоровы - person Martin De Simone; 23.10.2020

Следует установить высокий приоритет и использовать рингтоны или вибрацию.

notificationBuilder.setDefaults(Notification.DEFAULT_ALL);
notificationBuilder.setPriority(Notification.PRIORITY_HIGH);

Ссылка: https://developer.android.com/guide/topics/ui/notifiers/notifications.html#Heads-up

Предупреждающие уведомления

В Android 5.0 (уровень API 21) уведомления могут появляться в небольшом плавающем окне (также называемом всплывающим уведомлением), когда устройство активно (то есть устройство разблокировано и его экран включен). Эти уведомления выглядят так же, как и компактная форма вашего уведомления, за исключением того, что всплывающее уведомление также показывает кнопки действий. Пользователи могут действовать или отклонять всплывающее уведомление, не выходя из текущего приложения.

Примеры условий, которые могут инициировать хедз-ап уведомления, включают:

  • Действия пользователя происходят в полноэкранном режиме (приложение использует fullScreenIntent) или
  • Уведомление имеет высокий приоритет и использует рингтоны или вибрацию.
person situee    schedule 19.07.2017

Добавьте эту строку в свой код, чтобы отображать всплывающее уведомление, которое работает только для версии Lollipop

notificationBuilder.setPriority(Notification.PRIORITY_HIGH);
person Amit Desale    schedule 10.08.2016

Для устройств под управлением Android 8.0 (уровень API 26) и выше канал уведомлений требует высокой важности.

new NotificationChannel("ID", "Channel Name", NotificationManager.IMPORTANCE_HIGH);
person Megaetron    schedule 14.03.2018

Вам не нужно устанавливать вибрацию. Вам нужно только настроить звук. Это менее навязчиво. У меня нет звука, но уведомление отображается сверху. Убедитесь, что вы используете PRIORITY_HIGH и DEFAULT_SOUND.

 NotificationChannel channel = null;
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            channel = new NotificationChannel("my_channel_01",
                    "Channel human readable title",
                    NotificationManager.IMPORTANCE_HIGH);
            mNotificationManager.createNotificationChannel(channel);
        }


        Notification notification =
                new NotificationCompat.Builder(this, "notify_001")
                        .setSmallIcon(R.drawable.ic_check)
                        .setContentTitle("My notification")
                        .setContentText("Hello World!")
                        .setPriority(Notification.PRIORITY_HIGH)
                        .setDefaults(NotificationCompat.DEFAULT_SOUND)
                        .setChannelId("my_channel_01").build();


        mNotificationManager = (NotificationManager) mContext.getSystemService(Context.NOTIFICATION_SERVICE);
        mNotificationManager.notify(0, notification);
person live-love    schedule 24.11.2018