当Android手机App开发碰到需要使用手机的物理设备时,我们该如何进行合理的开发呢?我想心急的朋友一定会从网上找各种资源,先让自己看到效果之后,才会有开发的下去的想法。毕竟,站在前人种好的树下比较好乘凉吗!这里向大家推荐几篇不错的博文 但作为一个合格的Android开发工程师,弄懂这背后的原理还是很重要的,
本文档只涉及到使用手机的摄像头设备自行开发照相软件,所以,直接使用应用程序提供的Android摄像头API。那么接下来我们就来探究一下如何使用Android硬件设备——摄像头。
Step 1:工欲善其事必先利其器,进行开发前我们先来仔细看一看Android摄像头的API都为我们提供了哪些类和接口:
类 | 描述 |
camrea | 摄像机类,用来控制摄像头拍摄图像或者从相机拍摄视频 |
Camera.Parameters | 相机的服务设置。 |
SurfaceView | 用来展示摄像头拍摄的实时预览图像,控制预览界面 |
接下来我们来看一看Camera类都为我们提供了那些主要的方法:
F.NO | 描述 |
1 | open( ) 打开默认的相机 |
2 | release( )它被用来释放在镜头锁定,所以其他应用程序可以访问它 |
3 | setPrameters( ) 它是用来设置相机参数,包括前后摄像头,闪光灯模式、聚焦模式、预览和拍照尺寸等。 |
4 | setPreviewDisplay(SurfaceHolder holder)它是用来设置预览拍照,绑定绘制预览图像的surface |
5 | startPreview( )它是用来开启相机的预览给用户 |
6 | stopPreview( )它是用来阻止相机的预览给用户 |
7 | takePicture(Camera.ShutterCallback shutter, Camera.PictureCallback raw, Camera.PictureCallback jpeg)它被用来使能/禁止图像拍摄的默认快门声音 |
更多方法介绍请参见文档http://www.yiibai.com/android/android_camera.html
当然Camera.Parameters类中有一些必要的属性也是要我们进行设置的:
F.NO | 描述 |
1 | setPicturesize(int width,int height) 设置图片的尺寸。 |
2 | setPreviewsize(int width,int height) 设置预览照片的尺寸。 |
3 | setRotation(int angle) 集度相对于相机的方向顺时针旋转角度。 |
更多方法介绍请参见文档
在拍照时除了设置这些照相机的设置外,我们还需要处理好手机显示屏幕的预览图像部分,这样才是一个完整可用的照相机应用。那么,接下来我们继续来讨论SurfaceView类,其实SurfaceView类听起来很抽象,很复杂,其实在这里你可以简单的把它看成是一个盛放相机照到图像的容器,就是说我们用camrea扫描到的图像用SurfaceView显示在手机屏幕上,怎么显示就要看你如何设置你的SurfaceView了,我会在后续博文中用具体的实例来演示实现手机拍照的基础的SurfaceView设置。使用手机相机编写应用程序除了要继承SurfaceView类外,还要实现SurfaceHolder.Callback接口,
SurfaceHolder.Callback接口是用于处理预览的事件,需实现如下三个方法:
I.NO | 描述 |
1 | surfaceCreated(SurfaceHolder 预览界面创建时调用,每次界面改变后都会重新创建,需要获取相机资源并设置SurfaceHolder |
2 | surfaceChanged(SurfaceHolderholder, int format, int width, int height): 预览界面发生变化是调用,每次界面发生变化之后需要重新启动预览 |
3 | surfaceChanged(SurfaceHolderholder, int format, int width, int height): 预览销毁时调用,停止预览,释放相机资源 |
以上准备工作理解了之后,接下来的工作就很简单了,只要按照如下步骤就可以轻松实现一个简单的Android手机相机应用程序的编写:
(1) 通过Camera.open()来获取Camera实例;
(2) 调用Camera的getParameters()方法获取拍照参数。该方法返回一个Camera.Parameters对象;
(3) 调用Camera.Parameters对象方法设置拍照参数;
(4) 调用Camera的setParameters(),并将Camera.Parameters对象作为参数传入,这样即可对相机的拍照参数进行控制;
(5) 调用Camera的startPreview()方法开始预览取景,在预览取景之前需要调用Camera的setPerviewDisplay(SurfaceHolder holder)方法设置使用哪个SurfaceView来显示取景图片;
(6) 调用Camera的takePicture()方法进行拍照;
(7) 调用Camera的stopPreview()结束取景预览,并调用release()方法释放资源;
(8) 保存图片到本地;
Step 2:实际案例分析
1. 开发案例1——简单的相机实现
2. 开发案例2——可以保存图片的相机
3. 开发案例3——保存指定区域的图片的相机
4. 开发案例4——整体优化设计