从推送通知启动后,带有 JitsiMeetActivity 的 Activity 会随机关闭

问题描述

我正在开发一个Parse SDK 与 back4app 以及 Jitsi Video Conferencing SDK 结合使用的应用程序。我让用户根据兴趣选择其他用户加入 Jitsi 视频会议,并通过在 back4app 服务器上运行的 Parse 处理后端。

这是我目前正在实施的:

  1. 用户 1 被其他用户选择加入 Jitsi Video Call 后,我想向用户 1 发送推送通知
  2. 用户 1 打开推送通知时,我想向他们展示一个特殊的 IncomingCallActivity,它仅用于此特定事件,否则无法访问
  3. IncomingCallActivity 基本上允许用户加入或不加入 Jitsi 会议

虽然我已经设法实现了所有这些,但我发现我的 IncomingCallActivity 有时会随机关闭(或 finish()-es?)本身,或者更糟糕的是,启动 JitsiMeetActivity 但然后失去焦点,使用户加入会议但看不到视频通话屏幕。

我在 4 部不同的设备(1 部华为手机和 3 部 Android 手机)以及不同的 Android 版本(Android 7、9,主要是 Android 10)上测试了我的应用,但无法可靠地重现这种行为。我还尝试使用 WiFi 和移动数据接收/打开推送通知,但也无法推导出模式。

  • 有时 IncomingCallActivity 会一直停留在屏幕上,直到 按钮被按下加入会议,JitsiMeetActivity 工作
  • 其他时候 IncomingCallActivity 只对几个人可见 秒然后 finish()-ed (?) 本身
  • 或者 IncomingCallActivity 一直停留在屏幕上,直到按钮被 按下,仅用于 JitsiMeetActivity 开始拆分 第二个,IncomingCallActivity 结束自己,而 JitsiMeetActivity 仍在后台某处运行

任何想法导致这种行为或如何摆脱这种行为? 非常感谢任何反馈!

可以在此处找到 IncomingCallActivity代码以及我的子类 ParsePushbroadcastReceiver 来处理通知事件:

IncomingCallActivity

internal val TAG = IncomingCallActivity::class.java.simpleName

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_incoming_call)
    
    val incomingCallConfirmButton: Button = findViewById(R.id.incoming_call_confirmation_button)
    incomingCallConfirmButton.setonClickListener {

        var ownJitsiLink: String

        // make sure that a user is logged in
        val appUser = ParseUser.getCurrentUser()

        if (appUser != null) {

            // make a query for whole ParSEObject of additionalInfo of the current user
            val queryAdditionalInfo = ParseQuery.getQuery<ParSEObject>("AppUserData")

            // use the current users' objectId as a key to find the correct AppUserData object
            // find companion object where userId is equal to objectId of the current ParseUser
            queryAdditionalInfo.whereEqualTo("userId",appUser.objectId)
            queryAdditionalInfo.fromLocalDatastore()
            queryAdditionalInfo.ignoreACLs()

            queryAdditionalInfo.getFirstInBackground { parSEObject,e ->
                if (e == null) {
                    userJitsiLink = parSEObject.get("jitsiLink").toString()

                    // set isOnline to false and save in background
                    parSEObject.put("isOnline",false)
                    parSEObject.put("isTalking",true)
                    parSEObject.saveInBackground() {
                        if (it == null) {
                            Log.d(TAG,"User_AppUserInfo isOnline was set to false")
                        }
                    }

                    val appCallOptions = JitsiMeetConferenceOptions.Builder()
                        .setRoom(/ownJitsiLink)
                        .setAudioMuted(false)
                        .setVideoMuted(false)
                        .setAudioOnly(false)
                        .setFeatureFlag("call-integration.enabled",false)
                        .setFeatureFlag("overflow-menu.enabled",false)
                        .setFeatureFlag("close-captions.enabled",false)
                        .setFeatureFlag("filmstrip.enabled",false)
                        .setFeatureFlag("invite.enabled",false)
                        .setFeatureFlag("live-streaming.enabled",false)
                        .setFeatureFlag("meeting-name.enabled",false)
                        .setFeatureFlag("raise-hand.enabled",false)
                        .setFeatureFlag("recording.enabled",false)
                        .setFeatureFlag("server-url-change.enabled",false)
                        .setFeatureFlag("toolBox.enabled",false)
                        .setWelcomePageEnabled(false)
                        .build()

                    // starts a JitsiMeetActivity with specified options
                    JitsiMeetActivity.launch(this,appCallOptions)

                    // after JitsiMeetActivity is done
                    Log.d(TAG,"JitsiMeetActivity was ended")

                    // after JitsiMeetActivity finished,change variables back and save to server
                    parSEObject.put("isOnline",true)
                    parSEObject.put("isTalking",false)
                    parSEObject.save()
                    Log.d(TAG,"User_AppUserInfo isOnline was set back to true")

                    // then finish the Activity
                    finish()
                } else {
                    // something went wrong,print error message e
                    Toast.makeText(this,e.toString(),Toast.LENGTH_SHORT).show()
                }
            }
        }
    }
}

子类 ParsePushbroadcastReceiver MyPushNotificationReceiver

override fun onPushOpen(context: Context,intent: Intent?) {
    super.onPushOpen(context,intent)

    val intentIncomingCallActivity = Intent(context,IncomingCallActivity::class.java).apply {
        flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK
    }

    intentIncomingCallActivity.putExtras(intent!!)
    context.startActivity(intentIncomingCallActivity)
}

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)