在我的 Android 应用程序中阅读其推送通知后,如何打开另一个应用程序?

问题描述 投票:0回答:1

我有一个应用程序,在使用通知侦听器服务读取通知并将其存储在房间数据库中后,我会显示来自聊天应用程序的通知。

现在,当用户在我的应用程序 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)
            }

        }

    }
}
android android-intent notificationlistenerservice
1个回答
0
投票

我实际上已经能够解决这个问题了。 要使用回复操作回复通知,我将使用 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()
© www.soinside.com 2019 - 2024. All rights reserved.