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

Android车载应用开发与分析(7)- 车载多媒体(二)- 多媒体应用架构与MediaSession框架 播放音频或视频的多媒体应用通常由两部分组成: 播放器:接收传入的数据多媒体,并输出音频或视频。可以是MediaPlayer、ExoPlayer或其他Player。 界面:用于显示、控制播放. 阅读详情

媒体按钮是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。

PS :有兴趣的加入Android工程师交流QQ群:752016839 主要针对Android开发人员提升自己,突破瓶颈,相信你来学习,会有提升和收获。

总结

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

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

运行Android 5.0或更高版本时:

  • 从媒体控制器onConnected()回调中调用MediaControllerCompat.setMediaController()
  • 要允许媒体按钮重新启动非活动会话,可以通过调用setMediaButtonReceiver()并传递PendingIntent动态创建MediaButtonReceiver

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

  • 重写活动的onKeyDown()以处理媒体按钮
  • 静态创建一个MediaButtonReceiver通过添加它到应用程序的清单
Android平台C++媒体播放器开发:从FFmpeg解码到音视频同步实战 在移动应用开发中,高性能音视频处理是核心技术领域之一,其底层实现通常依赖于C/C++语言以保证执行效率。其核心原理涉及媒体数据的解封装、解码、渲染与同步流程,通过FFmpeg等开源库实现跨格式编解码,结合多线程架构管理数据流。这项技术的工程价值在于能够为短视频、直播、游戏等场景提供稳定高效的播放能力,解决音画同步、低延迟等关键问题。本文以Android平台为例,详细解析如何利用NDK、OpenGL ES和OpenSL ES构建本地播放器,涵盖FFmpeg集成、线程模型设计及音视频同步策略,帮助开发者深入理解 阅读详情

相关推荐

安卓WebRTC实时音视频通信Demo开发指南

WebRTC作为开源实时通信技术,通过P2P连接实现低延迟的音视频传输。其核心技术包括STUN/TURN协议处理NAT穿透、ICE框架建立网络连接、以及媒体流传输控制。在安卓平台实现WebRTC需要处理硬件编解码适配、权限管理等特殊问题,本文通过Node.js+Vue+Android的完整技术栈,演示如何构建信令服务器、实现SDP交换与ICE协商,并解决华为设备视频旋转等常见兼容性问题。该方案适用于在线教育、视频会议等需要实时通信的场景,关键指标达到端到端延迟<300ms、分辨率640x480的实用水平。

weixin_34025151的博客 483

Android后台监听耳机(线控、蓝牙)按键事件

在Activity中重写onKeyDown、onKeyUp这些 方法只适用于APP在前台的情况,如果将APP切换到后台就失效了。 经过网上一番摸索、读源码,终于把这个功能整出来了,说一下我的实现过程。 1.后台要获取到事件第一事件想到的肯定是广播,于是就找到了“android.intent.action.MEDIA_BUTTON”这个广播 2.注册监听这个广播后发现…这个广播压根接收不到啊,网上找了半天,有很多叫添加优先级(priority)的,可根本没用。。。 3.但功夫不负有心人,找到一篇10年前的文章

zhouyu的博客 7104

Android语言基础教程(186)Android多媒体应用开发之播放音频与视频:Android音视频开发入门:让你的应用“声”动起来

你是否曾羡慕那些能播放音乐、展示视频的炫酷Android应用?其实,让应用“能歌善舞”并不像想象中那么复杂。纵观移动市场上的手机,特别是智能手机,现在的设备已经发展成一个集照相机、音乐播放器、视频播放器于一体的智能设备。为手机提供音视频的录制、播放功能已成为软件开发必不可少的内容。今天,就让我们一起探索Android多媒体开发的奇妙世界!

jxf_jxfcsdn的博客 414

MediaButtonReceiver---独特的媒体广播接收器

MediaButtonReceiver,  其实Android中并没有这个类的定义,它是由于自身的注册方式与实现功能被大家所俗称。前阵子要实现一个蓝牙耳机按键播放音乐的功能,有幸了解了一下。 MediaButtonReceiver ,顾名思义,就是用于接收多媒体按钮广播的,常用于耳机等多媒体设备的按键监听。 由于耳机设备上的按键点击都会发送广播,所以在一开始去实现耳机按键事件监听的时候,我用的

a751608624的专栏 7416

Android音频焦点及混音策略

