Android媒体应用(六)--响应媒体按钮

Android车载多媒体开发MediaSession框架理解 Android 5.0开始(当前最新是)引入的媒体应用框架,分为媒体控制器MediaController(用于界面UI)和媒体会话MediaSession(用于播放器PlayerMediaSession框架,使用一套接口,减少了很多流程的繁琐和service的通信等,实现多个设备或者UI的统一调用,其代码可读性、结构耦合度(解耦UI和播放器:MediaPlayer、ExoPlayer等)方面都控制得非常好MediaSession主要应用于播放音频或视频的多媒体应用中⚠️ 注意。 阅读详情

原文地址:https://developer.android.google.cn/guide/topics/media-apps/mediabuttons.html

媒体按钮是Android设备和其他外围设备上的硬件按钮,例如蓝牙耳机上的暂停/播放按钮。当用户按下媒体按钮时,Android会生成一个KeyEvent,其中包含一个用于标识该按钮的 key code。媒体按钮KeyEvents的key code是以KEYCODE_MEDIA开头的常量(例如,KEYCODE_MEDIA_PLAY)。


在三种情况下,应用程序应该能够处理媒体按钮事件,按以下顺序排列:
  • 当应用程序的UI活动是可见的
  • 当UI活动被隐藏并且应用程序的媒体会话处于活动状态时
  • 当UI活动被隐藏并且应用程序的媒体会话处于非活动状态并需要重新启动时

处理前台Activity中的媒体

按钮前台活动在其onKeyDown()方法中接收媒体按钮键事件。根据Android的运行版本,系统可以通过两种方式将事件路由到媒体控制器:

  • 如果您正在运行Android 5.0(API级别21)或更高版本,请调用FLAG_HANDLES_MEDIA_BUTTONS MediaBrowserCompat.ConnectionCallback.onConnected。这将自动调用媒体控制器的dispatchMediaButtonEvent(),将密钥代码转换为媒体会话回调。
  • 在Android 5.0(API级别21)之前,您需要修改onKeyDown()来自己处理事件。 (请参阅处理活动媒体会话中的媒体按钮以获取详细信息)以下代码片段显示如何拦截键码并调用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);
 }

寻找mediasession

如果前台Activity不处理事件,则Android将尝试查找可处理该事件的mediasession。 同样,根据Android的运行版本,有两种方法可以搜索mediasession:

  • 如果您运行的是Android 8.0(API级别26)或更高版本,则系统将尝试使用本地播放音频的MediaSession查找最后一个应用程序。 如果session仍然处于活动状态,则Android将直接向其发送事件。 否则,如果会话不是活动的,并且它有一个mediabutton接收器,则Android将事件发送给接收器,这将重新启动mediasession,因此它可以接收事件。 (有关详细信息,请参阅使用媒体按钮重新启动非活动媒体会话。)如果会话没有媒体按钮接收器,系统会放弃媒体按钮事件,并且不会发生任何事情。 逻辑如下图所示:

  • 在Android 8.0(API级别26)之前,系统尝试将事件发送到活动的媒体会话。 如果有多个活动媒体会话,则Android会尝试选择准备播放(缓冲/连接),正在播放或已暂停的媒体会话,而不是已停止的媒体会话。 (请参阅处理活动媒体会话中的媒体按钮以获取更多详细信息。)如果没有活动会话,则Android会尝试将事件发送到最近活动的会话。 (有关详细信息,请参阅使用媒体按钮重新启动不活动的媒体会话
逻辑如下图所示:

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

在Android 5.0(API级别21)及更高版本上,Android会通过调用onMediaButtonEvent()自动将媒体按钮事件分派到活动媒体会话。默认情况下,该回调将KeyEvent转换为与key code相匹配的相应媒体会话回调方法。

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

MediaButtonReceiver是一个短暂的BroadcastReceiver。它将传入的Intent转发到管理媒体会话的服务。如果您想在Android 5.0之前的系统中使用媒体按钮,则必须使用MEDIA_BUTTON intent过滤器将MediaButtonReceiver包含在清单中:
<receiver android:name="android.support.v4.media.session.MediaButtonReceiver" >
   <intent-filter>
     <action android:name="android.intent.action.MEDIA_BUTTON" />
   </intent-filter>
 </receiver>

BroadcastReceiver将Intent转发给您的服务。 为了解析Intent并生成对媒体会话的回调,请在服务的onStartCommand()中包含MediaButtonReceiver.handleIntent()方法。 这将 key code转换为适当的会话回调方法。
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 Intent到清单注册的组件(如服务或BroadcastReceiver)来重新启动会话。
这可以让您的应用重新开始播放,而其UI不可见,这是大多数音频应用的情况。
当您使用MediaSessionCompat时,此行为将自动启用。 如果您使用Android框架的MediaSession或支持库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级别21)的系统中运行的应用程序,注册以处理 active session的媒体按钮的MediaButtonReceiver在session处于非活动状态时也将接收媒体按钮事件。没有办法来禁用此行为。

