Media Apps Overview
原文链接
In this document
- Player and UI
- Media session and media controller
- Video apps versus audio apps
- Media apps and the Android audio infrastructure
- The media-compat library
- Measuring performance
Player and UI
播放音频或视频的多媒体应用通常有两个部分:
- 一个接收多媒体数据,通过视频/音频展示出来的播放器
- 一个通过 transport controls 运行播放器,并可以选择性地显示播放器状态的 UI 界面
在 Android 系统中,你可以从头创建自己的播放器,亦或者你可以从下面的条目中选择 :
- MediaPlayer 类给一个简单的播放器(支持大部分常见的音/视频格式和数据源)提供了最基本的功能
- ExoPlayer 是一个公开低版本 Android audio api 的开源库。ExoPlayer 提供了支持类似于 DASH 和 HLS 这种在 MediaPlayer 中不可用的流的高性能特征。你也可以重构 ExoPlayer 的代码,使得它更易于添加新的功能。ExoPlayer 只能被用于 Android 4.1 及更高版本中。
Media session and media controller
虽然 UI 和 播放器 的 API 可以使任意的,但是对于所有的多媒体播放app而言他们的交互在本质上基本相同。Android framework 定义了两个类:media session 和 media controller,这两个类为 媒体播放器app 提供了一套完善的播放器框架。
媒体会话和媒体控制器使用与标准播放器操作(播放,暂停,停止等)相对应的预定义回调来进行相互通信,以及用于定义特定于您的应用的特殊行为的可扩展自定义调用。
Media session
media session 负责与播放器的所有通信。它隐藏了播放器的 API 从而使得这部分对于 app 的其他模块不可见。播放器仅可以被控制着它的 media session 所调用。
media session 维护了一个代表着播放器状态(播放/暂停)的引用以及维护了当前正在播放的音/视频的信息。一个 media session 可以接收一个或者多个 media controller 的调用。这个特性使得你的播放器被你的 app 包括正在运行着的其他 Android 设备(Android Wear and Android Auto) 一起控制成为可能。
Media controller
media controller 将 UI 隔离开来。 UI 的代码只与 media controller 通信,而不是播放器本身。 media controller 将 transport control 操作转换为 media session 的回调。 当 media session 的状态(播放器状态)改变时,media controller 也接收来自 media session 的回调。 以上提供了一种自动更新相关 UI 的机制。 media controller 一次只能连接到一个 media session 。
当您使用 media controller 和 media session 时,您可以在运行时部署不同的接口和/或播放器。 您可以根据所运行设备的功能,独立更改应用的外观和/或性能。
Video apps versus audio apps
在播放视频时,你的眼睛和耳朵都被占用了。 播放音频时,您正在收听,但您也可以同时使用其他应用程序。 每个用例都有不同的设计。
Video app
视频应用程序需要一个查看内容的窗口。 出于这个原因,视频应用程序通常会实现一个单独的 Activity 。 显示视频的屏幕是 Activity 的一部分。
Audio app
音频播放器并不总是需要可见的UI。 一旦开始播放音频,播放器可以作为后台任务继续运行。 用户可以切换到另一个应用程序,一边工作一边收听。
要在Android中实现此设计,您可以使用两个组件构建一个音频应用程序:用于展示UI的 Activity 和 维护播放器的 Service 。 如果用户切换到另一个应用程序,该 Service 可以在后台运行。 通过将音频应用程序的两个部分分解为单独的组件,每个组件可以更有效地运行。 与播放器相比,UI通常是”短寿命”的,而播放器可以在没有UI的情况下运行很长时间。
支持库提供了两个类来实现这种客户端/服务器方法:MediaBrowserService 和 MediaBrowser。 service 组件被实现为MediaBrowserService的一个子类,包含 media session 及其播放器。 activity 和 media controller 的应该维护一个用于和 MediaBrowserService 进行通信 MediaBrowser 。
使用 MediaBrowserService 可以让配套设备(如Android Auto和Wear)轻松发现您的应用,连接到它,浏览内容并控制,而无需访问您的 activity 。
Media apps and the Android audio infrastructure
一个设计良好的媒体应用程序应该与其他播放音频的应用程序“一起和谐共处”。 它应该准备共享手机,并与您的设备上使用音频的其他应用程序合作。 它也应该响应设备上的硬件控制。
所有这些行为在 Handling Changes in Audio Output 中都有描述。
The media-compat library
media-compat 库包含有助于构建播放音频和视频的应用程序的类。 这些类与运行Android 2.3(API级别9)及更高版本的设备兼容。 他们还与其他Android功能一起工作,以创建舒适,熟悉的Android体验。
media sessions 和 media controllers 的推荐实现类是media-compat 支持库中定义的MediaSessionCompat 和 MediaControllerCompat 。 它们替代Android 5.0(API级别21)中引入的MediaSession 和 MediaController 类的早期版本。 compat 类提供相同的功能,但更容易开发你的应用程序,因为你只需要写一次 API 。 该库通过将媒体会话方法转换为旧版平台版本上的等效方法(可用时)来保持向后兼容性。
如果您已经有一个使用旧类的工作应用程序,我们建议更新到 compat 类。 当您使用 compat 版本时,您可以删除所有对 registerMediaButtonReceiver()的调用以及 RemoteControlClient .
Measuring performance
在Android 8.0(API级别26)及更高版本中,getMetrics()方法适用于某些媒体类。 它返回一个包含配置和性能信息的Bundle对象,表示为属性(键)和值的映射 – map。 getMetrics()方法是为这些媒体类定义的:
MediaPlayer.getMetrics()
MediaRecorder.getMetrics()
MediaCodec.getMetrics()
MediaExtractor.getMetrics()
Metrics 是为每个实例分别收集的,并在实例的整个生命周期内保持不变。 如果没有 metrics 可用,则该方法返回null。 返回的实际 metrics 取决于获取它的类。
Additional code samples
要下载演示此页面上使用的API的示例,请参阅 Android ScreenCapture。
Media Apps Overview相关推荐
- Android开发者指南(18) —— Web Apps Overview
前言 本章内容为开发者指南(Dev Guide)/Web Applications/Web Apps Overview,版本为Android 3.2 r1,翻译来自:"happyjiahan ...
- Android 媒体播放框架MediaSession分析与实践
版权声明:本文为博主原创文章,未经博主允许不得转载 源码:AnliaLee/BauzMusic 大家要是看到有错误的地方或者有啥好的建议,欢迎留言评论 前言 最近一直在忙着学习和研究音乐播放器,发现介 ...
- ui设计未来十年前景_UI设计的10条诫命
ui设计未来十年前景 重点 (Top highlight) The year is approximately 1,300 BC when Moses received the 10 UI desig ...
- Android开发者指南24难点各个击破—来自androi中文翻译组
声明 欢迎转载,但请保留文章原始出处 安卓航班开发:http://www.apkway.com/forum.php 博客园:http://www.cnblogs.com/ ...
- ux和ui_UI和UX设计人员的47个关键课程
ux和ui 重点 (Top highlight) This is a mega-list of the most critical knowledge for UI, UX, interaction, ...
- 监听程序异常ios_最新的移动应用程序侵犯隐私行为ios剪贴板监听
监听程序异常ios The data we copy and paste on our phones using the clipboard features can reveal sensitive ...
- react 监听组合键_投资组合中需要的5个React项目
react 监听组合键 You've put in the work and now you have a solid understanding of the React library. 您已经完 ...
- jqgrid 摧毁_非个人的交流将摧毁我们
jqgrid 摧毁 Livin'Vida手机 (Livin' La Vida Cell Phone) An obnoxious ringtone fires off closely, startlin ...
- iPhone审核条例
1. Terms and conditions(法律与条款) 1.1 As a developer of applications for the App Store you are bound b ...
最新文章
- 刷新三项世界纪录的跨镜追踪(ReID)技术是怎样实现的?进来了解一下
- Ubuntu 10.04编译安装CodeBlocks 10.5
- 转载-centos网络配置(手动设置,自动获取)的2种方法
- 查看Linux系统基本信息CPU内存系统负载
- 正则表达式匹配C++代码实现
- 聚合复合_聚合复合微生物菌剂的功能
- es multi match_PHP 的ES搜索操作
- Kubernetes 学习总结(20)—— Kubernetes 与微服务和容器之间是什么关系?
- 实现一个 webpack loader
- jetty文件服务器,在Jetty中访问Web容器外部的文件
- Android四大组件之Service
- 计算机老显示错误内存不足,电脑老是显示内存不足怎么办
- 学会计学java_我只是一个初中毕业的,现在很想学会计,我不知道从何学起?...
- 充电桩通过WiFi付费和管理方案
- 99元紫米10000mAh移动电源开箱拆解
- 数据分析之numpy基础/matplotlib绘图/numpy常用函数/杂项功能
- 抖音32级多少钱音浪要刷多少钱 抖币详细介绍
- MyBatis简单的增删改查
- POS基本算法详细解析
- 或许微软真的错了,全端 App 的时代要到来了
热门文章
- mysql同步三张表如何用事务_MySQL 多表查询与事务的操作
- 6加载光盘 virtualbox vm_VirtualBox 安装增强功能报【未能加载虚拟光盘】
- error: failed to push some refs to ‘https://github.com/bodokaiser/piwise.git‘
- 南昌-婺源-景德镇攻略
- 第一章 接口自动化简述
- 团队作业第六周--alpha阶段项目复审
- 海信电视linux安装软件下载,海信电视安装第三方软件教程,从第三方软件市场下载软件的方法...
- 手机电池越用越不耐用的原因
- 安全中心开启小米云服务器,小米云服务使用手册
- linux目录权限都是nobody,你真的了解Linux的目录权限?