android - 处理 Android Pie 上的后退按钮 VideoView

标签 android android-videoview onbackpressed android-9.0-pie

我将 VideoViewMediaController 一起使用。我正在与后按错误作斗争,这很常见,因此我们可以找到很多与此相关的主题:

Android back button and MediaController

Back button won't work when VideoView is playing video

First Back button press not caught when playing a video android

Problem with back button in VideoView

所有这些都建议重写 MediaController 内的 dispatchKeyEvent。但它不会在 Android Pie 上触发...方法适用于较旧的操作系统版本,但在 Pie 上,当媒体控制时,我不会在任何地方收到 dispatchKeyEventonKeyPressed 调用可见 - Activity(onBackPressed 也已选中),任何 View 包括 VideoView(在整个运行时具有焦点)以及媒体 Controller 。事实上,只要 MediaController 在屏幕上可见,后退按钮就不起作用(既不关闭 Activity 也不隐藏 MediaController),而且我无法弄清楚“谁”消耗了该事件...

MediaController mp = new MediaController(this) {
        @Override
        public boolean dispatchKeyEvent(KeyEvent event) {
            if (event.getKeyCode() == KeyEvent.KEYCODE_BACK) {
                if (event.getAction() == KeyEvent.ACTION_UP)
                    onBackPressed();
                return true;
            }
            return super.dispatchKeyEvent(event);
        }
    };
videoView.setMediaController(mp);

当我删除上面的代码时,一切正常,但我需要这些媒体控件

一年前有人遇到过类似的问题,但没有任何答案......(注意 Pie 更年轻......)

Android back button not working while playing video in VideoView

最佳答案

我也在寻找解决方案,直到我自己找到了它:

在您的 MediaController 中,您必须添加一个 OnUnhandledKeyEventListener。

 public bool OnUnhandledKeyEvent(View v, KeyEvent e)
    {
        if (e.KeyCode == Keycode.Back && e.Action == KeyEventActions.Up)
        {
            ...
        }
        return true;
    }

对我来说(使用 Xamarin)它看起来像:

public class ExtMediaController : MediaController
{
    public delegate void CallBackButtonDelegate();
    public CallBackButtonDelegate BackEvent;
    public ExtMediaController(Context context) : base(context)
    {
        base.AddOnUnhandledKeyEventListener(new OnUnhandledKeyEventListener(this));
    }


    public override bool DispatchKeyEvent(KeyEvent e)
    {
        if (e.KeyCode == Keycode.Back)
        {
            BackEvent?.Invoke();
            //return base.DispatchKeyEvent(e);
        }  

        return base.DispatchKeyEvent(e);
    }

}


 public class OnUnhandledKeyEventListener : Java.Lang.Object, IOnUnhandledKeyEventListener
{
    private ExtMediaController LinkedMediaController;

    public OnUnhandledKeyEventListener(ExtMediaController extMediaController)
    {
        LinkedMediaController = extMediaController;
    }

    public bool OnUnhandledKeyEvent(View v, KeyEvent e)
    {
        if (e.KeyCode == Keycode.Back && e.Action == KeyEventActions.Up)
        {
            LinkedMediaController.BackEvent?.Invoke();
        }
        return true;
    }
}

关于android - 处理 Android Pie 上的后退按钮 VideoView,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53830355/

相关文章:

android - 在android中裁剪图像

android - 在 android 中显示无法播放对话框的视频 View

android - 如何在横向模式下全屏显示其中一个 fragment ?

android - Jetpack Compose WebView 处理返回导航并转到上一页

java - 返回按钮会导致意外行为

android - SoapFault - 故障代码 : 'ns1:unexpected-error' android SOAP call

托管 viewPager 的 Android FrameLayout 占用了所有可用空间

android - 播放视频时应用程序崩溃

android-fragments - viewPager 中 onListItemClick 的子片段行为异常

android - 使用 backstack 启动 Activity