Android开发Android技术知识程序猿阵线联盟-汇总各类技术干货

android音视频指南-响应媒体按钮

2018-10-25  本文已影响14人  Android高级架构探索

媒体按钮是Android设备和其他外围设备上的硬件按钮,例如蓝牙耳机上的暂停/播放按钮。当用户按下媒体按钮时,Android会生成一个KeyEvent,其中包含一个识别按钮的密钥代码。media button KeyEvents的关键代码是以KEYCODE_MEDIA开头的常量(例如,KEYCODE_MEDIA_PLAY)。

应用程序应该能够在三种情况下处理媒体按钮事件,按优先顺序排列:

处理前台活动中的媒体按钮

前台活动在其onKeyDown()方法中接收media button key事件。根据Android的运行版本,系统有两种方式将事件路由到媒体控制器:

@Override
    boolean onKeyDown(int keyCode, KeyEvent event) {
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
              return super.onKeyDown(keyCode, event);
            }
            switch (keyCode) {
              case KeyEvent.KEYCODE_MEDIA_PLAY:
                      yourMediaController.dispatchMediaButtonEvent(event);
                      return true;
            }
            return super.onKeyDown(keyCode, event);
    }
复制代码

寻找媒体会话

如果前台活动不处理事件,Android将尝试找到一个可以处理它的媒体会话。同样,根据Android的运行版本,有两种方法可以搜索媒体会话:

image.png image.png

处理活动媒体会话中的媒体按钮

在Android 5.0 (API level 21)及更高版本上,Android通过调用onMediaButtonEvent()自动将媒体按钮事件分派给您的活动媒体会话。默认情况下,此回调将KeyEvent转换为与密钥代码匹配的适当的媒体会话回调方法。

在Android 5.0 (API level 21)之前,Android通过使用ACTION_MEDIA_BUTTON操作广播一个意图来处理媒体按钮事件。你的应用程序必须注册一个广播接收器来拦截这些意图。MediaButtonReceiver类是专门为此目的设计的。它是Android media-compat库中的一个方便类,它处理ACTION_MEDIA_BUTTON并将传入的意图转换为适当的MediaSessionCompat.Callback方法调用。

MediaButtonReceiver是一个短命的广播接收器。它将传入的意图转发给管理媒体会话的服务。如果你想在Android 5.0之前在系统中使用媒体按钮,你必须在清单中包括MediaButtonReceiverMEDIA_BUTTON意图过滤器。

<receiver android:name="android.support.v4.media.session.MediaButtonReceiver" >
   <intent-filter>
     <action android:name="android.intent.action.MEDIA_BUTTON" />
   </intent-filter>
 </receiver>
复制代码

广播接收器将意图转发给您的服务。要解析意图并生成对媒体会话的回调,请在服务的onStartCommand()中包含MediaButtonReceiver.handleIntent()方法。这将把关键代码转换为适当的会话回调方法。

private MediaSessionCompat mMediaSessionCompat = ...;

public int onStartCommand(Intent intent, int flags, int startId) {
  MediaButtonReceiver.handleIntent(mMediaSessionCompat, intent);
  return super.onStartCommand(intent, flags, startId);
}
复制代码

注意:如果您没有MediaBrowserServiceCompat,您还可以向任何服务添加ACTION_MEDIA_BUTTON意图过滤器。有关更多信息,请参阅MediaButtonReceiver文档。

使用媒体按钮重新启动非活动的媒体会话

如果Android能够识别最后一个活动媒体会话,它会试图通过发送一个ACTION_MEDIA_BUTTON意图到一个声明注册的组件(如服务或广播接收器)来重新启动会话。

这可以让你的应用在UI不可见时重启回放,这是大多数音频应用的情况。

当您使用MediaSessionCompat时,将自动启用此行为。如果你使用Android框架的MediaSession或者Support Library 24.0.0到25.1.1,你必须调用setMediaButtonReceiver,让媒体按钮重新启动一个非活动的媒体会话。

你可以通过设置一个空媒体按钮接收器,在Android 5.0 (API级别21)或更高版本中禁用此行为:

// Create a MediaSessionCompat
mMediaSession = new MediaSessionCompat(context, LOG_TAG);
mMediaSession.setMediaButtonReceiver(null);
复制代码

注意:对于在Android 5.0 (API level 21)之前的系统中运行的应用程序,您注册以处理活动会话的媒体按钮的MediaButtonReceiver也会在会话不活动时接收媒体按钮事件。无法禁用此行为。

定制媒体按钮处理程序

onMediaButtonEvent()的默认行为提取关键代码并使用媒体会话的当前状态和支持的操作列表来确定调用哪个方法。例如,KEYCODE_MEDIA_PLAY调用onPlay()

为了在所有应用程序中提供一致的媒体按钮体验,您应该使用默认行为,并且只为了特定的目的而偏离。如果媒体按钮需要自定义处理,重写回调函数的onMediaButtonEvent()方法,使用intent.getparcelableextra (Intent.EXTRA_KEY_EVENT)提取KeyEvent,自己处理事件,并返回true

总结

要正确处理Android所有版本中的媒体按钮事件,必须在创建媒体会话时指定FLAG_HANDLES_MEDIA_BUTTONS

此外,根据您计划支持的Android版本,您还必须满足以下要求:

运行Android 5.0或更高版本时:

当系统运行时间早于Android 5.0时:

上一篇 下一篇

猜你喜欢

热点阅读