具有焦点的WebView控件可阻止Android 5中的媒体按钮事件

格雷格科

编辑2016年5月8日

我在我的应用程序中发现无法接收媒体按钮事件的原因。请参阅下面的答案。我编辑该问题的标题以使查找问题更容易。原始标题为“什么可能阻止Android Lollipop上的媒体按钮”。

原始问题,2015年4月:

抓挠我的头,盯着所有代码2天,但无济于事...我的Android应用应该对媒体按钮(例如,从头戴式耳机,使用蓝牙头戴式耳机测试)做出反应,例如播放/暂停,下一步,快退。在KitKat及以下版本上正常工作。我发誓直到几天前它甚至也可以在棒棒糖上使用。现在什么也没有,没有听到媒体按钮按下的痕迹。有人可以快速建议在哪里寻找麻烦吗?经过两款Lollipop手机,相同的蓝牙耳机和相同的耳机测试,适用于较低版本的Android。同样的耳机也可以正常工作,媒体按钮可以在其他应用程序中听到。我可能会打破什么???

我现在测试了收听媒体按钮的新旧方式。在AndroidManifest.xml中:

<receiver android:name=".MediaButtonIntentReceiver" android:enabled="false">
  <intent-filter>
      <action android:name="android.intent.action.MEDIA_BUTTON" />
  </intent-filter>
</receiver>

它说enabled =“ false”的事实是可以的-我根据需要启用和禁用了接收器,并且MediaButtonIntentReceiver.java在KitKat上获得了很好的事件,而在Lollipop上获得了更低的完全静音。

接下来,我切换到最新的appcompat(v22.1),并尝试使用MediaSessionCompat对象和相关代码,如下所示。这在一个小型测试应用程序中效果很好,只有我编写的一项活动-得到我的Logcat消息,确认它听到了在Lollipop上按下的媒体键。但是,当插入我的应用程序后,再次无法在Lollipop上运行。有没有搞错???

private MediaSessionCompat _mediaSession;
final String MEDIA_SESSION_TAG = "some_tag";

void initMediaSessions(Context context) {
    // Start a new MediaSession
    if (context == null)
        return;
    Lt.d("initMediaSession()...");
    ComponentName eventReceiver = new ComponentName(context.getPackageName(), MediaButtonIntentReceiver.class.getName());
    PendingIntent buttonReceiverIntent = PendingIntent.getBroadcast(
            context,
            0,
            new Intent(Intent.ACTION_MEDIA_BUTTON),
            PendingIntent.FLAG_UPDATE_CURRENT
    );

    // Parameters for new MediaSessionCompat():
    // context  The context.
    // tag  A short name for debugging purposes.
    // mediaButtonEventReceiver     The component name for your receiver. This must be non-null to support platform
    // versions earlier than LOLLIPOP. May not be null below Lollipop.
    // mbrIntent    The PendingIntent for your receiver component that handles media button events. This is optional
    // and will be used on JELLY_BEAN_MR2 and later instead of the component name.
    _mediaSession = new MediaSessionCompat(context, MEDIA_SESSION_TAG, eventReceiver, buttonReceiverIntent);
    _mediaSession.setCallback(new MediaSessionCallback());
    _mediaSession.setFlags(MediaSessionCompat.FLAG_HANDLES_MEDIA_BUTTONS |
                            MediaSessionCompat.FLAG_HANDLES_TRANSPORT_CONTROLS);
    _mediaSession.setActive(true);
    PlaybackStateCompat state = new PlaybackStateCompat.Builder()
            .setActions(
                    PlaybackStateCompat.ACTION_PLAY | PlaybackStateCompat.ACTION_PLAY_PAUSE |
                            PlaybackStateCompat.ACTION_PAUSE |
                            PlaybackStateCompat.ACTION_SKIP_TO_NEXT | PlaybackStateCompat.ACTION_SKIP_TO_PREVIOUS)
            .setState(PlaybackStateCompat.STATE_STOPPED, 0, 1, SystemClock.elapsedRealtime())
            .build();
    _mediaSession.setPlaybackState(state);
}


final class MediaSessionCallback extends MediaSessionCompat.Callback {
    @Override
    public void onPlay() {
        Lt.d("play");
    }

    @Override
    public void onPause() {
        Lt.d("pause");
    }

    @Override
    public void onStop() {
        Lt.d("stop.");
    }

    @Override
    public void onSkipToNext() {
        Lt.d("skipToNext");
    }

    @Override
    public void onSkipToPrevious() {
        Lt.d("skipToPrevious");
    }

    @Override
    public boolean onMediaButtonEvent(final Intent mediaButtonIntent) {
        Lt.d("GOT MediaButton EVENT");
        KeyEvent keyEvent = (KeyEvent) mediaButtonIntent.getExtras().get(Intent.EXTRA_KEY_EVENT);
        // ...do something with keyEvent, super... does nothing.
        return super.onMediaButtonEvent(mediaButtonIntent);
    }
}
格雷格科

2016年5月8日:确定解决后,当主屏幕打开时,我终于找到了媒体按钮无法与我的应用程序一起使用的原因。后来我注意到,如果其他任何应用程序处于活动状态或屏幕关闭等,它们都可以工作-但当我的主要活动启动时却无法工作。事实证明,至少在Android 5中,我在主屏幕上使用的WebView控件(如果具有焦点)会阻止媒体按钮致电:

webView.setFocusable(false);

或者

webView.setFocusableInTouchMode(false);

