GetActiveNotifications возвращает ноль - PullRequest
0 голосов
/ 11 марта 2019

У меня есть приложение для обмена сообщениями, и сейчас я делаю часть push-уведомлений.Для этого я использую FCM (Firebase Cloud Messaging).Теперь у меня проблема.Например, введите 2 пользователей (user1 и user2).Если пользователь1 пишет мне, я получаю уведомление с FCM и показываю его.Когда user2 пишет мне, я создаю новое уведомление для него.Но когда user1 пишет мне снова, и я не удаляю свое уведомление user1, мне нужно обновить уведомление, иначе создайте новое.Я думаю, ты меня понимаешь.Теперь я застрял в части обновления, потому что каждый раз я создаю новое уведомление о доходе сообщения.

Я искал и нашел что-то.Он говорит, что я должен использовать NotificationListenerService для этого и getActiveNotifications() для получения всех активных уведомлений в строке состояния.

Итак, я что-то пробовал, но получаю null.Я включил это приложение в Notification Access, так что я думаю, что это не проблема.Я зарегистрировал свои службы в файле манифеста.

Вот мой код, в котором я создал службу FCM.Если я сделал что-то не так в своем коде, пожалуйста, исправьте это.

public class FireBaseService extends FirebaseMessagingService {

private static final String TAG = "FireBaseMessagingServiceTag";

@SuppressLint("LongLogTag")
@Override
public void onMessageReceived(RemoteMessage remoteMessage) {
    // Handle FCM messages here.

    Intent service = new Intent(FireBaseService.this, NotificationService.class);
    startService(service);

    //I think I'm doing wrong here.
    NotificationService notificationService = new NotificationService();

    StatusBarNotification[] activeNotifications = notificationService.getActiveNotifications();

    Log.d(TAG, "Array: " + Arrays.toString(activeNotifications));

    //show notification
}
}

А вот класс NotificationService.

public class NotificationService extends NotificationListenerService {

@Override
public IBinder onBind(Intent intent) {
    return super.onBind(intent);
}

@Override
public void onListenerConnected() {
    super.onListenerConnected();
}

@Override
public void onNotificationPosted(StatusBarNotification sbn){
    // Implement what you want here
}

@Override
public void onNotificationRemoved(StatusBarNotification sbn){
    // Implement what you want here
}

@Override
public StatusBarNotification[] getActiveNotifications() {
    return super.getActiveNotifications();
}
}

Так что это все, что я сделал.Вы можете мне помочь?Спасибо и, пожалуйста, исправьте мой код, если я сделал что-то не так, вместо того, чтобы голосовать против моего вопроса.

Вот часть уведомления.

private void showNotification(String title, String body) {
    NotificationManager notificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
    String NOTIFICATION_CHANNEL_ID = "com.example.fcmnotification.FireBaseService";

    if(notificationManager != null) {
        if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            NotificationChannel notificationChannel = new NotificationChannel(
                    NOTIFICATION_CHANNEL_ID, "NotificationManager",
                    NotificationManager.IMPORTANCE_DEFAULT);

            notificationChannel.setDescription("My Channel");
            notificationChannel.enableLights(true);
            notificationChannel.setLightColor(Color.BLUE);
            notificationChannel.setVibrationPattern(new long[]{0, 1000, 500, 1000});
            notificationManager.createNotificationChannel(notificationChannel);
        }

        NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(this, NOTIFICATION_CHANNEL_ID);
        notificationBuilder.setAutoCancel(true)
                .setDefaults(Notification.DEFAULT_ALL)
                .setWhen(System.currentTimeMillis())
                .setSmallIcon(R.mipmap.ic_launcher_notification)
                .setContentTitle(title)
                .setContentText(body)
                .setContentInfo("info");

        notificationManager.notify(new Random().nextInt(), notificationBuilder.build());
    }
}

1 Ответ

0 голосов
/ 11 марта 2019

Вам не нужно NotificationListenerService. Просто получите активные уведомления от NotificationManager

NotificationManager nm = (NotificationManager)ctx.getSystemService(Activity.NOTIFICATION_SERVICE);
StatusBarNotification[] statusNotifs = null;
try {
    statusNotifs = nm.getActiveNotifications();
} catch (Throwable t) {
    // it can crash
}
if (statusNotifs != null) for (StatusBarNotification n : statusNotifs) {
    Notification notif = n.getNotification();
    try {
        String ntext = notif.extras.getCharSequence(Notification.EXTRA_TEXT).toString();
        // do something
    } catch (Throwable t) {
        // can crash
    }
}
...