我将VideoView
与MediaController
一起使用。我正在与背压错误作斗争,这是很常见的,所以我们可以在上找到很多关于它的话题:
Android后退按钮和MediaController
当VideoView正在播放视频时,后退按钮不起作用
播放视频时未捕捉到第一个后退按钮按下安卓
VideoView 中的后退按钮出现问题
所有这些都表明CCD_ 3在CCD_。但它不会在Android Pie上启动。。。方法适用于较旧的操作系统版本,但在Pie上,当媒体控件可见时,我不会在任何地方得到dispatchKeyEvent
或onKeyPressed
调用——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);
}
}