内容简介:翻译自:媒体按钮是Android设备和其他外围设备上的硬件按钮,例如蓝牙耳机上的暂停/播放按钮。当用户按下媒体按钮时,Android会生成一个KeyEvent,其中包含一个识别按钮的密钥代码。media button KeyEvents的关键代码是以应用程序应该能够在三种情况下处理媒体按钮事件,按优先顺序排列:
翻译自: Responding to media buttons
媒体按钮是Android设备和其他外围设备上的硬件按钮,例如蓝牙耳机上的暂停/播放按钮。当用户按下媒体按钮时,Android会生成一个KeyEvent,其中包含一个识别按钮的密钥代码。media button KeyEvents的关键代码是以 KEYCODE_MEDIA
开头的常量(例如, KEYCODE_MEDIA_PLAY
)。
应用程序应该能够在三种情况下处理媒体按钮事件,按优先顺序排列:
- 当应用程序的UI活动可见时
- 当UI活动隐藏且应用程序的媒体会话处于活动状态时
- 当UI活动被隐藏,应用程序的媒体会话不活跃,需要重新启动时
处理前台活动中的媒体按钮
前台活动在其 onKeyDown()
方法中接收media button key事件。根据Android的运行版本,系统有两种方式将事件路由到媒体控制器:
- 如果你运行的是安卓5.0 (API level 21)或更高版本,调用 FLAG_HANDLES_MEDIA_BUTTONS
MediaBrowserCompat.ConnectionCallback.onConnected
。这将自动调用您的媒体控制器的 dispatchMediaButtonEvent() ,它将关键代码转换为媒体会话回调。 - 在Android 5.0 (API level 21)之前,您需要修改onKeyDown()来自己处理事件。(有关详细信息,请参阅 Handling media buttons in an active media session 。)下面的代码片段展示了如何截获关键代码并调用dispatchMediaButtonEvent()。确保返回true以指示事件已处理:
@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的运行版本,有两种方法可以搜索媒体会话:
- 如果你运行的是安卓8.0 (API level 26)或更高版本,系统会试图找到最后一个带有本地播放音频的MediaSession的应用。如果会话仍然是活动的,Android会将事件直接发送到它。否则,如果会话不是活动的,并且它有一个mediabutton接收器,Android将事件发送给接收器,接收器将重新启动会话,因此它可以接收事件。(有关详细信息,请参阅Using media buttons to restart an inactive media session 。)如果会话没有媒体按钮接收器,系统将丢弃媒体按钮事件,并且什么也不会发生。逻辑如下图所示:
- 在Android 8.0 (API级别26)之前,系统尝试将事件发送到活动媒体会话。如果有多个活动媒体会话,Android会尝试选择准备播放(缓冲/连接)、播放或暂停的媒体会话,而不是停止的。(有关更多细节,请参见 Handling media buttons in an active media session 。)如果没有活动会话,Android会尝试将事件发送到最近的活动会话。(有关详细信息,请参阅使用 Using media buttons to restart an inactive media session 。)逻辑如下图所示:
处理活动媒体会话中的媒体按钮
在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之前在系统中使用媒体按钮,你必须在清单中包括 MediaButtonReceiver
和 MEDIA_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或更高版本时:
- 从媒体控制器
onConnected()
回调中调用MediaControllerCompat.setMediaController()
- 要允许媒体按钮重新启动非活动会话,可以通过调用
setMediaButtonReceiver()
并传递PendingIntent
动态创建MediaButtonReceiver
当系统运行时间早于Android 5.0时:
- 重写活动的onKeyDown()以处理媒体按钮
- 静态创建一个
MediaButtonReceiver
通过添加它到应用程序的清单
以上所述就是小编给大家介绍的《android音视频指南-响应媒体按钮》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!
猜你喜欢:本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Linux设备驱动程序
科波特 / 魏永明、耿岳、钟书毅 / 中国电力出版社 / 2006-1-1 / 69.00元
本书是经典著作《Linux设备驱动程序》的第三版。如果您希望在Linux操作系统上支持计算机外部设备,或者在Linux上运行新的硬件,或者只是希望一般性地了解Linux内核的编程,就一定要阅读本书。本书描述了如何针对各种设备编写驱动程序,而在过去,这些内容仅仅以口头形式交流,或者零星出现在神秘的代码注释中。 本书的作者均是Linux社区的领导者。Jonathan Corbet虽不是专职的内核......一起来看看 《Linux设备驱动程序》 这本书的介绍吧!