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

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

一类是内置类多媒体硬件,是通过线路硬连接到设备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. 仿Word的支持横轴竖轴的WPF 标尺

    最近在  https://mp.weixin.qq.com/s/3dEO0NZQv5YLqK72atG4Wg   官方公众号看到了 用WPF 制作 标尺 在去年项目上也接到了一个需求,用于排版自定义拖 ...

  2. C代码

    #include<stdio.h>#include<stdlib.h>void main(){    char    ch, file_name1[20], file_name ...

  3. [hdu7000]二分

    不妨假设$x\le y$,可以通过翻转整个格子序列来调整 令$a_{i}$​​为$i$​​到$y$​​的期望步数,显然有方程$a_{i}=\begin{cases}0&(i=y)\\\frac ...

  4. UNCTF2020 web writeup

    1.Easy_ssrf 给了file_get_contents,直接读取flag即可 2.Easyunserialize 利用点在 构造uname反序列化逃逸即可 3.Babyeval 两个过滤,绕过 ...

  5. 2021年春秋杯网络安全联赛秋季赛 勇者山峰部分wp

    1.签到题-Crypto Vigenere 根据题目Vigenere可看出是维吉尼亚密码 使用在线网站破解 https://guballa.de/vigenere-solver flag:53d613 ...

  6. 使用protobuf-java-format包 JsonFormat转Json部分默认值字段消失问题

    使用protobuf-java-format包 JsonFormat转Json部分默认值字段消失问题 1.产生的bug XXXXXXXXRequest.Builder request = XXXXXX ...

  7. Codeforces 566C - Logistical Questions(点分治)

    Codeforces 题目传送门 & 洛谷题目传送门 神仙题 %%% 首先考虑对这个奇奇怪怪的 \(t^{3/2}\) 进行一番观察.考虑构造函数 \(f(x)=ax^{3/2}+b(d-x) ...

  8. Codeforces 1236F - Alice and the Cactus(期望+分类讨论)

    Codeforces 题面传送门 & 洛谷题面传送门 期望好题. 首先拆方差: \[\begin{aligned} &E((x-E(x))^2)\\ =&E(x^2)-2E(x ...

  9. Latex 文档格式化

    title: "Latex 文档格式化" author: 李龙翔 date: "Nov 22, 2019" subject: "Markdown&qu ...

  10. miRNA分析--靶基因预测(三)

    miRNA分析--数据过滤(一) miRNA分析--比对(二) 根据miRNA Target Prediction in Plants, miRNA并非所有区域都要求严格匹配,其中第1位碱基和第14位 ...