前言 音频焦点官方解读 两个或两个以上的 Android 应用可同时向同一输出流播放音频。系统会将所有音频流混合在一起。虽然这是一项出色的技术,但却会给用户带来很大的困扰。为了避免所有音乐应用同时播放,Android 引入了“音频焦点”的概念。一次只能有一个应用获得音频焦点。 当您的应用需要输出音频时,它需要请求获得音频焦点,获得焦点后,就可以播放声音了。不过,在您获得音频焦点后,您可能无法将其一直持有到播放完成。其他应用可以请求焦点,从而占有您持有的音频焦点。如果发生这种情况,您的应用应暂停播放.

静虚待令,有物混成 1万+

Android音视频开发进阶:ExoPlayer核心架构与实战指南

在Android音视频开发领域,MediaPlayer是基础播放组件,适用于简单场景。然而,面对自适应流媒体、多轨道切换等复杂需求时,其扩展性不足。ExoPlayer作为Google开源的应用级媒体播放框架,采用模块化设计,将媒体数据的加载、解码、渲染等环节解耦,通过MediaSource、Renderer、TrackSelector等核心组件协同工作,实现了高度可定制化。这种架构不仅提升了播放稳定性和性能,还支持DASH、HLS等现代流媒体格式,满足直播、点播、广告插入等多样化应用场景。本文聚焦ExoPl

weixin_30701575的博客 365

android button响应函数,响应媒体按钮  |  Android 开发者  |  Android Developers

媒体按钮是 Android 设备和其他外围设备上的硬件按钮,例如蓝牙耳机上的暂停/播放按钮。当用户按下媒体按钮时,Android 会生成 媒体按钮 KeyEvents 的键码是以 KEYCODE_MEDIA 开头的常量(例如 KEYCODE_MEDIA_PLAY)。应用应该能够处理三种情况下的媒体按钮事件,按以下优先级顺序排列:应用的界面 Activity 可见时当界面 Activity 被隐藏且...

weixin_39609457的博客 615

android音视频!四年Android面试遇到的问题整理,高级面试题+解析

背景 知乎客户端中有一个自己维护的 Hybrid 框架,在此基础上开发了一些 Hybrid 页面,当需要前端或者客户端开发接口的时候,就涉及到联调的问题。 和一般的 前端 <=> 服务端,或者 客户端 <=> 服务端 类似,前端 <=> 客户端也会出现联调的各种问题,但是往往 Hybrid 开发相关的调试工具并不是那么完备。 由于在 Hybrid 里面,前端和客户端联系是很紧密的,假如一个人既熟悉前端开发又熟悉客户端开发,调试是很容易的,但是现实一般是可能客户端开发并不是

左夜天 1427

【面试题分享】2024最新Android音视频开发必备面试题

音视频开发为Android应用带来了无限可能,从基础的播放功能到复杂的实时通讯,开发者可以利用Android提供的强大API和第三方库,打造出功能丰富、用户体验卓越的多媒体应用。随着技术的不断进步,音视频开发将继续在Android平台上扮演重要角色,为用户带来更加精彩的移动体验。

yihanss的博客 1994

EtherCAT同步模式实战:如何用TwinCAT配置DC-Synchronous模式(附时序图详解)

本文详细解析了如何在TwinCAT环境中配置EtherCAT的DC-Synchronous同步模式,实现纳秒级同步精度。通过硬件准备、参数配置和高级调优步骤,帮助工程师解决工业自动化中的同步挑战,提升运动控制性能。

gold的博客 1571

SAP_MM模块采购订单显示含税价&不含税简介

不含税价(Net Price):基础商品价格,不包含税金。含税价(Gross Price):基础价格加上适用税金后的总价。在SAP中,采购订单通常以不含税价为基础,通过配置税码和定价方案,系统会自动计算含税总价。

我小时候很黑的博客 2302

android音频会话,android音视频指南-使用媒体会话media session

媒体会话与它所管理的播放器共存。您应该在拥有媒体会话及其关联播放器的活动或服务的onCreate()方法中创建并初始化一个媒体会话。注意:编写媒体应用程序的最佳实践是使用media-compat库。在本页中,术语“媒体会话”指的是MediaSessionCompat的实例,而“媒体控制器”指的是MediaControllerCompat的实例。初始化媒体会话media session新创建的媒体会...

weixin_39618173的博客 424

Python爬虫实战:京东/淘宝商品价格与评论监控系统——从User-Agent伪装到编码陷阱的全面攻克

