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;
18 import java.io.IOException;
19 import java.util.ArrayList;
20 import java.util.List;
22 @SuppressWarnings(
"deprecation")
26 private Camera camera;
28 private boolean keepAlive =
true;
30 private int preferredWidth = 640;
31 private int preferredHeight = 480;
32 private static final String TRUE =
"true";
33 private static final String FALSE =
"false";
39 private int startInternal() {
40 if (camera != null && keepAlive !=
false) {
46 camera = Camera.open(cameraId);
48 Camera.Parameters params = camera.getParameters();
49 List<String> focusModes = params.getSupportedFocusModes();
51 if (Build.MODEL.equalsIgnoreCase(
"embt2") || Build.MODEL.equalsIgnoreCase(
"EMBT3C")) {
52 Log.i(TAG,
"This is moverio camera. Skip focus mode setting");
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");
68 List<Integer> formats = params.getSupportedPreviewFormats();
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));
76 cameraSize = getOptimalPreviewSize(cameraSizes, preferredWidth, preferredHeight);
78 params.setPreviewSize(cameraSize.width, cameraSize.height);
79 params.setPreviewFormat(ImageFormat.NV21);
81 PixelFormat p =
new PixelFormat();
82 PixelFormat.getPixelFormatInfo(params.getPreviewFormat(), p);
84 int bufSize = (cameraSize.width * cameraSize.height * p.bitsPerPixel) / 8 * 2;
85 byte[] buffer =
new byte[bufSize];
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);
97 camera.setParameters(params);
98 }
catch (Exception e) {
106 if (cameraSurfaceTexture == null) {
107 cameraSurfaceTexture =
new SurfaceTexture(textureID);
110 camera.setPreviewTexture(cameraSurfaceTexture);
111 camera.startPreview();
112 }
catch (IOException e) {
117 }
catch (Exception e) {
118 Log.i(
"JLog",
"Camera normal exception");
127 int start(
final int cameraId,
final int width,
final int height) {
128 if (!checkPermission()) {
129 return ResultCode.CameraPermissionIsNotGranted.getValue();
138 if (camera != null) {
139 return ResultCode.CameraAlreadyOpened.getValue();
143 return startInternal();
156 if (camera == null) {
160 camera.setPreviewCallback(null);
161 camera.setPreviewCallbackWithBuffer(null);
164 if (cameraSurfaceTexture != null) {
165 cameraSurfaceTexture.setOnFrameAvailableListener(null);
166 cameraSurfaceTexture.release();
167 cameraSurfaceTexture = null;
170 if(cameraSize != null) {
171 cameraSize.width = 0;
172 cameraSize.height = 0;
175 camera.stopPreview();
180 Log.i(TAG,
"Android camera stop");
187 return cameraSize.width;
192 return cameraSize.height;
196 public void onPreviewFrame(byte[] data, Camera camera) {
200 camera.addCallbackBuffer(data);
206 boolean setFocusMode(
int focusMode) {
207 boolean doPostSetAction =
false;
208 if (camera == null) {
213 Camera.Parameters params = camera.getParameters();
214 List<String> focusModes = params.getSupportedFocusModes();
216 camera.cancelAutoFocus();
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);
228 case FOCUS_MODE_AUTO:
229 params.setFocusMode(Camera.Parameters.FOCUS_MODE_AUTO);
230 doPostSetAction =
true;
237 camera.setParameters(params);
239 if (doPostSetAction) {
240 camera.autoFocus(
new Camera.AutoFocusCallback() {
243 public void onAutoFocus(
boolean success, Camera camera) {
250 }
catch (Exception e) {
256 public Object [] getParamList() {
257 String [] paramArray = null;
258 List<String> paramList =
new ArrayList<>();
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]);
266 }
catch (Exception e) {
267 Log.d(TAG,
"Exception : " + e.getMessage());
270 return paramList.toArray();
274 public boolean setParam(String key, String value) {
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");
287 boolean setFlashLightMode(
boolean toggle) {
292 Camera.Parameters params = camera.getParameters();
294 params.setFlashMode(Camera.Parameters.FLASH_MODE_TORCH);
296 params.setFlashMode(Camera.Parameters.FLASH_MODE_OFF);
300 camera.setParameters(params);
301 }
catch (Exception e) {
302 Log.e(
"CameraDevice",
"setFlashLightMode error");
310 boolean setAutoWhiteBalanceLock(
boolean toggle) {
315 Camera.Parameters params = camera.getParameters();
316 params.setAutoWhiteBalanceLock(toggle);
319 camera.setParameters(params);
320 }
catch (Exception e) {
321 Log.e(
"CameraDevice",
"setAutoWhiteBalanceLock error");
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;