自定义媒体按钮处理程序

onMediaButtonEvent()的默认行为将提取 key code,并使用媒体会话的当前状态和支持的操作列表来确定要调用的方法。例如,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()动态创建MediaButtonReceiver,并将其传递给PendingIntent


在早于Android 5.0的系统中运行时:
  • 覆盖活动的onKeyDownEvent()来处理媒体按钮
  • 通过将其添加到应用程序的清单静态创建一个MediaButtonReceiver

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

相关推荐

Media3:Android下一代媒体框架

Media3是由 Google 作为 AndroidX 的一部分推出的强大媒体播放库。它提供了一个易于使用的 API,简化了 Android 应用程序中媒体播放的实现。使用Media3,您可以深入设计沉浸式的音频和视频体验。如果您之前使用过ExoPlayer或Media2,则会对Media3的用户友好界面感到非常熟悉。与其为给定的用例决定使用哪个库,不如使用Media3提供的一组库,它们可以很好地协同工作,并扩展以涵盖新的用例,如视频编辑和转码。

虎哥LoveDroid 9531

[Android]MEDIA_BUTTON使用指南

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_33955681的博客 1089

安卓手机APP开发__媒体开发部分__使用媒体会话对播放进行控制和加广告

媒体会话提供了一个通用的方法来和一个音频或者是视频的播放器进行交互. 在媒体3中,默认的播放器是ExoPlayer,它实现了播放器的接口. 和媒体会话进行连接的播放器允许一个APP进行外部的媒体广告的播放和 接收外部源头的播放指令.

红孩儿编程大师 1329

android的监听器分析,Android中MediaButtonReceiver广播监听器的机制分析

在Android中并没有定义MediaButtonReceive这个广播类,MediaButtonReceive只是作为一种通俗的命名方式来响应插入耳机后,点击耳机上的按钮(名称:MEDIA_BUTTON)接受该广播事件的类。所有该MEDIA_BUTTON的按下我们就简称为MEDIA_BUTTON广播吧。顾名思义:它显然是一个广播接收器类(BroadbcastReceiver),那么它就具备了Br...

weixin_35041325的博客 1124

Android按钮状态与颜色动态变化指南

在Android应用开发中,按钮(Button)是用户交互的基本元素之一。它允许用户通过点击来触发某些操作,比如提交表单或打开新的界面。Button是View类的子类,这使得它继承了所有基本的View特性,如设置文本、图标、大小和颜色等。Selector在Android开发中,状态选择器(Selector)通常通过XML文件来定义,这些文件位于项目的目录下。一个典型的Selector XML文件定义了不同状态下按钮所展现的视觉效果。XML文件的基本构成包括一个根节点<selector>

weixin_31620365的博客 1172

一文读懂资管系统里的“清算路径”:钱和券的“导航地图”

简单来说,清算路径就是给每一笔交易预设好的“导航路线”。钱从哪个银行账户出?通过哪家证券公司去买?用哪个股东账户去登记?买回来的股票记在谁的名下?“清算路径”就是把这一连串问题的答案提前配置好。它连接了银行托管户(钱的源头)、券商(交易的中介)和交易所(买卖的市场)。没有配好这条路,交易就无法闭环。清算路径是金融基础设施的缩影。资金如何安全地从银行流向市场;资产如何合法地归属到产品名下;交易数据如何在不同系统间流转。它是资管系统能够日复一日、准确无误地处理亿万级交易的基石。

m0_37607945的博客 235

【Android】监听媒体按键按下--响应媒体按钮

媒体按钮是 Android 设备和其他外围设备上的硬件按钮,例如蓝牙耳机或者线控耳机上的暂停/播放按钮。当用户按下媒体按钮时,Android 会生成 KeyEvent,其中包含用于标识按钮的键码。 可先阅读一下官方的文档,了解下整个流程和机制: 官方文档:响应媒体按钮 本文是监听播放、上一首、下一首等按键事件的代码实现。 不同版本的实现方式,差异有点大,比较碎片化。本人肤浅地认为Android5.0以下通过广播的方式接收,5.0及以上通过MediaSession,官方也封装了MediaSessionComp

