前两篇文章通过麦克风硬件摄像头硬件分别采集音频和视频的多媒体数据,在得到的多媒体数据通常是以编码文件的格式存储,在用户需要展示时,可通过设备的内置扩音器或蓝牙耳机等硬件播放音频,通过设备的显示屏或外接投影仪等硬件播放照片、动画或视频。

可以将这些展示类设备分为两类。

一类是内置类多媒体硬件,是通过线路硬连接到设备CPU控制中心,所以在应用程序中可直接调取系统提供的相关接口直接使用这类设备。比如移动手机的内置扩音器、听筒、有线耳机、屏幕等硬件。

另一类是外接类多媒体硬件,是通过配合下文即将介绍的蓝牙或网络等通讯类硬件,通过无线软连接到设备CPU控制中心,在使用这类设备前,必须先配合通讯类硬件的使用。比如蓝牙耳机、投影仪等硬件。

本篇只介绍在内置类多媒体硬件上的使用流程。

播放音频

对于音频的播放,主要借助内置扩音器,使用系统提供的android.media.MediaPlayer类。

使用其无参构造方法后,调用该对象的setDataSource(String path)等系列方法,设置要播放的音频源。该系列方法有多个重写,除了上边参数 path 所表示的本地文件格式的音频源,还可以设置远程网络 Uri 格式的音频源。

除此之外,还需要设置播放的音频流类型,不过设置方法在不同版本上有所区别。

在Android5.0即API级别21之前,调用setAudioStreamType(int streamtype)方法,参数 streamtype 是由android.media.AudioManager音频管理类定义的常量,其值包括标记为语音通话音频流的AudioManager.STREAM_VOICE_CALL=0,标记为系统音频流的AudioManager.STREAM_SYSTEM=1,语音铃声的AudioManager.STREAM_RING=2,或者多媒体音乐流的AudioManager.STREAM_MUSIC=3等多种音频流类型。

从Android5.0即API级别21开始,改用setAudioAttributes(AudioAttributes attributes)方法,参数 attributesandroid.media.AudioAttributes音频属性类构造的对象,而AudioAttributes对象则是通过android.media.AudioAttributes.Builder建造者模式构造的。在无参构造建造者AudioAttributes.Builder对象后,调用setUsage(int usage)方法设置音频属性的使用者,调用setContentType(int contentType)方法设置音频流内容类型,上述方法中的参数 usage 和参数 contentType 都是AudioAttributes定义的常量值。之后通过build()方法返回AudioAttributes音频属性类的实例化对象。

在音频相关参数设置之后,就可以准备音频以通过系统获取相关硬件设备了。

在加载本地的小文件时,可以直接调用 prepare() 方法,代码执行到此处时会停止后续代码运行,直到获取到相关资源,才会继续执行音频准备完成之后的相关操作。因此在系统主线程中调用该方法时需要注意ANR异常。

通常在加载网络资源或过大的文件时,调用prepareAsync()方法,该方法会异步获取相关资源,后续代码继续执行,而当应用程序获取到相关资源后,将回调setOnPreparedListener(MediaPlayer.OnPreparedListener listener)中传入的 listener 参数对象的onPrepared(MediaPlayer mp)方法,而这里的参数 mp 也就是上文调用prepareAsync()MediaPlayer对象。因此在实现android.media.MediaPlayer.OnPreparedListener接口的onPrepared(MediaPlayer mp)方法中,可以继续执行音频准备完成之后的相关操作。

在音频准备完成之后,便可以在合适的时机执行音频的播放流程了。

调用start()方法即可开始播放;

在音频播放过程中,同样可以调用pause()方法暂停播放;

调用seekTo(long msec, int mode)方法可以将播放位置移动到参数 msec 指定的毫秒级同步时刻,参数 modeMediaPlayer中的常量值,包括实际定位到参数 msec 指定的同步位置之前的MediaPlayer.SEEK_PREVIOUS_SYNC=0,实际定位到参数 msec 指定的同步位置之后的MediaPlayer.SEEK_NEXT_SYNC=1,实际定位到参数 msec 指定的同步位置最近的MediaPlayer.SEEK_CLOSEST_SYNC=2等几种可选模式;

调用stop()方法停止播放,将会释放应用程序所获取的包括硬件的相关资源。

显示图片或视频

对于静态图片的展示,通常使用android.widget.ImageView类似控件,直接加载静态图片。

对于无声的动态图展示,通常使用android.view.SurfaceView控件,在该控件上可以绘制几乎任何你能想到的效果。

对于自带音频的有声动图(即视频)展示,可以使用上述方案的结合,也可使用系统提供的android.widget.VideoView控件,可以更方便的加载视频并展示。

同时,由于图片或视频展示都只是借助屏幕绘制,所以使用界面绘制展示一文中的相关知识内容即可实现。而且其他开发者和团队也开发了一系列的相关库以供使用,这在学习过程中并不算难点,故不再赘述。

