MaxstARSDK  3.5.0
All Classes Functions Variables
Camera1Controller.java
1 /*
2  * Copyright 2016 Maxst, Inc. All Rights Reserved.
3  */
4 
5 package com.maxst.ar;
6 
7 import android.content.Context;
8 import android.content.pm.PackageManager;
9 import android.graphics.ImageFormat;
10 import android.graphics.PixelFormat;
11 import android.graphics.SurfaceTexture;
12 import android.hardware.Camera;
13 import android.hardware.Camera.PreviewCallback;
14 import android.hardware.Camera.Size;
15 import android.os.Build;
16 import android.util.Log;
17 
18 import java.io.IOException;
19 import java.util.ArrayList;
20 import java.util.List;
21 
22 @SuppressWarnings("deprecation")
23 class Camera1Controller extends CameraController implements PreviewCallback /*, SurfaceHolder.Callback */ {
24  private static final String TAG = Camera1Controller.class.getSimpleName();
25 
26  private Camera camera;
27  private CameraSize cameraSize = new CameraSize(0, 0);
28  private boolean keepAlive = true;
29  private int cameraId;
30  private int preferredWidth = 640;
31  private int preferredHeight = 480;
32  private static final String TRUE = "true";
33  private static final String FALSE = "false";
34 
36 // cameraHandler = new Handler(Looper.getMainLooper());
37  }
38 
39  private int startInternal() {
40  if (camera != null && keepAlive != false) {
41  return ResultCode.UnknownError.getValue();
42  }
43 
44  try {
45 
46  camera = Camera.open(cameraId);
47 
48  Camera.Parameters params = camera.getParameters();
49  List<String> focusModes = params.getSupportedFocusModes();
50 
51  if (Build.MODEL.equalsIgnoreCase("embt2") || Build.MODEL.equalsIgnoreCase("EMBT3C")) {
52  Log.i(TAG, "This is moverio camera. Skip focus mode setting");
53  } else {
54  if (focusModes != null && focusModes.size() > 0) {
55  if (focusModes.contains(Camera.Parameters.FOCUS_MODE_CONTINUOUS_VIDEO)) {
56  params.setFocusMode(Camera.Parameters.FOCUS_MODE_CONTINUOUS_VIDEO);
57  Log.i(TAG, "FOCUS_MODE_CONTINUOUS_VIDEO");
58  } else if (focusModes.contains(Camera.Parameters.FOCUS_MODE_CONTINUOUS_PICTURE)) {
59  params.setFocusMode(Camera.Parameters.FOCUS_MODE_CONTINUOUS_PICTURE);
60  Log.i(TAG, "FOCUS_MODE_CONTINUOUS_VIDEO");
61  } else if (focusModes.contains(Camera.Parameters.FOCUS_MODE_AUTO)) {
62  params.setFocusMode(Camera.Parameters.FOCUS_MODE_AUTO);
63  Log.i(TAG, "FOCUS_MODE_AUTO");
64  }
65  }
66  }
67 
68  List<Integer> formats = params.getSupportedPreviewFormats();
69 
70  List<Size> cameraPreviewList = params.getSupportedPreviewSizes();
71  ArrayList<CameraSize> cameraSizes = new ArrayList<>();
72  for (Size size : cameraPreviewList) {
73  cameraSizes.add(new CameraSize(size.width, size.height));
74  }
75 
76  cameraSize = getOptimalPreviewSize(cameraSizes, preferredWidth, preferredHeight);
77 
78  params.setPreviewSize(cameraSize.width, cameraSize.height);
79  params.setPreviewFormat(ImageFormat.NV21);
80 
81  PixelFormat p = new PixelFormat();
82  PixelFormat.getPixelFormatInfo(params.getPreviewFormat(), p);
83 
84  int bufSize = (cameraSize.width * cameraSize.height * p.bitsPerPixel) / 8 * 2;
85  byte[] buffer = new byte[bufSize];
86 
87  camera.addCallbackBuffer(buffer);
88  buffer = new byte[bufSize];
89  camera.addCallbackBuffer(buffer);
90  buffer = new byte[bufSize];
91  camera.addCallbackBuffer(buffer);
92  buffer = new byte[bufSize];
93  camera.addCallbackBuffer(buffer);
94  camera.setPreviewCallbackWithBuffer(this);
95 
96  try {
97  camera.setParameters(params);
98  } catch (Exception e) {
99  Log.d(Camera1Controller.TAG, "setParameters fails");
100  }
101 
102  keepAlive = true;
103 
104  try {
105  int textureID = -1;
106  if (cameraSurfaceTexture == null) {
107  cameraSurfaceTexture = new SurfaceTexture(textureID);
108  }
109 
110  camera.setPreviewTexture(cameraSurfaceTexture);
111  camera.startPreview();
112  } catch (IOException e) {
113  e.printStackTrace();
114  return ResultCode.UnknownError.getValue();
115  }
116 
117  } catch (Exception e) {
118  Log.i("JLog", "Camera normal exception");
119  return ResultCode.UnknownError.getValue();
120  }
121 
122  return ResultCode.Success.getValue();
123 
124  }
125 
126  @Override
127  int start(final int cameraId, final int width, final int height) {
128  if (!checkPermission()) {
129  return ResultCode.CameraPermissionIsNotGranted.getValue();
130  } else {
131  // cameraHandler.post(new Runnable() {
132 // @Override
133 // public void run() {
134  Camera1Controller.this.cameraId = cameraId;
135  Camera1Controller.this.preferredWidth = width;
136  Camera1Controller.this.preferredHeight = height;
137 
138  if (camera != null) {
139  return ResultCode.CameraAlreadyOpened.getValue();
140  }
141 
142  keepAlive = true;
143  return startInternal();
144 // }
145 // });
146 // return ResultCode.Success.getValue();
147  }
148  }
149 
150  @Override
151  void stop() {
152 
153 // cameraHandler.post(new Runnable() {
154 // @Override
155 // public void run() {
156  if (camera == null) {
157  return;
158  }
159  camera.lock();
160  camera.setPreviewCallback(null);
161  camera.setPreviewCallbackWithBuffer(null);
162 
163 
164  if (cameraSurfaceTexture != null) {
165  cameraSurfaceTexture.setOnFrameAvailableListener(null);
166  cameraSurfaceTexture.release();
167  cameraSurfaceTexture = null;
168  }
169 
170  if(cameraSize != null) {
171  cameraSize.width = 0;
172  cameraSize.height = 0;
173  }
174 
175  camera.stopPreview();
176  camera.release();
177  camera = null;
178  keepAlive = false;
179 
180  Log.i(TAG, "Android camera stop");
181 // }
182 // });
183  }
184 
185  @Override
186  int getWidth() {
187  return cameraSize.width;
188  }
189 
190  @Override
191  int getHeight() {
192  return cameraSize.height;
193  }
194 
195  @Override
196  public void onPreviewFrame(byte[] data, Camera camera) {
197  if (keepAlive) {
198  if(data != null) {
199  CameraController.setNewCameraFrame(data, data.length, cameraSize.width, cameraSize.height, ColorFormat.YUV420sp.getValue());
200  camera.addCallbackBuffer(data);
201  }
202  }
203  }
204 
205  @Override
206  boolean setFocusMode(int focusMode) {
207  boolean doPostSetAction = false;
208  if (camera == null) {
209  return false;
210  }
211 
212  try {
213  Camera.Parameters params = camera.getParameters();
214  List<String> focusModes = params.getSupportedFocusModes();
215 
216  camera.cancelAutoFocus();
217 
218  CameraDevice.FocusMode focusModeEnum = CameraDevice.FocusMode.values()[focusMode - 1];
219  switch (focusModeEnum) {
220  case FOCUS_MODE_CONTINUOUS_AUTO:
221  if (focusModes.contains(Camera.Parameters.FOCUS_MODE_CONTINUOUS_VIDEO)) {
222  params.setFocusMode(Camera.Parameters.FOCUS_MODE_CONTINUOUS_VIDEO);
223  } else {
224  return false;
225  }
226  break;
227 
228  case FOCUS_MODE_AUTO:
229  params.setFocusMode(Camera.Parameters.FOCUS_MODE_AUTO);
230  doPostSetAction = true;
231  break;
232 
233  default:
234  // Do nothing
235  }
236 
237  camera.setParameters(params);
238 
239  if (doPostSetAction) {
240  camera.autoFocus(new Camera.AutoFocusCallback() {
241 
242  @Override
243  public void onAutoFocus(boolean success, Camera camera) {
244 
245  }
246  });
247  }
248 
249  return true;
250  } catch (Exception e) {
251  return false;
252  }
253  }
254 
255  @Override
256  public Object [] getParamList() {
257  String [] paramArray = null;
258  List<String> paramList = new ArrayList<>();
259 
260  try {
261  Camera.Parameters params = camera.getParameters();
262  paramArray = params.flatten().split("[=;]");
263  for (int i = 0; i < paramArray.length / 2; i++) {
264  paramList.add(paramArray[i * 2]);
265  }
266  } catch (Exception e) {
267  Log.d(TAG, "Exception : " + e.getMessage());
268  }
269 
270  return paramList.toArray();
271  }
272 
273  @Override
274  public boolean setParam(String key, String value) {
275  try {
276  Camera.Parameters params = camera.getParameters();
277  params.set(key, value);
278  camera.setParameters(params);
279  } catch (Exception e) {
280  Log.e("CameraDevice", "Set configuration error");
281  return false;
282  }
283  return true;
284  }
285 
286  @Override
287  boolean setFlashLightMode(boolean toggle) {
288  if(camera == null) {
289  return false;
290  }
291 
292  Camera.Parameters params = camera.getParameters();
293  if (toggle) {
294  params.setFlashMode(Camera.Parameters.FLASH_MODE_TORCH);
295  } else {
296  params.setFlashMode(Camera.Parameters.FLASH_MODE_OFF);
297  }
298 
299  try {
300  camera.setParameters(params);
301  } catch (Exception e) {
302  Log.e("CameraDevice", "setFlashLightMode error");
303  return false;
304  }
305 
306  return true;
307  }
308 
309  @Override
310  boolean setAutoWhiteBalanceLock(boolean toggle) {
311  if(camera == null) {
312  return false;
313  }
314 
315  Camera.Parameters params = camera.getParameters();
316  params.setAutoWhiteBalanceLock(toggle);
317 
318  try {
319  camera.setParameters(params);
320  } catch (Exception e) {
321  Log.e("CameraDevice", "setAutoWhiteBalanceLock error");
322  return false;
323  }
324 
325  return false;
326  }
327 
328  private boolean checkPermission() {
329  Context androidContext = MaxstARJNI.getContext();
330  PackageManager pm = androidContext.getPackageManager();
331  int permissionIsGranted = pm.checkPermission("android.permission.CAMERA", androidContext.getPackageName());
332  return permissionIsGranted == 0;
333  }
334 }