toaksg的博客 6005

Windows Server 2012 R2虚拟机安装全攻略:从镜像选择到网络配置一步到位

本文提供Windows Server 2012 R2虚拟机安装全攻略,涵盖从镜像选择到网络配置的完整流程。详细讲解在Oracle VM VirtualBox中的安装步骤、TCP/IP网络设置、系统优化及常见问题解决方案,帮助用户快速搭建可立即投入使用的服务器环境。特别适合IT初学者和系统管理员学习传统服务器应用的部署与配置。

weixin_28363123的博客 538

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

媒体按钮是Android设备和其他外围设备上的硬件按钮,例如蓝牙耳机上的暂停/播放按钮。当用户按下媒体按钮时,Android会生成一个KeyEvent,其中包含一个识别按钮的密钥代码。media button KeyEvents的关键代码是以KEYCODE_MEDIA开头的常量(例如,KEYCODE_MEDIA_PLAY)。 应用程序应该能够在三种情况下处理媒体按钮事件,按优先顺序排列: 当应...

qq_43093708的博客 736

NOTE: When using the `ipython kernel` entry point, Ctrl-C will not work.解决方案

本文主要介绍了NOTE: When using the `ipython kernel` entry point, Ctrl-C will not work.解决方案,希望能对使用jupyter notebook的同学们有所帮助。 文章目录 1. 问题描述 2. 解决方案

weixin_43178406的博客 11万+

UNet改进(24):注意力机制-从基础原理到高级融合策略

本文系统探讨了如何通过引入各类注意力机制增强UNet在医学图像分割中的性能。文章分为基础篇、进阶篇和高级篇三个层级:基础篇介绍了时序注意力、可变形注意力、分层注意力等8种基础机制;进阶篇提出了5种混合注意力设计;高级篇则探讨了全局+局部+多尺度等复杂组合机制。实验表明,这些注意力模块在心脏MRI、肺部感染等任务中能提升2-15%的分割精度。文章还提供了硬件适配建议和完整实现代码,为研究者提供了全面的技术参考。未来方向包括NAS优化、量子注意力等前沿探索,为UNet在医疗影像等领域的应用革新提供了理论指导。

2501_91516851的博客 764

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

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

weixin_39609457的博客 615

踩遍Windows所有坑:Codex CLI桌面端+命令行双环境安装避坑实战

Windows下装Codex CLI的坑,本质上都是Windows本身的路径、环境变量、权限、编码这些历史遗留问题,和工具本身关系不大。只要避开中文路径、正确配置PATH、注意终端环境差异,其实安装非常简单。这套双环境方案配好之后,桌面端适合可视化调试、多会话管理,终端适合嵌入编辑器、脚本调用,一套配置两边通用,体验还是很流畅的。按照上面的流程走,基本不会出大问题,就算出问题也能在排查表里找到对应解法。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 299

android 线控按钮响应,转:android 线控按钮编程

为google到此的同学行个方便。BTW:如果安装了子午播放器,可能receiver接收不到这个MEDIA_BUTTON的动作,具体的可以用DDMS连上去看。我也没分析清楚子午播放器是在哪里注册的。可能是在service里吧。IntroductionMany Android devices come with the Music application used to play audio fil...

weixin_32795109的博客 246

第15章 AI 产品原型设计 —— 让 AI 成为你的产品经理

理解产品需求- 将模糊的想法转化为具体的原型方案生成高质量原型- 输出符合设计规范的 HTML 原型提供设计建议- 基于 UX 最佳实践给出优化建议维护原型文档- 自动更新原型说明和变更记录。

快乐的修补匠的专栏 503

matlab SAR图像的多视滤波

单视复数数据(Single Look Comple)是原始的最高分辨率数据,但是从单个像元散射的雷达回波信号的相干叠加,导致强度信息有很多噪声。SAR的多视处理是对SLC数据方位向和/或距离向做平均,得到的结果是多视后的强度数据。多视处理可以提高SAR图像的信噪比,有效抑制斑点噪声,但是会降低方位分辨率。

点云侠的博客 534

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

