查看: 12322|回复: 15
收起左侧

教你智能手机摄像头软件编程

[复制链接]
发表于 2014-1-22 11:29:56 | 显示全部楼层 |阅读模式
本帖最后由 欧阳 于 2014-1-22 11:36 编辑

智能手机摄像头软件编程
   目前的智能手机拥有很多强大的功能,例如摄像头、GPS和无线上网等,现在是我们开始充分使用这些功能的时候了,在本篇文章中我们一起学习,如何在谷歌Android编程环境中,以最简单的方式实现谷歌Android摄像头拍照。
  在本文示例中,我们需要用到两个文件:布局文件和Activity文件。
  
小提示
  数日前,Android 1.5(代号cupcake)新版发布,在安全方面有诸多改进,其中之一与摄像头权限控制有关。在此之前,你能够创建无需用户许可就可实现拍照的应用。现在该问题已被修复,如果你想在自己的应用中使用摄像头,需要在AndroidManifest.xml中增加以下代码:
uses-permission android:name="android.permission.CAMERA"/>
  
设定摄像头布局
  这是开发工作的基础,也就是说我们希望在应用程序中增加多少辅助性元素,如摄像头各种功能按钮等。在本文中我们采取最简方式,除了拍照外,没有多余摄像头功能。下面我们一起看一下本文示例将要用到的布局文件“camera_surface.xml”。
LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent" android:layout_height="fill_parent"
android: orientation="vertical">
SurfaceView android:id="@+id/surface_camera"
android:layout_width="fill_parent" android:layout_height="10dip"
android:layout_weight="1">  
SurfaceView>  
LinearLayout>

  小提示:记住不要在资源文件名称中使用大写字母,如果你把该文件命名为“CameraSurface.xml”,会给你带来不必要的麻烦。
  该布局非常简单,只有一个LinearLayout视图组,在它下面只有一个SurfaceView视图,也就是我们的摄像头屏幕。


摄像头实现代码

现在我们已经查看了摄像头的xml代码,下面再来看一下Android代码。让我们创建一个名为“CameraView”的Activity类,实现SurfaceHolder.Callback接口:
  public class CamaraView extends Activity implements SurfaceHolder.Callback

  接口SurfaceHolder.Callback被用来接收摄像头预览界面变化的信息。它实现了三个方法:
  surfaceChanged
  当预览界面的格式和大小发生改变时,该方法被调用。
  surfaceCreated
  初次实例化,预览界面被创建时,该方法被调用。
  surfaceDestroyed
  当预览界面被关闭时,该方法被调用。
  下面我们一起看一下在摄像头应用中如何使用这个接口,首先看一下在Activity类中的onCreate方法。

  super.onCreate(icicle);
  getWindow().setFormat(PixelFormat.TRANSLUCENT);
  requestWindowFeature(Window.FEATURE_NO_TITLE);
  getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
  WindowManager.LayoutParams.FLAG_FULLSCREEN);
  setContentView(R.layout.camera);
  mSurfaceView = (SurfaceView) findViewById(R.id.surface_camera);
  mSurfaceHolder = mSurfaceView.getHolder();
  mSurfaceHolder.addCallback(this);
  mSurfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
  }

  下面我们逐一对代码进行一下说明。
  getWindow().setFormat(PixelFormat.TRANSLUCENT);
  requestWindowFeature(Window.FEATURE_NO_TITLE);
  getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
  WindowManager.LayoutParams.FLAG_FULLSCREEN);

  通过上述代码,我们告诉屏幕两点信息:
  1、摄像头预览界面将通过全屏显示,没有“标题(title)”
       2、屏幕格式为“半透明”。
  setContentView(R.layout.camera_surface );
  mSurfaceView = (SurfaceView) findViewById(R.id.surface_camera);

  在以上代码中,我们通过setContentView来设定Activity的布局为前面我们创建的camera_surface,并创建一个SurfaceView对象,从xml文件中获得它。
  mSurfaceHolder = mSurfaceView.getHolder();
  mSurfaceHolder.addCallback(this);
  mSurfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
通过以上代码,我们从surfaceview中获得了holder,并增加callback功能到“this”。这意味着我们的操作(activity)将可以管理这个surfaceview。
  我们看一下callback功能时如何实现的:
  public void surfaceCreated(SurfaceHolder holder) {
  mCamera = Camera.open();
  mCamera是“Camera”类的一个对象。在surfaceCreated方法中我们“打开”摄像头。这就是启动它的方式。
  public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) {
  if (mPreviewRunning) {
  mCamera.stopPreview();
  }
  Camera.Parameters p = mCamera.getParameters();
  p.setPreviewSize(w, h);
  mCamera.setParameters(p);
  try {
  mCamera.setPreviewDisplay(holder);
  } catch (IOException e) {
  e.printStackTrace();
  }
  mCamera.startPreview();
  mPreviewRunning = true;
  }

  该方法让摄像头做好拍照准备,设定它的参数,并开始在Android屏幕中启动

预览画面。我使用了一个“semaphore”参数来防止冲突:当mPreviewRunning为true时,意味着摄像头处于激活状态,并未被关闭,因此我们可以使用它。
  public void surfaceDestroyed(SurfaceHolder holder) {
  mCamera.stopPreview();
  mPreviewRunning = false;
  mCamera.release();
  }

通过这个方法,我们停止摄像头,并释放相关的资源。正如大家所看到的,我们在这儿设置mPreviewRunning为false,以此来防止在surfaceChanged方法中的冲突。原因何在?因为这意味着我们已经关闭了摄像头,而且我们不能再设置其参数或在摄像头中启动图像预览。
  最后我们看一下本例中最重要的方法:

  Camera.PictureCallback mPictureCallback = new Camera.PictureCallback() {
  public void onPictureTaken(byte[] imageData, Camera c) {
  }
  };

  当拍照时,该方法被调用。举例来说,你可以在界面上创建一个OnClickListener,当你点击屏幕时,调用PictureCallBack方法。这个方法会向你提供图像的字节数组,然后你可以使用Android提供的Bitmap和BitmapFactory类,将其从字节数组转换成你想要的图像格式。
  结束语
  希望这篇文章对所有人都有所帮助。如果你对Android编程有简单的了解,应该能够很容易理解本文示例。


教你智能手机摄像头软件编程.pdf (81.21 KB, 下载次数: 278)
发表于 2015-4-18 13:48:51 | 显示全部楼层
学习了
发表于 2015-5-28 14:33:10 | 显示全部楼层
学习了。感谢分享
发表于 2015-7-7 08:23:43 | 显示全部楼层
:D
发表于 2015-8-21 13:07:04 | 显示全部楼层
如果是CCM 工厂的测试程序就更好了!!!
发表于 2016-8-10 21:14:38 | 显示全部楼层
不错,学习了
发表于 2016-8-16 14:32:26 | 显示全部楼层
太好了,學習了
发表于 2016-8-16 16:20:09 | 显示全部楼层
厉害!学习了
发表于 2017-3-9 15:58:41 | 显示全部楼层
学习学习,谢谢大神
发表于 2017-3-21 17:22:43 | 显示全部楼层
ok,xie
高级模式
B Color Image Link Quote Code Smilies @朋友

本版积分规则

在线客服

客服电话

欢迎来电咨询

188-9985 8350

微信关注

手机APP程序:
扫码下载访问

微信公众平台:
摄像头之家公众号

微信小程序:
摄像头小程序

返回顶部

QQ|站点统计|小黑屋|手机版|Archiver|摄像头模组论坛网 ( 粤ICP备18155214号 )

Powered by Discuz! X3.4 Licensed© 2001-2013 Comsenz Inc.