Подтвердить что ты не робот

Андроидное шоу с всплывающим окном любого приложения

В приведенном ниже коде мое уведомление добавляется только в панель уведомлений, не отображается сообщение типа всплывающего окна, как если бы вы получили сообщение whatsapp, когда находитесь в другом приложении. Что делает это с уведомлением?

private void sendNotification(int distance, ViewObject viewObject) {
    Intent notificationIntent = new Intent(getApplicationContext(), MainActivity.class);
    notificationIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_SINGLE_TOP);
    notificationIntent.putExtra("path", viewObject.getPath());
    TaskStackBuilder stackBuilder = TaskStackBuilder.create(this);
    stackBuilder.addParentStack(MainActivity.class);
    stackBuilder.addNextIntent(notificationIntent);
    PendingIntent notificationPendingIntent = stackBuilder.getPendingIntent(Integer.parseInt(viewObject.getRefId()), PendingIntent.FLAG_UPDATE_CURRENT);

    NotificationCompat.BigTextStyle bigText = new NotificationCompat.BigTextStyle();
    bigText.bigText(String.format(getString(R.string.notification), viewObject.getTitle()));
    bigText.setBigContentTitle(getString(R.string.hello));

    NotificationCompat.Builder builder = new NotificationCompat.Builder(this);
    builder.setSmallIcon(R.drawable.ic_wald_poi)
            .setLargeIcon(BitmapFactory.decodeResource(getResources(), R.drawable.ic_poi))
            .setColor(getResources().getColor(R.color.primary))
            .setContentTitle(getString(R.string.hello))
            .setContentIntent(notificationPendingIntent)
            .setContentText(String.format(getString(R.string.notification), viewObject.getTitle()))
            .setDefaults(Notification.DEFAULT_ALL)
            .setStyle(bigText);

    builder.setAutoCancel(true);
    NotificationManager mNotificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
    mNotificationManager.notify(0, builder.build());
}
4b9b3361

Ответ 1

Если вы хотите использовать Heads-up Notifications следующим образом:

enter image description here

Вы должны изменить приоритет Notification или важность NotificationChannel.

Приоритет уведомления, установленный setPriority(). Приоритет определяет, насколько навязчивым должно быть уведомление на Android 7.1 и ниже. (Для Android 8.0 и выше вы должны установить важность канала)

На Android 7.1 (уровень API 25) и ниже:

  • Установите приоритет уведомления на NotificationCompat.PRIORITY_HIGH или NotificationCompat.PRIORITY_MAX.
  • Установить мелодию звонка и вибрации - вы можете использовать setDefaults(Notification.DEFAULT_ALL)

Android 8.0 (уровень API 26) и выше:

  • Установите приоритет канала уведомлений на NotificationManager.IMPORTANCE_HIGH

Уведомление:

NotificationCompat.Builder builder = new NotificationCompat.Builder(this);
            builder.setSmallIcon(R.drawable.ic_wald_poi)
                    .setLargeIcon(BitmapFactory.decodeResource(getResources(), R.drawable.ic_poi))
                    .setColor(getResources().getColor(R.color.primary))
                    .setContentTitle(getString(R.string.hello))
                    .setContentIntent(notificationPendingIntent)
                    .setContentText(String.format(getString(R.string.notification), viewObject.getTitle()))
                    .setDefaults(Notification.DEFAULT_ALL)
                    .setStyle(bigText)
                    .setPriority(NotificationManager.IMPORTANCE_HIGH)

Канал уведомлений:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
    // Create the NotificationChannel
    val name = getString(R.string.notification_channel_name)
    val descriptionText = getString(R.string.notification_channel_description)
    val importance = NotificationManager.IMPORTANCE_HIGH
    val mChannel = NotificationChannel(NOTIFICATION_CHANNEL_ID, name, importance)
    mChannel.description = descriptionText
    // Register the channel with the system; you can't change the importance
    // or other notification behaviors after this
    val notificationManager = getSystemService(NOTIFICATION_SERVICE) as NotificationManager
    notificationManager.createNotificationChannel(mChannel)
}

Важно

Если вы хотите дополнительно настроить поведение уведомлений по умолчанию для своего канала, вы можете вызвать такие методы, как enableLights(), setLightColor() и setVibrationPattern() на NotificationChannel. Но помните, что когда вы создаете канал, вы не можете изменять эти настройки, и пользователь имеет окончательный контроль над активностью этого поведения. Другой вариант - удалить и установить приложение заново. Читать дальше


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

  • Активность пользователя в полноэкранном режиме (приложение использует fullScreenIntent).
  • Уведомление имеет высокий приоритет и использует мелодии или вибрации на устройствах под управлением Android 7.1 (уровень API 25) и ниже.
  • Канал уведомлений имеет большое значение на устройствах под управлением Android 8.0 (уровень API 26) и выше.

Приоритет:

Notification.PRIORITY_HIGH и Notification.PRIORITY_MAX was deprecated in API level 26. use NotificationCompat instead.

Здесь больше информации :-)

Ответ 2

Вы должны установить приоритет уведомления Notification.PRIORITY_HIGH или Notification.PRIORITY_MAX. Мне также нужно было сделать .setDefaults(Notification.DEFAULT_ALL).

Ответ 3

Система Android решает, что уведомление отображается как Уведомление о Heads-up. Существует несколько условий, в которых может вызвать уведомление Heads-up:

Примерами условий, которые могут вызывать уведомления, могут быть:

  • Активность пользователя находится в полноэкранном режиме (приложение использует fullScreenIntent).
  • Уведомление имеет высокий приоритет и использует рингтоны или вибрации на устройствах под управлением Android 7.1 (уровень API 25) и ниже.
  • Канал уведомлений имеет большое значение для устройств под управлением Android 8.0 (API уровня 26) и выше.

Источник: https://developer.android.com/guide/topics/ui/notifiers/notifications.html#Heads-up

Итак, если вы используете Android 7.1 и ниже, обязательно добавьте рингтон или вибрацию, а также высокий приоритет. Для Android 8.0 и выше измените приоритет на высокий уровень.

NotificationCompat.Builder builder = new NotificationCompat.Builder(context, CHANNEL_ID)
    // ...
    .setDefaults(DEFAULT_SOUND | DEFAULT_VIBRATE)
    .setPriority(NotificationCompat.PRIORITY_HIGH); // or HIGH_IMPORTANCE for Android 8.0

Ответ 4

Ниже уровня API 26: Установите Notification.PRIORITY_HIGH или Notification.PRIORITY_MAX в Builder при отправке сообщения.

Уровень API 26 или выше:

Установить высокий приоритет канала

Важно: если канал имеет установленный приоритет, его нельзя изменить. Если это было в НИЗКОМ, не покажет всплывающее окно, если вы не переустановите приложение.

Ответ 5

Я процитирую комментарий от @hermann-klecker, который помог мне после выполнения всех шагов:

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