我正在尝试使用新的MediaSession类接收媒体按钮,到目前为止我一直没有成功 . 有没有人设法使用新课程接收它们?我已成功创建MediaSession并使用它来更新远程显示器(车载娱乐系统)上的歌曲信息,但到目前为止我无法接收按钮,耳机控制和蓝牙耳机控制 .在我创建媒体会话后,我在用于播放音频的服务中执行以下操作:_mediaSession = new MediaSession(getApp...

weixin_42297390的博客 491

yolov5运行detect.py之后卡住了?没后续,没结果,没报错,怎么办?如何解决?

🏆 本文收录于《全栈Bug调优(实战版)》专栏,致力于分享我在项目实战过程中遇到的各类Bug及其原因,并提供切实有效的解决方案。无论你是初学者还是经验丰富的开发者,本文将为你指引出一条更高效的Bug修复之路,助你早日登顶,迈向财富自由的梦想🚀!同时,欢迎大家关注、收藏、订阅本专栏,更多精彩内容正在持续更新中。让我们一起进步,Up!Up!Up!    备注: 部分问题/难题源自互联网,经过精心筛选和整理,结合数位十多年大厂实战经验资深大佬经验总结所得,数条可行方案供所需之人参考。

**My Coding Family** 1105

解决在Android设备播放音频与其他应用重音的问题,并监听耳机的控制按钮

概述在安卓开发中免不了需要播放一点音乐了,音频了。但是这时候有别的应用正在播放,这时候就会出现重音的现象,完全影响用户体验,我们的项目就遇上了这样的尴尬,然后查找了一些文档,记录一下;管理音频焦点从谷歌开发了解到,这跟音频的焦点又关系,我们可以获取当前音频的焦点来解决问题; 有多个应用程序可能播放音频,重要的是要考虑他们应该如何交互。为了避免每个音乐应用程序同时播放,Android使用音频焦点来控

zhaobo012387的博客 6467

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

如何通过Findroid提升Jellyfin媒体体验:安卓应用全面评测

深夜追剧时,你是否遇到过官方客户端加载缓慢、界面卡顿的问题?旅行途中想离线观看却被复杂的下载流程劝退?作为Jellyfin用户,这些痛点或许早已司空见惯。Findroid的出现,正是为了解决这些实际问题,重新定义安卓设备上的媒体消费体验。这款第三方原生客户端不仅开源免费,更在性能优化与用户体验上实现了质的飞跃。 [![Findroid应用品牌标识](https://raw.gitcode.com

gitblog_01122的博客 328

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

Android媒体应用(一)

媒体应用 本节介绍如何将媒体播放器应用程序分离到媒体控制器(用于UI)和媒体会话(对于实际播放器)。它描述了两种媒体应用程序架构:一种客户端/服务器设计适用于音频应用程序和单一活动设计的视频播放器。它还显示了如何使媒体应用程序响应硬件控制,并与使用音频输出流的应用程序协作。 媒体应用程序概述 介绍媒体会议和媒体控制器以及如何在音频和视频应用中使用它们。 使用媒体会话 媒体会话隐藏

Iturbo 4983

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

探索Android浮动操作按钮库:提升应用交互体验

在现代Android应用设计中,浮动操作按钮(Floating Action Button,简称FAB)已成为提升用户体验的重要元素。它不仅美观,还能显著增强应用的交互性。**Floating Action Button Library for Android** 是一个专为Android开发者设计的开源库,旨在简化FAB的实现过程,让开发者能够轻松地将这一功能集成到自己的应用中。 ## 项目技...

gitblog_00080的博客 466

【Audio&Video】响应媒体按钮(12)

原 媒体按钮是Android设备和其他外围设备上的硬件按钮,例如,蓝牙耳机上的暂停/播放按钮。当用户按下媒体按钮时,Android会生成一个KeyEvent包含标识该按钮的密钥代码。媒体按钮KeyEvent的键码是以KEYCODE_MEDIA(例如KEYCODE_MEDIA_PLAY)开头的常量。 按照以下优先顺序,应用程序应能够处理三种媒体按钮事件: 当应用程序的UI活动可见时隐藏UI活动并且应...

weixin_34405332的博客 286

Android Auto 支持媒体应用程序解析

掌握这些核心知识点,能系统化展示你对 Android Auto 媒体应用开发的深度理解!是 Android Auto 的强制要求,提供标准化内容发现机制。例如:Spotify、YouTube Music、Pandora。例如:Google Podcasts、Overcast。与 Android 媒体框架深度集成(如系统媒体控件)限制首次加载的媒体项数量(例如首批只加载 20 首)支持车机按需加载媒体内容(避免一次性传输全部数据)绑定到主 Activity。每屏最多显示 6 个菜单项。

斗锋在干嘛的博客 885
上一篇: Android媒体应用(五)--构建视频应用程序
下一篇: Android媒体应用(七)--处理音频输出的变化
ITurbo
博客等级 码龄15年 17粉丝 70原创
评论 10
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值