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

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

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

Пример кода с благодарностью.

8 ответов

Решение

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

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

Ты не можешь, прости. Обновление: теперь возможно с Android 4.3+ http://developer.android.com/reference/android/service/notification/NotificationListenerService.html

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

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

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

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

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

        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();

Чтобы отменить уведомление после того, как пользователь выбрал и запустил намерение получателя, позвоните 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 с другим идентификатором создаст новые уведомления.

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

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

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

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();

и проверить, если активен..( existAlarm возвращает ноль, если нет доступных намерений)

 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;
 }

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

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

public StatusBarNotification[] getActiveNotifications()

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

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

FLAG_ONLY_ALERT_ONCE:

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

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

Теперь можно проверить выдающиеся уведомления в Android 4.3 и выше

Посмотреть здесь:

http://developer.android.com/reference/android/service/notification/NotificationListenerService.html

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

notificationManager.getActiveNotifications()

Начиная с Android Marshmallow (API 23), вы можете восстановить список активных уведомлений, опубликованных вашим приложением. Этот метод NotificationManager getActiveNotifications(), Более подробная информация здесь: https://developer.android.com/reference/android/app/NotificationManager.html

Другие вопросы по тегам