0

我正在开发一个像往常一样具有 VideoCall 功能的聊天应用程序。对于我的视频通话

  1. RoomActivity 和 RoomViewModel
  2. 在 RoomActivity 里面我有一个 RoomFragment,它通过 activityViewModels 拥有 RoomViewModel

RoomActivity 负责处理意图并连接到 Room

override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        audioManager = SystemServiceUtils.getAudioManager(this)
        powerManager = SystemServiceUtils.getPowerManager(this)
        sensorManager = SystemServiceUtils.getSensorManager(this)
        proximitySensor = sensorManager.getDefaultSensor(Sensor.TYPE_PROXIMITY)
        

        isAbove(
            Build.VERSION_CODES.O_MR1,
            code = {
                setShowWhenLocked(true)
                setTurnScreenOn(true)
            }, other = {
                window.addFlags(WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD)
                window.addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED)
                window.addFlags(WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON)
            }
        )
        window.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON)
        volumeControlStream = AudioManager.STREAM_VOICE_CALL

        handleIntent()
        setContentView(R.layout.activity_room)
        

        println("## RoomActivity onCreate")
    }

在 RoomFragment 内部,我拥有参与者和其他视图的 UI 状态

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)

        savedInstanceState?.let {
            durationBase = it.getLong("durationBase", 0L)
        }

        setupCallFrame()
        initViews()

        roomViewModel.activeParticipants.observe(viewLifecycleOwner) { participants ->
           // handleUI with participants
           .....
        }

        println("## RoomFragment onViewCreated")
    }


private fun initViews() {
    // Here i set the ClickListeners to the UI elements
}

override fun onStop() {
     super.onStop()
     // Here i release the resources after i press the Disconnect button
     releaseResources()
}

我对上述实现有两个问题

  1. 当我进入 PipMode 时,一切正常。但是,当有人单击 PipMode 窗口的关闭按钮时,呼叫并未结束。相反,pip 窗口消失了,但调用仍然存在并且可以通过通知访问。我想要的是结束通话。我可以在哪个回调中做到这一点?我应该在哪里捕捉它,在 Fragment 中还是在 Activity 中?

  2. 关闭 pipWindow 并通过通知进入 RoomActivity 后,我无法访问 UI 元素,因为从日志中可以看出,initViews 方法永远不会被调用。我应该把 initViews 放在哪里?

编辑:

当我比较其他著名和已知的聊天时,当他们的视频通话进入 PipMode 并且我按下 X 按钮时,视频通话没有结束。相反,有一个通知可供单击并返回活动。因此,关闭呼叫的唯一方法是通过 UI 元素(即使这是在 PipMode 中),而不是使用 Pip 的 X 按钮。

所以现在的帖子是关于第二个问题

4

0 回答 0