我有一些用户断断续续地报告未显示来电通知。一次是,另一次不是。其中一个在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
记录该通知。
我完全不知道下一步该怎么做才能弄清楚发生了什么事?
有人有什么想法吗?