Java tutorial
/* * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved. * * Use of this source code is governed by a BSD-style license * that can be found in the LICENSE file in the root of the source * tree. An additional intellectual property rights grant can be found * in the file PATENTS. All contributing project authors may * be found in the AUTHORS file in the root of the source tree. */ package org.webrtc.videoengine; import java.util.List; import android.hardware.Camera.CameraInfo; import android.hardware.Camera.Parameters; import android.hardware.Camera.Size; import android.hardware.Camera; import android.util.Log; import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; public class VideoCaptureDeviceInfoAndroid { private final static String TAG = "WEBRTC-JC"; private static boolean isFrontFacing(CameraInfo info) { return info.facing == CameraInfo.CAMERA_FACING_FRONT; } private static String deviceUniqueName(int index, CameraInfo info) { return "Camera " + index + ", Facing " + (isFrontFacing(info) ? "front" : "back") + ", Orientation " + info.orientation; } // Returns information about all cameras on the device as a serialized JSON // array of dictionaries encoding information about a single device. Since // this reflects static information about the hardware present, there is no // need to call this function more than once in a single process. It is // marked "private" as it is only called by native code. private static String getDeviceInfo() { try { JSONArray devices = new JSONArray(); for (int i = 0; i < Camera.getNumberOfCameras(); ++i) { CameraInfo info = new CameraInfo(); Camera.getCameraInfo(i, info); String uniqueName = deviceUniqueName(i, info); JSONObject cameraDict = new JSONObject(); devices.put(cameraDict); List<Size> supportedSizes; List<int[]> supportedFpsRanges; Camera camera = null; try { camera = Camera.open(i); Parameters parameters = camera.getParameters(); supportedSizes = parameters.getSupportedPreviewSizes(); supportedFpsRanges = parameters.getSupportedPreviewFpsRange(); Log.d(TAG, uniqueName); } catch (RuntimeException e) { Log.e(TAG, "Failed to open " + uniqueName + ", skipping", e); continue; } finally { if (camera != null) { camera.release(); } } JSONArray sizes = new JSONArray(); for (Size supportedSize : supportedSizes) { JSONObject size = new JSONObject(); size.put("width", supportedSize.width); size.put("height", supportedSize.height); sizes.put(size); } JSONArray mfpsRanges = new JSONArray(); for (int[] range : supportedFpsRanges) { JSONObject mfpsRange = new JSONObject(); // Android SDK deals in integral "milliframes per second" // (i.e. fps*1000, instead of floating-point frames-per-second) so we // preserve that through the Java->C++->Java round-trip. mfpsRange.put("min_mfps", range[Parameters.PREVIEW_FPS_MIN_INDEX]); mfpsRange.put("max_mfps", range[Parameters.PREVIEW_FPS_MAX_INDEX]); mfpsRanges.put(mfpsRange); } cameraDict.put("name", uniqueName); cameraDict.put("front_facing", isFrontFacing(info)).put("orientation", info.orientation) .put("sizes", sizes).put("mfpsRanges", mfpsRanges); } String ret = devices.toString(2); Log.d(TAG, ret); return ret; } catch (JSONException e) { throw new RuntimeException(e); } } }