在Android的画中画模式中检测关闭和最大化点击事件

17

如何检测用户是否在 PIP 小窗口中点击了原生的关闭和最大化按钮?是否有任何监听器可以监听这些按钮的事件?目前,我的接收器只能监听我在布局中定义的控件,但是那些非自定义按钮,比如 [] 最大化按钮和 X 关闭按钮,它们是 PIP 的一部分。请参考链接


当用户在画中画模式下点击关闭按钮时,Android会调用活动的onStop()方法。恢复按钮也是如此,会调用onResume()方法。 - wingear
5个回答

16

无法检测默认 PiP 按钮的点击。

当您的活动进入 PiP 模式时,实际上会启动另一个系统活动,称为 PiPMenuActivity。在里面,这些 PiP 按钮中设置了一些 OnClickListeners。当它们被点击时,没有广播、意图或任何类似的内容被分派到系统中,因此您无法监听它,也没有 PiP API 提供将侦听器附加到这些按钮的方法。

目前唯一的检测方式是使用您的 activity 的 onResume 和 onStop 方法。当从 PiP 恢复活动时,onResume 和 onPictureInPictureModeChanged 回调会在您的 Activity 上调用。当单击关闭按钮时,将调用 onStop 和 onPictureInPictureModeChanged 回调。


1
当我关闭画中画时,onPictureInPictureModeChanged没有被调用。 - famfamfam

10

这是更新后的解决方案,对我来说在关闭和最大化事件上都有效。

@Override
public void onPictureInPictureModeChanged(boolean isInPictureInPictureMode, Configuration newConfig) {
    if(newConfig !=null){
        videoPosition = playerManager.getCurrentPosition();
        isInPipMode = !isInPictureInPictureMode;
    }
    if (getLifecycle().getCurrentState() == Lifecycle.State.CREATED) {
        finishAndRemoveTask();
        //when user click on Close button of PIP this will trigger, do what you want here
    }
    else if (getLifecycle().getCurrentState() == Lifecycle.State.STARTED){
        //when PIP maximize this will trigger
    }
    super.onPictureInPictureModeChanged(isInPictureInPictureMode, newConfig);
}

3

@Artenes Nogueira,你说得对,无法检测默认的PiP按钮上的点击事件,但是有一种方法可以知道发生了什么。您应该覆盖onPictureInPictureModeChanged方法并检查活动的生命周期。

这里您可以找到一个自我解释的代码示例:

override fun onPictureInPictureModeChanged(isInPictureInPictureMode: Boolean, newConfig: Configuration?) {
    if (lifecycle.currentState == Lifecycle.State.CREATED) {
        //user clicked on close button of PiP window
        finishAndRemoveTask()
    }
    else if (lifecycle.currentState == Lifecycle.State.STARTED){
        if (isInPictureInPictureMode) {
            // user clicked on minimize button
        } else {
            // user clicked on maximize button of PiP window
        }
    }
    super.onPictureInPictureModeChanged(isInPictureInPictureMode, newConfig)
}

1
override fun onPictureInPictureModeChanged(
    isInPictureInPictureMode: Boolean,
    newConfig: Configuration?
) {
    if (isInPictureInPictureMode) {

    } else {
       if (lifecycle.currentState == Lifecycle.State.STARTED) {
           // todo finish your app
       }
    }
}

没有其他方法,我寻找了很多,只有这种方法可以解决它。


2
目前你的回答不够清晰。请编辑并添加更多细节,以帮助其他人理解它如何回答所提出的问题。你可以在帮助中心找到有关如何撰写好答案的更多信息。 - Community
这到底是怎么工作的..? - james04

0

我需要检测用户何时单击了 pip 窗口的关闭按钮。最终,我监听了 JitsiMeetActivity 的 onDestroy 函数。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接