或在布局中设置相同的属性即可解决该问题。在Android 6中,WebView的可聚焦设置与接收媒体按钮事件无关紧要。

2015年4月24日:解决了吗?-不太...从评论到这篇文章:@mangini处理Android 5.0 Lollipop中媒体按钮

要在活动处于前台时接收媒体按钮事件,请在活动上调用setMediaController(),并将其MediaController实例连接到活动的MediaSession。– mangini 1月23日18:35

我一直在测试屏幕并打开它的活动,因为它在老版本的Android上也总是如此...当我按下主屏幕按钮或关闭屏幕时,我的旧MediaButtonIntentReceiver就开始了工作正常。

仅当启用使用折旧的RemoteControlClient的锁屏管理器,并且我的活动当然不在前台时,更新媒体按钮事件才会出现在我的应用程序中。如果禁用了锁屏管理器(这是我的应用程序中的一个选项)并删除RemoteControlClient,同样,我将无法获得任何媒体事件。

棒棒糖下的这个问题完全是一团糟。或至少现在我脑海中有一个完整的混乱。希望有人发布了用于处理媒体按钮的清晰代码示例,该示例将在较旧版本的Android和Lollipop下运行。

格雷格

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

捕捉android媒体按钮事件

来自分类Dev

将单个按键事件连接到具有焦点的控件

来自分类Dev

通过脚本确定 WPF 中的哪个控件具有焦点

来自分类Dev

在Android 5.0 Lollipop中处理媒体按钮

来自分类Dev

当另一个控件具有焦点时,窗体如何检测KeyDown事件?

来自分类Dev

Android Lollipop是否从通知中接收媒体按钮操作?

来自分类Dev

Android Lollipop是否从通知中接收到媒体按钮操作?

来自分类Dev

C#按钮具有鼠标事件的图像控件

来自分类Dev

Android具有视图阻止/吞咽单击事件

来自分类Dev

创建svg媒体控件按钮

来自分类Dev

想要访问Android中的电源按钮事件

来自分类Dev

卡组件中具有单击事件的Bootstrap 4按钮

来自分类Dev

如何在Android 5.x上使用新的MediaSession类接收媒体按钮按下?

来自分类Dev

检查按钮是否具有焦点

来自分类Dev

在主窗体 c# 中从用户控件创建媒体播放器按钮

来自分类Dev

阻止按钮在Inno Setup中获得焦点

来自分类Dev

控件的可覆盖事件(Android Studio)

来自分类Dev

WinForms中的按钮具有CLICK事件。但是谁告诉按钮对象已被单击呢?

来自分类Dev

从Webview Xamarin iOS中的HTML按钮触发事件

来自分类Dev

Boostrap 3中具有表单控件类的下拉按钮?

来自分类Dev

避免命令事件阻止wxPython中的kill焦点事件

来自分类Dev

在Android上的WebView中阻止URL

来自分类Dev

Qt中的按钮按下事件后当前的焦点按钮

来自分类Dev

如何检测没有焦点的控件中的修改键更改?

来自分类Dev

如何在JavaScript中单击带有事件的按钮?

来自分类Dev

PrimeFaces上载组件中的取消按钮是否有bean事件?

来自分类Dev

在 WPF 中捕获带有图像的按钮的单击事件

来自分类Dev

在Android中覆盖顶部菜单问题的后退按钮事件

来自分类Dev

如何在Android中滑动按钮onTouch事件

Related 相关文章

  1. 1

    捕捉android媒体按钮事件

  2. 2

    将单个按键事件连接到具有焦点的控件

  3. 3

    通过脚本确定 WPF 中的哪个控件具有焦点

  4. 4

    在Android 5.0 Lollipop中处理媒体按钮

  5. 5

    当另一个控件具有焦点时,窗体如何检测KeyDown事件?

  6. 6

    Android Lollipop是否从通知中接收媒体按钮操作?

  7. 7

    Android Lollipop是否从通知中接收到媒体按钮操作?

  8. 8

    C#按钮具有鼠标事件的图像控件

  9. 9

    Android具有视图阻止/吞咽单击事件

  10. 10

    创建svg媒体控件按钮

  11. 11

    想要访问Android中的电源按钮事件

  12. 12

    卡组件中具有单击事件的Bootstrap 4按钮

  13. 13

    如何在Android 5.x上使用新的MediaSession类接收媒体按钮按下?

  14. 14

    检查按钮是否具有焦点

  15. 15

    在主窗体 c# 中从用户控件创建媒体播放器按钮

  16. 16

    阻止按钮在Inno Setup中获得焦点

  17. 17

    控件的可覆盖事件(Android Studio)

  18. 18

    WinForms中的按钮具有CLICK事件。但是谁告诉按钮对象已被单击呢?

  19. 19

    从Webview Xamarin iOS中的HTML按钮触发事件

  20. 20

    Boostrap 3中具有表单控件类的下拉按钮?

  21. 21

    避免命令事件阻止wxPython中的kill焦点事件

  22. 22

    在Android上的WebView中阻止URL

  23. 23

    Qt中的按钮按下事件后当前的焦点按钮

  24. 24

    如何检测没有焦点的控件中的修改键更改?

  25. 25

    如何在JavaScript中单击带有事件的按钮?

  26. 26

    PrimeFaces上载组件中的取消按钮是否有bean事件?

  27. 27

    在 WPF 中捕获带有图像的按钮的单击事件

  28. 28

    在Android中覆盖顶部菜单问题的后退按钮事件

  29. 29

    如何在Android中滑动按钮onTouch事件

热门标签

归档