原文链接

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相关推荐

  1. Android开发者指南(18) —— Web Apps Overview

    前言 本章内容为开发者指南(Dev Guide)/Web Applications/Web Apps Overview,版本为Android 3.2 r1,翻译来自:"happyjiahan ...

  2. Android 媒体播放框架MediaSession分析与实践

    版权声明:本文为博主原创文章,未经博主允许不得转载 源码:AnliaLee/BauzMusic 大家要是看到有错误的地方或者有啥好的建议,欢迎留言评论 前言 最近一直在忙着学习和研究音乐播放器,发现介 ...

  3. ui设计未来十年前景_UI设计的10条诫命

    ui设计未来十年前景 重点 (Top highlight) The year is approximately 1,300 BC when Moses received the 10 UI desig ...

  4. Android开发者指南24难点各个击破—来自androi中文翻译组

    声明 欢迎转载,但请保留文章原始出处               安卓航班开发:http://www.apkway.com/forum.php 博客园:http://www.cnblogs.com/ ...

  5. ux和ui_UI和UX设计人员的47个关键课程

    ux和ui 重点 (Top highlight) This is a mega-list of the most critical knowledge for UI, UX, interaction, ...

  6. 监听程序异常ios_最新的移动应用程序侵犯隐私行为ios剪贴板监听

    监听程序异常ios The data we copy and paste on our phones using the clipboard features can reveal sensitive ...

  7. react 监听组合键_投资组合中需要的5个React项目

    react 监听组合键 You've put in the work and now you have a solid understanding of the React library. 您已经完 ...

  8. jqgrid 摧毁_非个人的交流将摧毁我们

    jqgrid 摧毁 Livin'Vida手机 (Livin' La Vida Cell Phone) An obnoxious ringtone fires off closely, startlin ...

  9. iPhone审核条例

    1. Terms and conditions(法律与条款) 1.1  As a developer of applications for the App Store you are bound b ...

最新文章

  1. 刷新三项世界纪录的跨镜追踪(ReID)技术是怎样实现的?进来了解一下
  2. Ubuntu 10.04编译安装CodeBlocks 10.5
  3. 转载-centos网络配置(手动设置,自动获取)的2种方法
  4. 查看Linux系统基本信息CPU内存系统负载
  5. 正则表达式匹配C++代码实现
  6. 聚合复合_聚合复合微生物菌剂的功能
  7. es multi match_PHP 的ES搜索操作
  8. Kubernetes 学习总结(20)—— Kubernetes 与微服务和容器之间是什么关系?
  9. 实现一个 webpack loader
  10. jetty文件服务器,在Jetty中访问Web容器外部的文件
  11. Android四大组件之Service
  12. 计算机老显示错误内存不足,电脑老是显示内存不足怎么办
  13. 学会计学java_我只是一个初中毕业的,现在很想学会计,我不知道从何学起?...
  14. 充电桩通过WiFi付费和管理方案
  15. 99元紫米10000mAh移动电源开箱拆解
  16. 数据分析之numpy基础/matplotlib绘图/numpy常用函数/杂项功能
  17. 抖音32级多少钱音浪要刷多少钱 抖币详细介绍
  18. MyBatis简单的增删改查
  19. POS基本算法详细解析
  20. 或许微软真的错了,全端 App 的时代要到来了

热门文章

  1. mysql同步三张表如何用事务_MySQL 多表查询与事务的操作
  2. 6加载光盘 virtualbox vm_VirtualBox 安装增强功能报【未能加载虚拟光盘】
  3. error: failed to push some refs to ‘https://github.com/bodokaiser/piwise.git‘
  4. 南昌-婺源-景德镇攻略
  5. 第一章 接口自动化简述
  6. 团队作业第六周--alpha阶段项目复审
  7. 海信电视linux安装软件下载,海信电视安装第三方软件教程,从第三方软件市场下载软件的方法...
  8. 手机电池越用越不耐用的原因
  9. 安全中心开启小米云服务器,小米云服务使用手册
  10. linux目录权限都是nobody,你真的了解Linux的目录权限?