我正在开发一个像往常一样具有 VideoCall 功能的聊天应用程序。对于我的视频通话
- RoomActivity 和 RoomViewModel
- 在 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()
}
我对上述实现有两个问题
当我进入 PipMode 时,一切正常。但是,当有人单击 PipMode 窗口的关闭按钮时,呼叫并未结束。相反,pip 窗口消失了,但调用仍然存在并且可以通过通知访问。我想要的是结束通话。我可以在哪个回调中做到这一点?我应该在哪里捕捉它,在 Fragment 中还是在 Activity 中?
关闭 pipWindow 并通过通知进入 RoomActivity 后,我无法访问 UI 元素,因为从日志中可以看出,initViews 方法永远不会被调用。我应该把 initViews 放在哪里?
编辑:
当我比较其他著名和已知的聊天时,当他们的视频通话进入 PipMode 并且我按下 X 按钮时,视频通话没有结束。相反,有一个通知可供单击并返回活动。因此,关闭呼叫的唯一方法是通过 UI 元素(即使这是在 PipMode 中),而不是使用 Pip 的 X 按钮。
所以现在的帖子是关于第二个问题