android入门:zxing学习笔记(三)

     个人网站:臭蛋 www.choudan.net

  ViewfinderView自定义了view,实现了一个简洁的扫描界面。这一篇记录我再看代码过程中对于Android Camera 的理解。由于才开始写技术类博客,前两篇有很多不足

之处,都是自己随性而写,估计大家很难对我写的有一个清晰的了解。这篇尝试改变下风格,争取好好的表达我的浅薄理解,也让大家能够看懂。

      在看Barcode Scanner中关于camera代码前,先对android camera开发做个简单的介绍,算是入门。

      首先是使用camera需要用到的权限。

1 <uses-permission android:name="android.permission.CAMERA"/>
2 <uses-feature android:name="android.hardware.camera"/>

     如下是一个很简单的camera示例,简单到只能取景,即打开相机,将景象显示在屏幕上,仅此而已。

 1 import java.io.IOException;
2 import android.app.Activity;
3 import android.hardware.Camera;
4 import android.os.Bundle;
5 import android.view.SurfaceHolder;
6 import android.view.SurfaceView;
7
8 public class CameraTestActivity extends Activity implements SurfaceHolder.Callback {
9 private SurfaceHolder surfaceHolder;
10 private Camera camera;
11 /** Called when the activity is first created. */
12 @Override
13 public void onCreate(Bundle savedInstanceState) {
14 super.onCreate(savedInstanceState);
15 setContentView(R.layout.main);
16 SurfaceView surfaceView = (SurfaceView) findViewById(R.id.preview_view);
17 surfaceHolder = surfaceView.getHolder();
18 surfaceHolder.addCallback(this);
19 surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
20 }
21 @Override
22 public void surfaceChanged(SurfaceHolder arg0, int arg1, int arg2, int arg3) {
23 // TODO Auto-generated method stub
24 }
25 @Override
26 public void surfaceCreated(SurfaceHolder arg0) {
27 // TODO Auto-generated method stub
28 camera = Camera.open();
29
30 Camera.Parameters parameters = camera.getParameters();
31 parameters.setPreviewSize(480, 320); // 设置
32 camera.setParameters(parameters);
33 try {
34 camera.setPreviewDisplay(surfaceHolder);
35 } catch (IOException e) {
36 System.out.println(e.getMessage());
37 }
38 camera.startPreview();
39 }
40 @Override
41 public void surfaceDestroyed(SurfaceHolder arg0) {
42 // TODO Auto-generated method stub
43 if (camera != null) {
44 camera.stopPreview();
45 }
46 camera.release();
47 camera = null;
48 }
49 }

其中的R.id.preview_view如下:

1 <SurfaceView
2 android:id="@+id/preview_view"
3 android:layout_width="fill_parent"
4 android:layout_height="fill_parent" />

    首先这个activity实现了SurfaceHolder.Callback接口,并重写了这个接口的三个方法。

    关于对surfaceHolder,surfaceView,SurfaceHolder.Callback的介绍,请看这里,很详细哦。

    http://www.cnblogs.com/bausch/archive/2011/10/20/2219068.html

    surfaceview总之能够获相机硬件捕捉到的数据并显示出来,在上面的代码中,先初始化了surfaceholder对象。并重写了surfaceCreated函数,在这个函数中,完成了对相机打开取景的基本操作。首先是Camera.open()获取一个Camera对象,在初始化一些camera参数,如图像格式,图像预览大小,刷新率等等。在设置预览显示,最后别忘了startPreview,则完成了取景。由于刚开始开发的工程需要将相机的取景设置为竖屏的,Barcode Scanner设置的是横屏的,开始再尝试调整图片显示方向时,我以为是再manifest中重新设置,

1 android:screenOrientation="landscape"

      将landscape该为portrait,结果却很意外,屏幕是竖着显示了,但是取景后的内容与显示却是横竖相反的,手机竖着取景,显示的却是横着的。不可以简单的通过调整这个参数值来改变方向。后面调用下面这个函数,重新设置了预览照片的显示方向。

1 camera.setDisplayOrientation(90);

     调整显示方向后,取景终于正常了。但是在后面预览拍照结果时,发现这都是假象,相机底层取景还是横屏的,只是在预览时进行了方向调整,这样还存在一个显示照片拉伸的问题。这个没有深入查看了。

     可以看这篇文章,Android Camera小结,写得比我的更全面,实用。

http://www.diybl.com/course/3_program/java/android/20111201/563696.html 

     

原文地址:https://www.cnblogs.com/liuan/p/2317377.html