处理Android Pie上的后退按钮VideoView



我将VideoViewMediaController一起使用。我正在与背压错误作斗争,这是很常见的,所以我们可以在上找到很多关于它的话题:

Android后退按钮和MediaController

当VideoView正在播放视频时,后退按钮不起作用

播放视频时未捕捉到第一个后退按钮按下安卓

VideoView 中的后退按钮出现问题

所有这些都表明CCD_ 3在CCD_。但它不会在Android Pie上启动。。。方法适用于较旧的操作系统版本,但在Pie上,当媒体控件可见时,我不会在任何地方得到dispatchKeyEventonKeyPressed调用——Activity(也选中了onBackPressed(,任何View,包括VideoView(在整个运行时都有焦点(和MediaController。事实上,只要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更年轻…(

在VideoView 中播放视频时,Android后退按钮不工作

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

在您的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;
}
}

我扩展了mediacontroller类,这样它就可以为所有版本的android(包括android p(正确处理反向预测的活动。您可以将此类实例化为媒体控制器。

public class ExtendedMediaController extends MediaController {
private Activity            mParentActivity;
public ExtendedMediaController(Context context, Activity parentActivity) {
super(context);
mParentActivity = parentActivity;
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
OnUnhandledKeyEventListener eventListener = new OnUnhandledKeyEventListener() {
@Override
public boolean onUnhandledKeyEvent(View v, KeyEvent event) {
boolean fHandled = false;
if (event.getKeyCode() == KeyEvent.KEYCODE_BACK) {
if (event.getAction() == KeyEvent.ACTION_DOWN) {
fHandled =  true;
} else if (event.getAction() == KeyEvent.ACTION_UP) {
if(mParentActivity != null) {
mParentActivity.onBackPressed();
fHandled = true;
}
}
}
return(fHandled);
}
};
addOnUnhandledKeyEventListener(eventListener);
}
}
@Override
public boolean dispatchKeyEvent(KeyEvent event) {
boolean fHandled = false;
if (event.getKeyCode() == KeyEvent.KEYCODE_BACK) {
if (event.getAction() == KeyEvent.ACTION_DOWN) {
fHandled =  true;
} else if (event.getAction() == KeyEvent.ACTION_UP) {
mParentActivity.onBackPressed();
fHandled = true;
}
}
if(!fHandled) {
fHandled = super.dispatchKeyEvent(event);
}
return(fHandled);
}

}

相关内容

  • 没有找到相关文章

最新更新