在电商数据驱动决策的今天,无论是个人消费者想抓住历史低价,还是市场分析师需要追踪竞品动态,抑或是算法交易员依赖实时价格信号,自动化的商品价格与评论监控系统都已成为不可或缺的工具。然而,电商平台的反爬虫策略日益严苛,字符编码的“暗坑”更是让初学者屡屡碰壁。本文将以京东(JD.com和淘宝(Taobao.com两大主流平台为目标,手把手带你构建一个稳定、高效的商品监控爬虫。User-Agent伪装——如何模拟真实浏览器行为,突破初级反爬。GBK/UTF-8编码混战。

2201_76125261的博客 75

android音视频指南-使用媒体会话media session

翻译自Using a media session 媒体会话与它所管理的播放器共存。您应该在拥有媒体会话及其关联播放器的活动或服务的onCreate()方法中创建并初始化一个媒体会话。 注意:编写媒体应用程序的最佳实践是使用media-compat库。在本页中,术语“媒体会话”指的是MediaSessionCompat的实例,而“媒体控制器”指的是MediaControllerCompat的实...

harrain的博客 1117

ICM20948 DMP代码详解(69)

ICM20948 DMP代码详解(69)

phmatthaus的专栏 616

python:实现矩阵SVD分解(附完整源码)

python:实现矩阵SVD分解(附完整源码)

希望我的博客,能帮上你解决学习中工作中所遇到的问题 603

Qt/C++编写视频监控显示安卓版

之前就对代码的兼容性做了很好的处理,所以只要开发环境正常,基本的在其他系统比如手机端或者嵌入式linux上重新编译代码即可,最大的难点变成了如何交叉编译对应系统的ffmpeg库,这个在网上有很多的文章专门写这个,编译安卓版本也是需要借助谷歌提供的安卓编译器先把ffmpeg的安卓版本编译好,ffmpeg在跨平台这块也是和Qt一样的强大,各个平台上都能正常编译,只需要配置好编译脚本参数即可。一鼓作气直接将这套视频监控组件编译了安卓版本。

Qt/C++视频监控/推流/物联网/大屏系统/自定义控件/UI定制/输入法 1032

SAP物料主数据归档详解(物理删除)

顾问们的回答肯定的统一的不能,只能打上删除标记。物料设置好需要删除的物料号这里我们需要删除的物料是AG88,其中,若不选“考虑无删除标记的物料”,需要将需要归档的物料MM06打删除标记。平时在操作系统过程中经常会不小心创建出很多无用的物料主数据,但是系统只能通过MM06打上删除标记,但是物料最终在系统中还是可以查询到的。6、执行已设置变式的归档程序,执行完毕,点下图中的“Job”,每次执行完归档程序会产生两条作业。然后设置好开始的参数和假脱机的参数,三个都是绿灯就可以执行归档的操作,物理上删除物料主数据。

我小时候很黑的博客 5524

Crawlee for Python 贡献者开发指南:环境搭建、代码检查与发布流程

Crawlee for Python 是一个面向网页抓取与浏览器自动化的开源爬虫库,支持 HTTP 请求、BeautifulSoup/Parsel 解析与 Playwright 浏览器自动化。本文是面向该仓库开发者的完整贡献指南,涵盖开发环境搭建、`uv`/Poe 任务体系、ruff/ty/pytest 代码检查链、文档构建以及基于 Conventional Commits 的自动发布流程。读完本

gitblog_00023的博客 868

AutoSAR系列讲解(深入篇)13.6-闪烁一颗LED灯 6

闪烁一颗LED灯:配置SWC和生成代码

雪云飞星的博客 1万+

一些笔者原创或者搜集的 ABAP 小工具集合(一),持续更新中!!

每个报表短小精悍,拷贝到系统激活即可运行。不少报表脑洞大开。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 2729

3分钟掌握Flet多媒体开发:用Python快速构建专业级音视频应用

想用Python开发功能强大的多媒体应用却担心前端技术门槛?Flet框架让你轻松构建跨平台的音频视频播放器、图片画廊和媒体管理工具!这个革命性的Python框架让后端开发者也能快速创建专业级多媒体应用,无需学习JavaScript或复杂的前端技术。本文将带你从零开始,掌握Flet多媒体处理的核心技能。 ## 🎯 为什么Flet是多媒体开发的理想选择? Flet作为一个全栈Python框架,在

gitblog_00956的博客 547

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

上一篇: 良心推荐:总结Android开发中必备的代码Review清单
下一篇: Android View的工作原理
北辰丶
博客等级 码龄8年 67粉丝 197原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值