個人網站:臭蛋 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
