4
4
import java .util .ArrayList ;
5
5
import java .util .List ;
6
6
7
- import javax .print .attribute .Size2DSyntax ;
8
-
9
7
import android .content .Context ;
10
8
import android .hardware .Camera ;
11
9
import android .hardware .Camera .Size ;
20
18
21
19
@ SuppressWarnings ("deprecation" )
22
20
public class Capture extends PImage implements PConstants {
23
-
21
+
24
22
private static final boolean DEBUG = true ;
25
- public static void log (String log ) {if (DEBUG ) System .out .println (log );}
26
-
23
+
24
+ public static void log (String log ) {
25
+ if (DEBUG )
26
+ System .out .println (log );
27
+ }
28
+
27
29
private PApplet context ;
28
-
30
+
29
31
private Camera mCamera ;
30
32
private Camera .Parameters parameters ;
31
33
private Size previewSize ;
32
-
34
+
35
+ private int previewWidth , previewHeight ;
36
+
33
37
private static ArrayList <String > camerasList = new ArrayList <String >();
34
-
38
+
35
39
private static final String KEY_FRONT_CAMERA = "front-camera-%d" ;
36
40
private static final String KEY_BACK_CAMERA = "back-camera-%d" ;
37
-
41
+
38
42
private int selectedCamera = 0 ;
39
-
40
- public Capture (PApplet context ) {
43
+
44
+ public Capture (PApplet context ) {
45
+ this (context , -1 , -1 );
46
+ }
47
+
48
+ public Capture (PApplet context , int width , int height ) {
41
49
this .context = context ;
50
+ this .width = width ;
51
+ this .height = height ;
42
52
}
43
-
53
+
44
54
public void setCamera (String camera ) {
45
55
if (camera == null || camera .equals ("" )) {
46
56
selectedCamera = 0 ;
47
57
} else {
48
58
selectedCamera = camerasList .indexOf (camera );
49
59
}
50
60
log ("Selected camera = " + selectedCamera );
51
- createPreviewWindow ();
61
+ try {
62
+ mCamera = Camera .open (selectedCamera );
63
+ createPreviewWindow ();
64
+ } catch (Exception e ) {
65
+ log ("Couldn't open the Camera" );
66
+ e .printStackTrace ();
67
+ }
52
68
}
53
-
69
+
54
70
private void createPreviewWindow () {
55
71
final WindowManager .LayoutParams params = new WindowManager .LayoutParams (
56
- WindowManager .LayoutParams .TYPE_SYSTEM_OVERLAY ,
57
- WindowManager .LayoutParams .FLAG_NOT_TOUCHABLE |
58
- WindowManager .LayoutParams .FLAG_NOT_FOCUSABLE |
59
- WindowManager .LayoutParams .FLAG_NOT_TOUCH_MODAL |
60
- WindowManager .LayoutParams .FLAG_WATCH_OUTSIDE_TOUCH );
72
+ WindowManager .LayoutParams .TYPE_SYSTEM_OVERLAY ,
73
+ WindowManager .LayoutParams .FLAG_NOT_TOUCHABLE
74
+ | WindowManager .LayoutParams .FLAG_NOT_FOCUSABLE
75
+ | WindowManager .LayoutParams .FLAG_NOT_TOUCH_MODAL
76
+ | WindowManager .LayoutParams .FLAG_WATCH_OUTSIDE_TOUCH );
61
77
62
- params .gravity = Gravity .TOP | Gravity .LEFT ;
63
- params .height = 1 ;
64
- params .width = 1 ;
78
+ params .gravity = Gravity .TOP | Gravity .LEFT ;
79
+ params .height = 1 ;
80
+ params .width = 1 ;
65
81
66
- try {
67
- mCamera = Camera .open (selectedCamera );
68
- parameters = mCamera .getParameters ();
69
- setMinimumPreviewSize ();
70
- mCamera .setParameters (parameters );
71
- previewSize = parameters .getPreviewSize ();
72
- init (previewSize .height , previewSize .width , ARGB );
73
-
74
- log ("Width = " + previewSize .width );
75
- log ("height = " + previewSize .height );
76
- final WindowManager windowManager = (WindowManager ) context .getSystemService (Context .WINDOW_SERVICE );
77
- context .runOnUiThread (new Runnable () {
78
- @ Override
79
- public void run () {
80
- CameraPreview mPreview = new CameraPreview (context , mCamera );
81
- windowManager .addView (mPreview , params );
82
- mCamera .setPreviewCallback (previewCallback );
83
- }
84
- });
85
- } catch (Exception e ) {
86
- System .err .println ("Camera not avaialble to use." );
87
- e .printStackTrace ();
88
- }
82
+ parameters = mCamera .getParameters ();
83
+ setPreviewSize ();
84
+ mCamera .setParameters (parameters );
85
+ previewSize = parameters .getPreviewSize ();
86
+ init (previewSize .height , previewSize .width , ARGB );
87
+
88
+ log ("Width = " + previewSize .width );
89
+ log ("height = " + previewSize .height );
90
+ final WindowManager windowManager = (WindowManager ) context
91
+ .getSystemService (Context .WINDOW_SERVICE );
92
+ context .runOnUiThread (new Runnable () {
93
+ @ Override
94
+ public void run () {
95
+ CameraPreview mPreview = new CameraPreview (context , mCamera );
96
+ windowManager .addView (mPreview , params );
97
+ mCamera .setPreviewCallback (previewCallback );
98
+ }
99
+ });
89
100
}
90
101
91
102
public String [] list () {
@@ -97,7 +108,7 @@ public String[] list() {
97
108
if (cameraInfo .facing == Camera .CameraInfo .CAMERA_FACING_FRONT ) {
98
109
camerasList .add (String .format (KEY_FRONT_CAMERA , i ));
99
110
} else {
100
- //Back Camera
111
+ // Back Camera
101
112
camerasList .add (String .format (KEY_BACK_CAMERA , i ));
102
113
}
103
114
}
@@ -107,96 +118,102 @@ public String[] list() {
107
118
}
108
119
return null ;
109
120
}
110
-
121
+
111
122
private Camera .PreviewCallback previewCallback = new Camera .PreviewCallback () {
112
-
123
+
113
124
@ Override
114
125
public void onPreviewFrame (byte [] frame , Camera camera ) {
115
- pixels = Utils .convertYUV420_NV21toRGB8888 (frame , previewSize .width , previewSize .height );
116
- pixels = Utils .rotateRGBDegree90 (pixels , previewSize .width , previewSize .height );
126
+ pixels = Utils .convertYUV420_NV21toRGB8888 (frame ,
127
+ previewSize .width , previewSize .height );
128
+ pixels = Utils .rotateRGBDegree90 (pixels , previewSize .width ,
129
+ previewSize .height );
117
130
updatePixels ();
118
131
}
119
132
};
120
-
121
- private class CameraPreview extends SurfaceView implements SurfaceHolder .Callback {
122
-
133
+
134
+ private class CameraPreview extends SurfaceView implements
135
+ SurfaceHolder .Callback {
136
+
123
137
private Camera mCamera ;
124
138
private SurfaceHolder mHolder ;
125
-
139
+
126
140
public CameraPreview (Context context , Camera camera ) {
127
141
super (context );
128
142
this .mCamera = camera ;
129
-
143
+
130
144
mHolder = getHolder ();
131
145
mHolder .addCallback (this );
132
146
mHolder .setType (SurfaceHolder .SURFACE_TYPE_PUSH_BUFFERS );
133
147
}
134
-
148
+
135
149
@ Override
136
- public void surfaceCreated (SurfaceHolder holder ) {
150
+ public void surfaceCreated (SurfaceHolder holder ) {
137
151
try {
138
- mCamera .setPreviewDisplay (holder );
139
- mCamera .startPreview ();
140
- } catch (IOException e ) {
141
- Log .d ("PROCESSING" , "Error setting camera preview: " + e .getMessage ());
142
- e .printStackTrace ();
143
- }
144
- }
145
-
146
- @ Override
147
- public void surfaceChanged (SurfaceHolder holder , int format , int width , int height ) {
148
- // If your preview can change or rotate, take care of those events here.
149
- // Make sure to stop the preview before resizing or reformatting it.
150
-
151
- if (mHolder .getSurface () == null ){
152
- // preview surface does not exist
153
- return ;
154
- }
155
-
156
- // stop preview before making changes
157
- try {
158
- mCamera .stopPreview ();
159
- } catch (Exception e ){
160
- // ignore: tried to stop a non-existent preview
161
- }
162
-
163
- // set preview size and make any resize, rotate or
164
- // reformatting changes here
165
-
166
- // start preview with new settings
167
- try {
168
- mCamera .setPreviewDisplay (mHolder );
169
- mCamera .startPreview ();
170
-
171
- } catch (Exception e ){
172
- Log .d ("PROCESSING" , "Error starting camera preview: " + e .getMessage ());
173
- e .printStackTrace ();
174
- }
175
- }
176
-
177
- @ Override
178
- public void surfaceDestroyed (SurfaceHolder holder ) {
179
- // do nothing
180
- }
181
- }
182
-
183
- private void setMinimumPreviewSize () {
184
- List <Camera .Size > sizes = mCamera .getParameters ().getSupportedPreviewSizes ();
185
- /*
186
- Camera.Size minSize = null;
187
- for (Camera.Size size : sizes) {
188
- log("Size = " + size.width + " height = " + size.height);
189
- if (minSize == null) {
190
- minSize = size;
191
- continue;
152
+ mCamera .setPreviewDisplay (holder );
153
+ mCamera .startPreview ();
154
+ } catch (IOException e ) {
155
+ Log .d ("PROCESSING" ,
156
+ "Error setting camera preview: " + e .getMessage ());
157
+ e .printStackTrace ();
192
158
}
193
- if (minSize.width > size.width) {
194
- minSize = size;
159
+ }
160
+
161
+ @ Override
162
+ public void surfaceChanged (SurfaceHolder holder , int format , int width ,
163
+ int height ) {
164
+ // If your preview can change or rotate, take care of those events
165
+ // here.
166
+ // Make sure to stop the preview before resizing or reformatting it.
167
+
168
+ if (mHolder .getSurface () == null ) {
169
+ // preview surface does not exist
170
+ return ;
171
+ }
172
+
173
+ // stop preview before making changes
174
+ try {
175
+ mCamera .stopPreview ();
176
+ } catch (Exception e ) {
177
+ // ignore: tried to stop a non-existent preview
195
178
}
196
- }*/
197
- Camera .Size minSize = sizes .get (sizes .size () - 8 );
198
- log ("minimum width = " + minSize .width + " height = " + minSize .height );
199
- // parameters.setPictureSize(minSize.height, minSize.width);
200
- parameters .setPreviewSize (minSize .width , minSize .height );
179
+
180
+ // set preview size and make any resize, rotate or
181
+ // reformatting changes here
182
+
183
+ // start preview with new settings
184
+ try {
185
+ mCamera .setPreviewDisplay (mHolder );
186
+ mCamera .startPreview ();
187
+
188
+ } catch (Exception e ) {
189
+ Log .d ("PROCESSING" ,
190
+ "Error starting camera preview: " + e .getMessage ());
191
+ e .printStackTrace ();
192
+ }
193
+ }
194
+
195
+ @ Override
196
+ public void surfaceDestroyed (SurfaceHolder holder ) {
197
+ // do nothing
198
+ }
199
+ }
200
+
201
+ private void setPreviewSize () {
202
+ if (!(width == -1 || height == -1 )) {
203
+ parameters .setPreviewSize (previewWidth , previewHeight );
204
+ }
205
+ }
206
+
207
+ public Camera getCamera () {
208
+ return mCamera ;
209
+ }
210
+
211
+ public static void printCompatibleResolutionsList (Capture capture ) {
212
+ Camera camera = capture .getCamera ();
213
+ List <Camera .Size > sizes = camera .getParameters ()
214
+ .getSupportedPreviewSizes ();
215
+ for (Size size : sizes ) {
216
+ System .out .println (size .width + "x" + size .height );
217
+ }
201
218
}
202
219
}
0 commit comments