我有一个应用程序,在使用通知侦听器服务读取通知并将其存储在房间数据库中后,我会显示来自聊天应用程序的通知。
现在,当用户在我的应用程序 UI 中单击通知时(显示在回收器视图中),我想打开该应用程序中通知的特定聊天。现在,我只是按包名称启动应用程序。
是否可以模拟点击通知或触发通知的任何操作?
@RequiresApi(Build.VERSION_CODES.O)
override fun onNotificationPosted(sbn: StatusBarNotification) {
Log.d(TAG, "oN NOTIFY")
if (isConnected) {
val notification = sbn.notification
val extras = notification.extras
val packageName = sbn.packageName
// Extract the message content
val title = extras.getString(Notification.EXTRA_TITLE) ?: ""
val message = extras.getString(Notification.EXTRA_TEXT) ?: extras.getString(Notification.EXTRA_SUB_TEXT) ?: ""
// Check if the notification is from a chat app and contains chat notification
if (conversationApps.contains(packageName)
&& invalidNotificationText.none { message.contains(it) }) {
// Extract the sender/group image
val senderImageIcon = extras.getParcelable<Parcelable>(Notification.EXTRA_LARGE_ICON) ?: extras.getParcelable<Parcelable>(Notification.EXTRA_PICTURE)
Log.e(TAG, senderImageIcon.toString())
val senderImageBitmap: Bitmap? = makeBitmap(senderImageIcon)
val senderImageByteArray =
senderImageBitmap?.let { getByteArrayFromBitmap(it) } ?: byteArrayOf()
// Extract the app icon
val pm = applicationContext.packageManager
val appIcon = pm.getApplicationIcon(packageName)
val appIconBitmap: Bitmap? = makeBitmap(appIcon)
val appIconByteArray =
appIconBitmap?.let { getByteArrayFromBitmap(it) } ?: byteArrayOf()
// Create conversation object
val conversation = ConversationEntity(
0,
packageName,
title,
message,
senderImageByteArray,
appIconByteArray,
)
CoroutineScope(Dispatchers.IO).launch {
delay(500)
conversationRepository.deleteByPackageNameAndMessage(packageName, title, message)
conversationRepository.insertConversation(conversation)
}
}
}
}
我实际上已经能够解决这个问题了。 要使用回复操作回复通知,我将使用 Rob J 的文章中的代码“重新创建”通知中的回复操作。实际上,我从另一个堆栈溢出问题下共享的这个github存储库复制了大部分实现。
创建回复操作如下所示: 覆盖 fun onNotificationPosted(sbn: StatusBarNotification) {
val action: Action? = NotificationUtils.getQuickReplyAction(sbn.notification, getPackageName())
...
}
您可以这样发送回复: action.sendReply(myApplicationContext, "replyText")
此外,要打开聊天(不回复消息),我从 onNotificationPosted 中的通知中获取 contentIntent (待处理意图),如下所示:
override fun onNotificationPosted(sbn: StatusBarNotification) {
val notification = sbn.notification
val contentIntent = notification.contentIntent
...
}
要打开通知各自的应用程序,我只需对待处理的意图调用 send() 方法。
contentIntent.send()