Android系统编程入门系列之硬件交互——多媒体展示
前两篇文章通过麦克风硬件和摄像头硬件分别采集音频和视频的多媒体数据,在得到的多媒体数据通常是以编码文件的格式存储,在用户需要展示时,可通过设备的内置扩音器或蓝牙耳机等硬件播放音频,通过设备的显示屏或外接投影仪等硬件播放照片、动画或视频。
可以将这些展示类设备分为两类。
一类是内置类多媒体硬件,是通过线路硬连接到设备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)方法,参数 attributes 是android.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 指定的毫秒级同步时刻,参数 mode 是MediaPlayer中的常量值,包括实际定位到参数 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系统编程入门系列之硬件交互——多媒体展示的更多相关文章
- Android系统编程入门系列之硬件交互——多媒体摄像头
多媒体系列硬件 多媒体包括图片.动画.音频.视频,这些多媒体素材的采集(输入)主要依靠摄像头和麦克风等硬件设备转化为基础数据,而他们的播放渲染(输出),则需要依靠具有相关功能的编解码软件.当然随着硬件 ...
- Android系统编程入门系列之硬件交互——多媒体麦克风
在多媒体摄像头及相关硬件文章中,对摄像头的使用方式需要区分应用程序的目标版本以使用不同的代码流程,而与之相比,麦克风硬件的使用就简单多了. 麦克风及相关硬件 麦克风硬件在移动设备上作为音频的采集设备, ...
- Android系统编程入门系列之硬件交互——传感器
到目前为止,关于应用程序与用户之间的相关内容便比较肤浅的大致介绍完毕.而在整个系统架构中,应用程序与用户之间的交互,犹如参天大树上的枝干和树叶,交互起来五彩缤纷,但使整个生态系统保持生命力的核心,在于 ...
- Android系统编程入门系列之硬件交互——通信硬件USB
在硬件交互的首篇对设备硬件的分类中,互联通信系列硬件主要用来与其他设备进行数据交互.从本文开始,将重点介绍该系列相关硬件. 互联通信系列硬件 根据硬件的可通信距离,由近及远分为USB.NFC.蓝牙.W ...
- Android系统编程入门系列之硬件交互——通信硬件Bluetooth
通信硬件NFC的文章,虽然可以在Android系统中通过非直接接触的形式与支持NFC硬件的设备通信,但是也只能交互一些简短的标签内容,对大量的持续性数据,却并不能很好的支持.因此针对这个弊端,可以考虑 ...
- Android系统编程入门系列之硬件交互——通信硬件NFC
在上篇文章介绍了接入式USB硬件的简单使用,接下来将介绍不依赖物理连接的硬件通信了.本文的重点是近距离通信的硬件NFC. NFC硬件 应用程序中可以通过NFC硬件读取或发送指定协议的技术实现,在And ...
- Android系统编程入门系列之硬件交互——无线通信WLAN
Android系统的移动设备大多支持无线WLAN技术.利用该技术,不仅能实现互联网通信,还能实现无线定位,热点共享等远程通信功能.针对使用WLAN的不同功能,可能需要分别申请不同的权限声明,同时调用不 ...
- Android系统编程入门系列之硬件交互——通信硬件电信SIM卡
现在的SIM卡通常具备基站定位.语音通话.短信消息.网络流量这四大功能,而在移动端是无法对SIM卡使用基站定位功能的,所以这里只介绍移动端如何使用SIM卡实现语音通话.短信消息.数据流量三个功能. 语 ...
- Android系统编程入门系列之界面Activity绘制展示
上篇文章介绍了界面Activity的启动方式和生命周期,本篇将继续介绍在界面Activity中的内容是如何绘制展示给用户的. 在Android系统上运行新创建的界面Activtiy,给用户展示的是空白 ...
随机推荐
- PowerDotNet平台化软件架构设计与实现系列(04):服务治理平台
系统和系统之间,少不了数据的互联互通.随着微服务的流行,一个系统内的不同应用进行互联互通也是常态. PowerDotNet的服务治理平台发源于早期的个人项目Power.Apix.这个项目借鉴了工作过的 ...
- [luogu5654]基础函数练习题
答案即区间$[l,r]$的笛卡尔树上,左右子树有一个为空的点到根路径和(定义此为的该点答案)的max, 对求区间笛卡尔树复杂度为$o(n)$,无法通过,因此在全局笛卡尔树中考虑此问题 设$k$为$l$ ...
- 微信小程序-物流api
原来用的快递100的接口有变动,现有系统上不能使用了.查看快递100提供的api,探寻微信小程序端的使用情况.有几个是比较合适的:1.跳转api(https://www.kuaidi100.com/o ...
- 【知识详解】JAVA基础(秋招总结)
JAVA基础 目录 JAVA基础 问:面向过程(POP)和面向对象(OOP)? 问:Python和Java的区别? 问:java的八大基本数据类型? 问:封装继承多态说一下? 问:方法和函数的区别? ...
- [SDOI2012] Longge 的问题
题意 求\(\sum_{i}^{n} gcd(i,n)\) 想法 套路题 \(\sum_{i}^{n} gcd(i,n)\) \(=\) \(\sum_{i,i | n} i * phi(n/i)\) ...
- Codeforces 348C - Subset Sums(根号分治)
题面传送门 对于这类不好直接维护的数据结构,第一眼应该想到-- 根号分治! 我们考虑记[大集合]为大小 \(\geq\sqrt{n}\) 的集合,[小集合]为大小 \(<\sqrt{n}\) 的 ...
- HDU 6036 Division Game
HDU 6036 Division Game 考虑每堆石头最多操作 $ \sum e $ 次,考虑设 $ f(x) $ 表示某一堆石头(最开始都是一样的)操作 $ x $ 次后变成了 $ 1 $ 的方 ...
- P3571 [POI2014]SUP-Supercomputer
*X. P3571 [POI2014]SUP-Supercomputer 题意简述:一棵以 \(1\) 为根的树.\(q\) 次询问,每次给出 \(k\),求至少要多少次同时访问不超过 \(k\) 次 ...
- you crash I crash
今天一大早起来,zabbix报错了 我去查看了mysql的状态 MySQL is not running, but lock file (/var/lock/subsys/mysql) exists ...
- pyyaml模块
pyyaml模块是一种文件数据处理格式的方法,常用与生成.解析或修改.yaml配置文件 1.常见.yaml文件格式内容如下 languages: - Ruby - Perl - Python webs ...