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

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

一类是内置类多媒体硬件,是通过线路硬连接到设备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. Linux(kali)基础设置

    本笔记的友情链接 常用目录介绍 boot 存放启动文件 dev 存放设备文件 etc 存放配置文件 home 普通用户家目录,以/home/$username的方式存放 media 移动存储自动挂载目 ...

  2. Spring Aop面向切面编程&&自动注入

    1.面向切面编程 在程序原有纵向执行流程中,针对某一个或某一些方法添加通知,形成横切面的过程叫做面向切面编程 2.常用概念 原有功能:切点,pointcut 前置通知:在切点之前执行的功能,befor ...

  3. [loj2136]地震后的幻想乡

    考虑kruskal的过程:对$n$条边随机排列(排序),令$k$表示前$k$条边恰好能使图联通,根据题目的提示,即$E(\frac{k}{m+1})=\frac{E(k)}{m+1}$ 设$p(k)$ ...

  4. [nowcoder5669A]Ancient Distance

    对于一个$k$,可以二分枚举答案并判断,判断过程可以贪心找最深的点(线段树区间max)+倍增+线段树区间覆盖(清0)来实现,时间复杂度$o(klog_{2}n)$ 考虑反过来,暴力枚举答案$x$并求出 ...

  5. 微信小程序如何重写Page方法?以及重写Page方法给开发者带来的好处

    17,18年的时候,我当时主要开发小程序,那时候领导想看一下小程序的访问量,还有一些埋点的需求,于是我们的小程序就接入了阿拉丁统计. 阿拉丁的接入方式除了配置以外,主要就一行引入代码.官方要求将以下代 ...

  6. 既生瑜何生亮 access_token VS refresh_token

    中国有句老话, 既生瑜何生亮, 既然有我周瑜在世, 为什么老天还要一个诸葛亮啊? 同样的, 众所周知, 在 OAuth 2.0 授权协议中, 也有两个令牌 token , 分别是 access_tok ...

  7. Jmeter BlazeMeter实现web录制

      1. BlazeMeter安装和注册 BlazeMeter是一款与Apache JMeter兼容的chrome插件,采用BlazeMeter可以方便的进行流量录制和脚本生成,作为接口测试脚本编写的 ...

  8. IDEA 2021.2.3 安装与破解教程

    首先说明,大部分情况下,花10块钱都可以在淘宝找人直接帮你完美解决这个资源问题 所以千万不要相信一些所谓的百度结果,一般都是花费了时间却最后无法解决破解的问题 我相信任何一个想要学习软件开发的人一定要 ...

  9. [Ocean Modelling for Begineers] Ch4. Long Waves in a Channel

    Ch4. Long Waves in a Channel 简介 本章主要介绍明渠中分层流体模拟.练习包括浅水表面波,风暴潮.内波和分层流体模拟. 4.1 有限差分法详细介绍 4.1.1 泰勒公式 4. ...

  10. dlang 安装

    刷论坛看到TIOBE排行榜,排名靠前的基本是C.C++.java.python之类的语言,常用的R语言近几年排名一路走高,前20基本变化不大. 后面发现第二十九位居然有个叫做D的语言,看了下和C语法很 ...