Android系统编程入门系列之硬件交互——多媒体展示的更多相关文章

  1. Android系统编程入门系列之硬件交互——多媒体摄像头

    多媒体系列硬件 多媒体包括图片.动画.音频.视频,这些多媒体素材的采集(输入)主要依靠摄像头和麦克风等硬件设备转化为基础数据,而他们的播放渲染(输出),则需要依靠具有相关功能的编解码软件.当然随着硬件 ...

  2. Android系统编程入门系列之硬件交互——多媒体麦克风

    在多媒体摄像头及相关硬件文章中,对摄像头的使用方式需要区分应用程序的目标版本以使用不同的代码流程,而与之相比,麦克风硬件的使用就简单多了. 麦克风及相关硬件 麦克风硬件在移动设备上作为音频的采集设备, ...

  3. Android系统编程入门系列之硬件交互——传感器

    到目前为止,关于应用程序与用户之间的相关内容便比较肤浅的大致介绍完毕.而在整个系统架构中,应用程序与用户之间的交互,犹如参天大树上的枝干和树叶,交互起来五彩缤纷,但使整个生态系统保持生命力的核心,在于 ...

  4. Android系统编程入门系列之硬件交互——通信硬件USB

    在硬件交互的首篇对设备硬件的分类中,互联通信系列硬件主要用来与其他设备进行数据交互.从本文开始,将重点介绍该系列相关硬件. 互联通信系列硬件 根据硬件的可通信距离,由近及远分为USB.NFC.蓝牙.W ...

  5. Android系统编程入门系列之硬件交互——通信硬件Bluetooth

    通信硬件NFC的文章,虽然可以在Android系统中通过非直接接触的形式与支持NFC硬件的设备通信,但是也只能交互一些简短的标签内容,对大量的持续性数据,却并不能很好的支持.因此针对这个弊端,可以考虑 ...

  6. Android系统编程入门系列之硬件交互——通信硬件NFC

    在上篇文章介绍了接入式USB硬件的简单使用,接下来将介绍不依赖物理连接的硬件通信了.本文的重点是近距离通信的硬件NFC. NFC硬件 应用程序中可以通过NFC硬件读取或发送指定协议的技术实现,在And ...

  7. Android系统编程入门系列之硬件交互——无线通信WLAN

    Android系统的移动设备大多支持无线WLAN技术.利用该技术,不仅能实现互联网通信,还能实现无线定位,热点共享等远程通信功能.针对使用WLAN的不同功能,可能需要分别申请不同的权限声明,同时调用不 ...

  8. Android系统编程入门系列之硬件交互——通信硬件电信SIM卡

    现在的SIM卡通常具备基站定位.语音通话.短信消息.网络流量这四大功能,而在移动端是无法对SIM卡使用基站定位功能的,所以这里只介绍移动端如何使用SIM卡实现语音通话.短信消息.数据流量三个功能. 语 ...

  9. Android系统编程入门系列之界面Activity绘制展示

    上篇文章介绍了界面Activity的启动方式和生命周期,本篇将继续介绍在界面Activity中的内容是如何绘制展示给用户的. 在Android系统上运行新创建的界面Activtiy,给用户展示的是空白 ...

随机推荐

  1. [luogu7078]贪吃蛇

    结论:若$a_{n}-a_{1}\ge a_{2}$,那么一定会吃掉 证明:分类讨论,若$a_{n-1}$也吃掉了$a_{2}$,就说明$a_{n-1}$之后不会被吃掉,而$a_{n-1}-a_{2} ...

  2. 四、Zookeeper3.7安装

    前文 一.CentOS7 hadoop3.3.1安装(单机分布式.伪分布式.分布式 二.JAVA API实现HDFS 三.MapReduce编程实例 Zookeeper安装 @ 目录 前文 Zooke ...

  3. 力扣 - 剑指 Offer 55 - II. 平衡二叉树

    题目 剑指 Offer 55 - II. 平衡二叉树 思路1(后序遍历+剪枝) 这题是上一题剑指 Offer 55 - I. 二叉树的深度的进阶,逻辑代码和那个一样,也是后续遍历,获取两个子节点较大的 ...

  4. negix安装与配置2-反向代理一台

    negix反向代理: 1.实现效果:打开浏览器,输入www.123.com 跳转到linux系统主页面中 2.准备工作tomcat java环境 https://www.cnblogs.com/q13 ...

  5. Jenkins快速上手安装

    目录 环境准备 - JDK 安装 1. APT 安装 2. WAR包方式运行 3.Docker 方式运行 Jenkins 是一个独立的开源自动化服务器,可以用来自动化与构建.测试.交付或部署软件相关的 ...

  6. python-面向过程、面向对象、类

    目录 python-面向过程.面向对象.类 面向过程编程 面向对象 类和对象 二者区别 定义格式: 定义类发生的事情 定义类的标准格式 属性的查找顺序 python-面向过程.面向对象.类 面向过程编 ...

  7. Codeforces 1511G - Chips on a Board(01trie/倍增)

    Codeforces 题面传送门 & 洛谷题面传送门 一道名副其实的 hot tea 首先显然可以发现这俩人在玩 Nim 游戏,因此对于一个 \(c_i\in[l,r]\) 其 SG 值就是 ...

  8. Codeforces 1404D - Game of Pairs(构造)

    Codeforces 题面传送门 & 洛谷题面传送门 首先注意到 \(\sum\limits_{i=1}^{2n}i=\dfrac{2n(2n+1)}{2}=n(2n+1)\equiv n\p ...

  9. 如何使用csapp文件

    深入理解操作系统中有个csapp.h的头文件 以下来介绍下如何使用它: 该头文件下载地址为http://download.csdn.net/detail/tzasd89812/4206284 在Ubu ...

  10. mysql—Linux系统直接进入mysql服务器,并实现一些基础操作

    首先,我们需要通过以下命令来检查MySQL服务器是否启动: ps -ef | grep mysqld 如果MySql已经启动,以上命令将输出mysql进程列表 如果mysql未启动,你可以使用以下命令 ...