44import java .util .ArrayList ;
55import java .util .List ;
66
7- import javax .print .attribute .Size2DSyntax ;
8-
97import android .content .Context ;
108import android .hardware .Camera ;
119import android .hardware .Camera .Size ;
2018
2119@ SuppressWarnings ("deprecation" )
2220public class Capture extends PImage implements PConstants {
23-
21+
2422 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+
2729 private PApplet context ;
28-
30+
2931 private Camera mCamera ;
3032 private Camera .Parameters parameters ;
3133 private Size previewSize ;
32-
34+
35+ private int previewWidth , previewHeight ;
36+
3337 private static ArrayList <String > camerasList = new ArrayList <String >();
34-
38+
3539 private static final String KEY_FRONT_CAMERA = "front-camera-%d" ;
3640 private static final String KEY_BACK_CAMERA = "back-camera-%d" ;
37-
41+
3842 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 ) {
4149 this .context = context ;
50+ this .width = width ;
51+ this .height = height ;
4252 }
43-
53+
4454 public void setCamera (String camera ) {
4555 if (camera == null || camera .equals ("" )) {
4656 selectedCamera = 0 ;
4757 } else {
4858 selectedCamera = camerasList .indexOf (camera );
4959 }
5060 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+ }
5268 }
53-
69+
5470 private void createPreviewWindow () {
5571 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 );
6177
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 ;
6581
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+ });
89100 }
90101
91102 public String [] list () {
@@ -97,7 +108,7 @@ public String[] list() {
97108 if (cameraInfo .facing == Camera .CameraInfo .CAMERA_FACING_FRONT ) {
98109 camerasList .add (String .format (KEY_FRONT_CAMERA , i ));
99110 } else {
100- //Back Camera
111+ // Back Camera
101112 camerasList .add (String .format (KEY_BACK_CAMERA , i ));
102113 }
103114 }
@@ -107,96 +118,102 @@ public String[] list() {
107118 }
108119 return null ;
109120 }
110-
121+
111122 private Camera .PreviewCallback previewCallback = new Camera .PreviewCallback () {
112-
123+
113124 @ Override
114125 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 );
117130 updatePixels ();
118131 }
119132 };
120-
121- private class CameraPreview extends SurfaceView implements SurfaceHolder .Callback {
122-
133+
134+ private class CameraPreview extends SurfaceView implements
135+ SurfaceHolder .Callback {
136+
123137 private Camera mCamera ;
124138 private SurfaceHolder mHolder ;
125-
139+
126140 public CameraPreview (Context context , Camera camera ) {
127141 super (context );
128142 this .mCamera = camera ;
129-
143+
130144 mHolder = getHolder ();
131145 mHolder .addCallback (this );
132146 mHolder .setType (SurfaceHolder .SURFACE_TYPE_PUSH_BUFFERS );
133147 }
134-
148+
135149 @ Override
136- public void surfaceCreated (SurfaceHolder holder ) {
150+ public void surfaceCreated (SurfaceHolder holder ) {
137151 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 ();
192158 }
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
195178 }
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+ }
201218 }
202219}
0 commit comments