Android-多媒体&传感器
1. 音频播放(★★)1.1 MediaPlayerMediaPlayer播放器状态流程如下图:
该播放器同时只能播放一个音乐文件,文件大小并没有限制。
:MediaPlayer必须严格按照状态图操作,否则就会出现错误,这些错误都是底层抛出,严格按照状态图操作的话一般就不会出问题。
使用MediaPlayer播放音乐的步骤
1.2 SoundPool SoundPool和其他声音播放类相比,其特点是可以自行设置声音的品质、音量、播放比率等参数。并且它可以同时管理多个音频流,每个流都有独自的ID,对某个音频流的管理都是通过ID进行的。
1. SoundPool最大只能申请1M的内存空间,这就意味着我们只能用一些很短的声音片段,而不是用它来播放歌 曲或者做游戏背景音乐。
2. SoundPool提供了pause和stop方法,但这些方法建议最好不要轻易使用,因为有些时候它们可能会使你的程序莫名其妙的终止。有些朋友反映它们不会立即中止播放声音,而是把缓冲区里的数据播放完才会停下来,也许会多播放一秒钟。
3. SoundPool的效率问题。其实SoundPool的效率在这些播放类中算是很好的了,这可能会影响用户体验。也许这不能管SoundPool本身,因为到了性能比较好的Droid中这个延迟就可以让人接受了。
使用SoundPool播放音乐的步骤
1.3使用两种方式播放音乐该案例比较简单,布局中只需两个按钮,一个用于播放MediaPlayer一个用于播放SoundPool。我们需要将事先准备好的因为文件放到res/raw目录下,其中raw目录需要我们新创建。
代码清单如下:
1.4案例-音乐播放器:制作一个播放器,能够播放/暂停/停止/重播音乐文件,并且添加一个SeekBar,音乐播放时,SeekBar的滚动条也会变化,拖动SeekBar,可更改声音播放的进度。
:要实现此音乐播放器,必须严格按照上方的MediaPlayer状态流程图进行控制,否则非常容易使应用程序出错挂掉。
新创建一个Android工程《音乐播放器》
修改并使用默认布局文件,布局文件清单如下:
使用并编写默认的MainActivity类,在该类中实现核心业务逻辑。代码清单如下:
运行上面的工程,效果图如下:
2. 视频播放(★★)2.1 使用MediaPlayer+SurfaceView播放视频文件:在这里视频播放依然通过MediaPlayer类,为了方便演示,我们直接使用1.4章节中的创建的工程,只需在布局文件添加SurfaceView控件即可。
我们直接在1.4章节的代码基础上进行修改,修改MainActivity类,这里只给出不同的代码片段:
添加如下变量的声明
在play()方法中添加如下代码
获取SurfaceView对象,并设置缓存方式
运行该工程,效果图如下:
2.2 使用VideoView控件显示视频VideoView跟MediaPlayer相比播放视频步骤要简单的多,因此VideoView自己提供了播放,暂停、快进、快退、进度条等方法。使用起来要方便的很多。
:1、设置布局文件,布局文件比较简单,因此这里只给你VideoView标签。
- 设置VideoView的播放文件路径和媒体控制器,调用start方法即可播放媒体文件。
- 覆写MediaPlayerControl接口中的抽象方法
:上面的方法都是回调方法,我们可以在这些方法里面实现我们的业务逻辑。但是当我们给VideoView设置setMediaController后,控制器才会出现。
4、运行上面代码,效果图如下:
3. 传感器(★★)3.1 Android中常见的传感器Android手机中内置了很多传感器,其主要类型有:方向、加速度(重力)、光线、磁场、距离(临近性)、温度等。
方向传感器 Sensor.TYPE_ORIENTATION
加速度(重力)传感器 Sensor.TYPE_ACCELEROMETER
光线传感器 Sensor.TYPE_LIGHT
磁场传感器 Sensor.TYPE_MAGNETIC_FIELD
距离(临近性)传感器 Sensor.TYPE_PROXIMITY
温度传感器 Sensor.TYPE_TEMPERATURE
3.2 传感器的使用获取传感器管理器SensorManager:
通过传感器管理器对象获得指定类型的传感器:
通过传感器管理器对象获得手机中所有的传感器:
使用传感器管理器对象注册传感器来使一个传感器工作:
:
listener :传感器事件监听器
sensor :要被注册的传感器对象
rate :采样率,分为最快、游戏、普通、用户界面几种当应用程序请求特定的采样率时,其实只是对传感器子系统的一个建议,不保证特定的采样率可用。
采样率的四种类型详解:
最快: SensorManager.SENSOR_DELAY_FASTEST
最低延迟,一般不是特别敏感的处理不推荐使用,该种模式可能造成手机电力大量消耗,由于传递的为原始数据,算法不处理好将会影响游戏逻辑和UI的性能
游戏: SensorManager.SENSOR_DELAY_GAME
游戏延迟,一般绝大多数的实时性较高的游戏都使用该级别
普通: SensorManager.SENSOR_DELAY_NORMAL
标准延迟,对于一般的益智类或EASY级别的游戏可以使用,但过低的采样率可能对一些赛车类游戏有跳帧现象
用户界面: SensorManager.SENSOR_DELAY_UI
一般对于屏幕方向自动旋转使用,相对节省电能和逻辑处理,一般游戏开发中我们不使用
3.3 案例-公交防盗:当手机从衣服兜里被掏出时,手机响铃报警。
:使用距离传感器,当距离从0变为1时,使用MediaPlayer播放声音文件报警
:
- 设置布局文件:添加一个报警按钮开关,用于开启/停止报警功能
- 声明成员变量
- 使当前类继承SensorEventListener并覆写抽象方法
- 覆写Activity的onCreate方法,在该方法里面实现MediaPlayer的初始化以及传感器的监听
4. 摄像头(★★)4.1 调用系统摄像头实现照相和摄像功能调用系统摄像头进行拍照和摄像无需添加权限,直接调用即可。只需知道系统摄像头的action和category就可以调用系统摄像头。
步骤:
- 打开Android源码,查看”\packages\apps\”文件文件目录下的Camera应用,即系统摄像头的应用程序。打开其清单文件文件,查看其Activity的action和category信息。
- Camera类的action和category
VideoCamera类的action和category
- 已知调用系统摄像头拍照和摄像功能对应的action和category信息,采用隐式调用的方式调用Activity。
由于希望在调用拍照或摄像功能后回到当前应用的界面,且得知拍照或摄像的结果如何,是否成功,所以在开启Activity时不能使用startActivity方法,而是使用startActivityForResult方法开启Activity,并重写onActivityResult方法处理回传的数据。
:布局文件比较简单,界面只有两个按钮,一个用于打开照相机,一个用于打开摄像机。这里只给出代码清单。
拍照功能
摄像功能(摄像功能跟拍照功能比仅仅是action不同而已)
4.2 编码实现照相功能使用Camera+SurfaceView控件可实现拍照功能。
步骤:
- 设置布局文件:一个SurfaceView和一个拍照按钮
- 在清单文件中添加2个权限信息
- 获取SurfaceView控件的实例,通过其辅助类SurfaceHolder对象添加CallBack接口的实现
- 添加点击拍照按钮的点击事件:设置摄像头自动对焦,对焦完成后保存图片并重新预览
4.3 编码实现摄像功能使用Camera+MediaRecoder + SurfaceView控件可实现录制视频的功能。
所需权限:
:
- 设置布局文件:一个SurfaceView+一个开始录制按钮+一个停止录制按钮
- 在清单文件中添加权限信息:摄像头+录音+写SD卡
- 声明要使用的成员变量
- 重写Callback接口的surfaceCreated和surfaceDestroyed方法:SurfaceView创建时初始化摄像头,销毁时释放摄像头资源
至此,本文档完!
2014年12月24日星期三 22:30:43
北京市海淀区东北旺中路东馨园