SHOW:
|
|
- or go back to the newest paste.
1 | /* | |
2 | * Camera management | |
3 | */ | |
4 | ||
5 | /** | |
6 | * Selects the last used camera or a front-facing one | |
7 | */ | |
8 | public void selectCamera() | |
9 | { | |
10 | int cameraID = preferences.getInt("cameraID", -1); | |
11 | if (cameraID == -1) | |
12 | { | |
13 | // no camera was selected previously, select a front-facing one | |
14 | int nCameras = Camera.getNumberOfCameras(); | |
15 | ||
16 | CameraInfo cameraInfo = new CameraInfo(); | |
17 | for (int i = 0; i < nCameras; i++) | |
18 | { | |
19 | Camera.getCameraInfo(i, cameraInfo); | |
20 | if (cameraInfo.facing == CameraInfo.CAMERA_FACING_FRONT) | |
21 | { | |
22 | cameraID = i; | |
23 | } | |
24 | } | |
25 | ||
26 | // there's no front camera | |
27 | if (cameraID == -1) | |
28 | { | |
29 | cameraID = 0; | |
30 | } | |
31 | } | |
32 | ||
33 | setPreviewSurface(previewSurface); | |
34 | setupCamera(cameraID); | |
35 | } | |
36 | ||
37 | /** | |
38 | * Sets the camera used for face detection | |
39 | * | |
40 | * @param cameraID the ID of the camera to use | |
41 | */ | |
42 | public void setupCamera(int cameraID) | |
43 | { | |
44 | // release previous one | |
45 | if (camera != null) | |
46 | { | |
47 | camera.release(); | |
48 | camera = null; | |
49 | } | |
50 | ||
51 | // save selection | |
52 | Editor editor = preferences.edit(); | |
53 | editor.putInt("cameraID", cameraID); | |
54 | editor.commit(); | |
55 | ||
56 | try | |
57 | { | |
58 | // open camera | |
59 | camera = Camera.open(cameraID); | |
60 | ||
61 | // get smallest available preview size | |
62 | Parameters params = camera.getParameters(); | |
63 | List<Size> psizes = params.getSupportedPreviewSizes(); | |
64 | Collections.sort(psizes, new Comparator<Size>() | |
65 | { | |
66 | @Override | |
67 | public int compare(Size size1, Size size2) | |
68 | { | |
69 | long pixels1 = size1.height * size1.width; | |
70 | long pixels2 = size2.height * size2.width; | |
71 | ||
72 | return (pixels1 < pixels2) ? -1 : (pixels1 > pixels2) ? 1 : 0; | |
73 | } | |
74 | }); | |
75 | Size smallest = psizes.get(0); | |
76 | params.setPreviewSize(smallest.width, smallest.height); | |
77 | ||
78 | // set preferred preview format | |
79 | params.setPreviewFormat(ImageFormat.NV21); | |
80 | ||
81 | // save parameters | |
82 | camera.setParameters(params); | |
83 | ||
84 | // set preview display | |
85 | camera.setPreviewDisplay(previewSurface.getHolder()); | |
86 | ||
87 | // set orientation | |
88 | CameraInfo info = new CameraInfo(); | |
89 | Camera.getCameraInfo(cameraID, info); | |
90 | WindowManager wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE); | |
91 | int _rotation = wm.getDefaultDisplay().getRotation(); | |
92 | int degrees = 0; | |
93 | switch (_rotation) | |
94 | { | |
95 | case Surface.ROTATION_0: | |
96 | degrees = 0; | |
97 | break; | |
98 | case Surface.ROTATION_90: | |
99 | degrees = 90; | |
100 | break; | |
101 | case Surface.ROTATION_180: | |
102 | degrees = 180; | |
103 | break; | |
104 | case Surface.ROTATION_270: | |
105 | degrees = 270; | |
106 | break; | |
107 | } | |
108 | ||
109 | int result = (360 + info.orientation - degrees) % 360; | |
110 | rotation = degrees; | |
111 | ||
112 | camera.setDisplayOrientation(result); | |
113 | swapMetrics = (result % 180 == 0); | |
114 | ||
115 | // set camera in imageprocessor | |
116 | if (processor != null) | |
117 | processor.setCamera(camera, result); | |
118 | ||
119 | calculator.loadSettings(); | |
120 | ||
121 | // start preview | |
122 | camera.startPreview(); | |
123 | } | |
124 | catch (Exception e) | |
125 | { | |
126 | // TODO Auto-generated catch block | |
127 | e.printStackTrace(); | |
128 | } | |
129 | } |