有时不会显示来自服务内部startForeground的通知

时间:2020-07-23 22:16:07

标签: android android-notifications

我有一些用户断断续续地报告未显示来电通知。一次是,另一次不是。其中一个在8.1上,另一个在9上。它大多数都适用于它们,但有时根本不显示。

当VoIP呼叫的推送通知到达时,我在FirebaseMessagingService中启动了一项新服务。在此期间,我将创建一个新通知,并使用适当的详细信息调用startForeground。

该服务中的整个呼叫工作流程几乎一直都在按预期的方式工作(他们花了一个星期的时间来重现并发送一次日志)。通知显示,电话响起,一切正常。

但有时(很少)会在显示通知后在服务中触发,并且没有任何通知显示。

我通过添加此代码并在来电工作流程中全部调用来确认这一点,并且它记录了按预期方式被发现的输出,除非他们说它不起作用,然后它从不记录任何内容。

private void logNotificationStatus(String logDetail) {
        try {
            if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.M) {
                NotificationManager notificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
                StatusBarNotification[] notificationList = notificationManager.getActiveNotifications();
                for (StatusBarNotification notification : notificationList) {
                    if (notification.getId() == INCOMING_CALL_NOTIFICATION) {
                        Timber.tag(TAG).d("INCOMING_CALL_NOTIFICATION %s", logDetail);
                    }
                }
            }
        } catch (Exception exception) {
            Timber.tag(TAG).e("Error checking notification status");
        }
    }

我的应用拥有正确的权限

<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />

我正在用一个非0的id呼叫startForeground。

DND已关闭

在确认有时没有显示之后,我的第一个直觉是他们禁用了通知或禁用了通知通道,但是他们声称自己没有这样做(甚至是偶然地)并发送了通知的屏幕截图,并且所有频道均已启用。

这是我创建通知的地方。整个调用过程和所有日志记录均按预期进行,除非发生问题时,对logNotificationStatus的调用不记录任何内容,但其他所有操作均有效。

 public static final int INCOMING_CALL_NOTIFICATION = 76;

 private void createIncomingNotification(CallWaitingNotificationType callWaitingNotificationType) {
        Timber.tag(TAG).d("Creating Incoming Notification");
        NotificationHelper.createChannels(VoipService.this);

        Intent incomingIntent = CallActivity.newInstanceIntent(getContext(), CallLoadType.INCOMING, false, false, voipPhone.getRecipientContactId());
        incomingIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
        PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, incomingIntent, PendingIntent.FLAG_UPDATE_CURRENT);

        Intent answerIntent = new Intent(this, VoipService.class);
        PendingIntent answerPendingIntent;

        if (ContextCompat.checkSelfPermission(getContext(), Manifest.permission.RECORD_AUDIO) == PackageManager.PERMISSION_GRANTED) {
            answerIntent.setAction(callWaitingNotificationType.getAnswerAction().getAnswerAction());
        } else {
            answerIntent.setAction(Constants.ACTION.ANSWER_CALL_WITHOUT_PERMISSIONS);
        }

        answerPendingIntent = PendingIntent.getService(this, 0, answerIntent, PendingIntent.FLAG_UPDATE_CURRENT);

        Intent hangUpIntent = new Intent(this, VoipService.class);
        hangUpIntent.setAction(Constants.ACTION.HANG_UP_CALL);
        PendingIntent hangUpPendingIntent = PendingIntent.getService(this, 0, hangUpIntent, 0);

        NotificationCompat.Builder builder = new NotificationCompat.Builder(this, callWaitingNotificationType.getChannelId())
                .setContentTitle(getVoipPhone().getRecipientText())
                .setTicker(getVoipPhone().getRecipientText())
                .setContentText("Incoming Call")
                .setSmallIcon(R.drawable.ic_notification_icon)
                .setColor(getResources().getColor(R.color.colorPrimary))
                .setContentIntent(pendingIntent)
                .setVisibility(NotificationCompat.VISIBILITY_PUBLIC)
                .setOngoing(true)
                .setCategory(NotificationCompat.CATEGORY_CALL)
                .setPriority(callWaitingNotificationType.getPriority())
                .addAction(R.drawable.ic_call_end_white_24dp, "Hang Up", hangUpPendingIntent)
                .addAction(R.drawable.ic_call_white_24dp, "Answer", answerPendingIntent)
                .setFullScreenIntent(pendingIntent, true);

        Timber.tag(TAG).d("Notification Builder Created");

        startForeground(INCOMING_CALL_NOTIFICATION, builder.build());
    }

我在网上找不到其他任何描述此问题的信息,它总是得到您的许可,是否有通知渠道以及是否使用了0 ID(我都做得很好)。

我开始怀疑,也许有时startForeground会引发错误而不是记录错误,因为如果您查看Service类,它会显示捕获的但被忽略的异常

 public final void startForeground(int id, Notification notification) {
        try {
            mActivityManager.setServiceForeground(
                    new ComponentName(this, mClassName), mToken, id,
                    notification, 0);
        } catch (RemoteException ex) {
        }
    }

我尝试将不良数据放入所有构建器字段中,并且在所有情况下都以某种方式显示通知,logNotificationStatus记录该通知。

我完全不知道下一步该怎么做才能弄清楚发生了什么事?

有人有什么想法吗?

0 个答案:

没有答案