Как проверить, какие уведомления активны в строке состояния в Android Dev?

Я создал приложение, которое устанавливает уведомления в раскрывающемся списке состояния телефонов Android. Однако в моем коде есть ошибка (иногда устанавливаются уведомления, иногда это не так). Я хочу иметь возможность ПРОВЕРИТЬ (в коде), ЕСЛИ УВЕДОМЛЕНИЕ ВИДИМО ДЛЯ ПОЛЬЗОВАТЕЛЯ. (то есть пользователь может видеть уведомление в строке состояния?).

Как я могу это сделать? (Спасибо заранее).

Приветствуется примерный код.

Ответ 1

Я хочу иметь возможность ПРОВЕРИТЬ (в коде), ЕСЛИ УВЕДОМЛЕНИЕ ВИДИМО ДЛЯ ПОЛЬЗОВАТЕЛЯ. (то есть пользователь может видеть уведомление в строке состояния?).

Как я могу это сделать?

Вы не можете, извините. Обновление: теперь возможно с Android 4.3+ http://developer.android.com/reference/android/service/notification/NotificationListenerService.html#getActiveNotifications() p >

Однако вы всегда можете просто cancel() it - отмена Notification, которая не является на экране, прекрасна. И наоборот, вы всегда можете безопасно называть notify() снова для того же Notification, и это тоже не вызовет проблемы, если Notification уже на экране.

EDIT:

NotificationManager.getActiveNotifications() добавлен в API 23, если вы не хотите использовать NotificationListenerService

Ответ 2

Вам нужно установить идентификатор для каждого сделанного вами уведомления.

чтобы вы сделали уведомление.

PendingIntent pendingIntent = PendingIntent.getBroadcast(this, notId + selectedPosition, intent, 0);

AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE);
alarmManager.set(AlarmManager.RTC_WAKEUP, rightNow.getTimeInMillis() - offset, pendingIntent);

Notification notification = new Notification(R.drawable.icon, "TVGuide Υπενθύμιση", System.currentTimeMillis());
NotificationManager manger = (NotificationManager) context.getSystemService(context.NOTIFICATION_SERVICE);
notification.setLatestEventInfo(context, "Κανάλι: " + b.getString("channel"), "Εκπομπή: " + showname, pendingIntent);
manger.notify(notId, notification);

чтобы очистить его.

PendingIntent pendingIntent = PendingIntent.getBroadcast(context,notId, intent, 0); 
pendingIntent.cancel();

и проверить, активен ли.. (existsAlarm возвращает null, если не доступно ожидающее намерения)

 public PendingIntent existAlarm(int id) {
  Intent intent = new Intent(this, alarmreceiver.class);
  intent.setAction(Intent.ACTION_VIEW);
  PendingIntent test = PendingIntent.getBroadcast(this, id + selectedPosition, intent, PendingIntent.FLAG_NO_CREATE);
  return test;
 }

Итак, все сводится к инициализации идентификатора для каждого уведомления и его уникальности.

Ответ 3

Просто чтобы все вместе. Вот как это работает.

Чтобы создать уведомление,

        Notification n = new Notification.Builder(MyService.this)
                .setContentTitle("Notification Title")
                .setContentText("Notification Message")
                .setSmallIcon(R.drawable.myicon).build();

Чтобы сделать звуковой вызов уведомления setSound() извещения,

        Uri alarmSound = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
        Notification n = new Notification.Builder(MyService.this)
                .setContentTitle("Notification Title")
                .setContentText("Notification Message")
                .setSound(alarmSound)
                .setSmallIcon(R.drawable.myicon).build();

Чтобы отменить уведомление после того, как пользователь выбрал и запустил приемник Intent, вызовите setAutoCancel(),

        Notification n = new Notification.Builder(MyService.this)
                .setContentTitle("Notification Title")
                .setContentText("Notification Message")
                .setSound(alarmSound)
                .setAutoCancel(true)
                .setSmallIcon(R.drawable.myicon).build();

Чтобы звук/вибрация звучал только один раз для конкретного уведомления, используйте Notification.FLAG_ONLY_ALERT_ONCE. С помощью этого флага ваше уведомление будет звучать только один раз, пока оно не будет отменено, и вы можете вызвать notify() столько раз, сколько хотите с идентификатором уведомления. Обратите внимание, что если вы вызываете cancel() или пользователь отменяет уведомление или автоматически отменяется, уведомление (notify() снова заставляет звучать уведомление.

        n.flags |= Notification.FLAG_ONLY_ALERT_ONCE;    // Dont vibrate or make notification sound

Наконец, чтобы отправить уведомление на панель уведомлений,

        NotificationManager notificationManager =
                (NotificationManager) getSystemService(NOTIFICATION_SERVICE);

        notificationManager.notify(notification_id, n);

Обратите внимание, что notification_id здесь важно, если вы хотите эффективно использовать уведомление (для сохранения единого звука/вибрации для уведомления или для отмены определенного уведомления).

Чтобы отменить определенное уведомление,

        NotificationManager notificationManager =
                (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
        notificationManager.cancel(notification_id);

Вы можете cancel() уведомлять, даже если оно не существует, или вы можете вызывать notify() столько раз, сколько хотите с тем же идентификатором. Обратите внимание, что вызов уведомления с другим идентификатором будет создавать новые уведомления.

Таким образом, независимо от того, существует ли уведомление или нет, если вы снова вызываете notify() с правильным notification_id с установленным флагом Notification.FLAG_ONLY_ALERT_ONCE, вы можете сохранить свое уведомление живым, не беспокоя пользователя повторяющимися звуками.

Ответ 4

Новый метод вводится классу NotificationManager в API 23:

public StatusBarNotification[] getActiveNotifications()

Ответ 6

Для этого существует флаг.

Notification notification = new Notification(icon, tickerText, when);
notification.flags |= Notification.FLAG_ONLY_ALERT_ONCE;

FLAG_ONLY_ALERT_ONCE:

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

Хотя уведомление будет мигать, когда оно будет отправлено повторно, но звука или вибрации не будет.

Ответ 7

Это кажется, что из Android M (API 23) можно получить свой процесс, не используя NotificationListenerService, и не требуя дополнительных разрешений

notificationManager.getActiveNotifications()