1 | package org.greenstone.android.tipple.base;
|
---|
2 |
|
---|
3 | import android.content.Context;
|
---|
4 | import android.hardware.Camera;
|
---|
5 | import android.view.SurfaceHolder;
|
---|
6 | import android.view.SurfaceView;
|
---|
7 |
|
---|
8 | public class CameraPreview extends SurfaceView implements SurfaceHolder.Callback {
|
---|
9 |
|
---|
10 | Camera camera;
|
---|
11 |
|
---|
12 | public CameraPreview(Context context) {
|
---|
13 | super(context);
|
---|
14 | getHolder().addCallback(this);
|
---|
15 | getHolder().setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
|
---|
16 | }
|
---|
17 |
|
---|
18 | @Override
|
---|
19 | public void surfaceCreated(SurfaceHolder holder) {
|
---|
20 | System.err.println("*** CameraPreview::surfaceCreated()");
|
---|
21 | camera = Camera.open();
|
---|
22 | try {
|
---|
23 | camera.setPreviewDisplay(holder);
|
---|
24 | } catch (Exception e) {
|
---|
25 | e.printStackTrace();
|
---|
26 | }
|
---|
27 | }
|
---|
28 |
|
---|
29 | @Override
|
---|
30 | public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
|
---|
31 | System.err.println("*** CameraPreview::surfaceChanged()");
|
---|
32 |
|
---|
33 | Camera.Parameters parameters = camera.getParameters();
|
---|
34 | Camera.Size size = getBestPreviewSize(width, height, parameters);
|
---|
35 |
|
---|
36 | if (size != null) {
|
---|
37 | parameters.setPreviewSize(size.width, size.height);
|
---|
38 | camera.setParameters(parameters);
|
---|
39 | camera.startPreview();
|
---|
40 | } else {
|
---|
41 | System.err.println("Could not find a good camera preview size");
|
---|
42 | }
|
---|
43 | }
|
---|
44 |
|
---|
45 | @Override
|
---|
46 | public void surfaceDestroyed(SurfaceHolder holder) {
|
---|
47 | System.err.println("*** CameraPreview::surfaceDestroyed()");
|
---|
48 | camera.stopPreview();
|
---|
49 | camera.release();
|
---|
50 | camera = null;
|
---|
51 | }
|
---|
52 |
|
---|
53 | private Camera.Size getBestPreviewSize(int width, int height, Camera.Parameters parameters) {
|
---|
54 | Camera.Size result = null;
|
---|
55 |
|
---|
56 | for (Camera.Size size : parameters.getSupportedPreviewSizes()) {
|
---|
57 | if (size.width <= width && size.height <= height) {
|
---|
58 | if (result == null) {
|
---|
59 | result = size;
|
---|
60 | } else {
|
---|
61 | int resultArea = result.width * result.height;
|
---|
62 | int newArea = size.width * size.height;
|
---|
63 | if (newArea > resultArea) {
|
---|
64 | result = size;
|
---|
65 | }
|
---|
66 | }
|
---|
67 | }
|
---|
68 | }
|
---|
69 |
|
---|
70 | return (result);
|
---|
71 | }
|
---|
72 | } |
---|