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

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

如何检测用户是否点击了PIP小窗口中的原生关闭和最大化按钮。有没有听众我可以听听。现在,我的接收器仅侦听我在布局中定义的控件,但是非自定义按钮(例如 [] max 按钮和 X 关闭按钮是 PIP 的一部分)又如何呢?请参阅链接 链接

android actionlistener picture-in-picture
6个回答
17
投票

无法检测对任何默认画中画按钮的点击。

当您的 Activity 进入 PiP 模式时,实际上会启动另一个系统 Activity,称为 PiPMenuActivity。在它的内部,它在这些 PiP 按钮中设置了一些 OnClickListener。单击它们时,不会向系统发送广播、意图或类似内容,因此您可以收听它,PiP API 都没有提供将侦听器附加到这些按钮的方法。

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


12
投票

这是更新的解决方案,适合我关闭和最大化事件。

@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);
}

4
投票

@Artenes Nogueira,你是对的,不可能检测默认画中画按钮上的点击事件,但有一种方法可以知道发生了什么。您应该重写

onPictureInPictureModeChanged
方法并检查 Activity 的生命周期。

在这里您可以找到不言自明的代码示例:

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
       }
    }
}

我没有找到其他方法,我可以用这种方法解决它。


0
投票

我需要检测用户何时单击 pip 窗口的关闭按钮。我最终听到了 JitsiMeetActivity 中的

onDestroy
函数。


0
投票

在 iOS Swift 中, 如何检测和区分 iOS Swift 中的 PIP 关闭和最大化按钮?

使用以下方法来检测何时单击最大化。

当用户去到不同的地方时,这可以用来手动将播放器返回到原始位置。在这种情况下,如果用户点击“关闭”按钮,它就会关闭,当他们点击“最大化”时,我们就可以随心所欲地控制了。

public func pictureInPictureController(_ pictureInPictureController: AVPictureInPictureController, restoreUserInterfaceForPictureInPictureStopWithCompletionHandler completionHandler: @escaping (Bool) -> Void) {

if let caller  = delegate?.getPresentedViewController() {
    
    var presentingVC = caller.presentingViewController
    if presentingVC != nil {
        return
    }
    // Maximized Button Clicked
    delegate?.PIPdidMaximized()
} else{
    completionHandler(true)
}  } 
© www.soinside.com 2019 - 2024. All rights reserved.