我将 VideoView
与 MediaController
一起使用。我正在与后按错误作斗争,这很常见,因此我们可以找到很多与此相关的主题:
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 上,当媒体控制时,我不会在任何地方收到 dispatchKeyEvent
或 onKeyPressed
调用可见 - 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/