Add access to camera properties POJO

Currently the only properties in interest (to me at least) are the vertical
and horizontal view angles to allow for better AR mode.
pull/1/head
Yuval Peress 8 years ago
parent ae77fb31dd
commit 3282a95c61
  1. 14
      camerakit/src/main/api16/com/flurgle/camerakit/Camera1.java
  2. 44
      camerakit/src/main/api21/com/flurgle/camerakit/Camera2.java
  3. 5
      camerakit/src/main/base/com/flurgle/camerakit/CameraImpl.java
  4. 14
      camerakit/src/main/base/com/flurgle/camerakit/CameraProperties.java
  5. 5
      camerakit/src/main/java/com/flurgle/camerakit/CameraView.java

@ -6,6 +6,7 @@ import android.hardware.Camera;
import android.media.CamcorderProfile; import android.media.CamcorderProfile;
import android.media.MediaRecorder; import android.media.MediaRecorder;
import android.os.Handler; import android.os.Handler;
import android.support.annotation.Nullable;
import android.view.MotionEvent; import android.view.MotionEvent;
import android.view.SurfaceHolder; import android.view.SurfaceHolder;
import android.view.View; import android.view.View;
@ -36,6 +37,7 @@ public class Camera1 extends CameraImpl {
private int mCameraId; private int mCameraId;
private Camera mCamera; private Camera mCamera;
private Camera.Parameters mCameraParameters; private Camera.Parameters mCameraParameters;
private CameraProperties mCameraProperties;
private Camera.CameraInfo mCameraInfo; private Camera.CameraInfo mCameraInfo;
private Size mPreviewSize; private Size mPreviewSize;
private Size mCaptureSize; private Size mCaptureSize;
@ -309,6 +311,12 @@ public class Camera1 extends CameraImpl {
return mCamera != null; return mCamera != null;
} }
@Nullable
@Override
CameraProperties getCameraProperties() {
return mCameraProperties;
}
// Internal: // Internal:
private void openCamera() { private void openCamera() {
@ -319,6 +327,7 @@ public class Camera1 extends CameraImpl {
mCamera = Camera.open(mCameraId); mCamera = Camera.open(mCameraId);
mCameraParameters = mCamera.getParameters(); mCameraParameters = mCamera.getParameters();
collectCameraProperties();
adjustCameraParameters(); adjustCameraParameters();
mCamera.setDisplayOrientation(calculatePreviewRotation()); mCamera.setDisplayOrientation(calculatePreviewRotation());
@ -391,6 +400,11 @@ public class Camera1 extends CameraImpl {
mCamera.setParameters(mCameraParameters); mCamera.setParameters(mCameraParameters);
} }
private void collectCameraProperties() {
mCameraProperties = new CameraProperties(mCameraParameters.getVerticalViewAngle(),
mCameraParameters.getHorizontalViewAngle());
}
private TreeSet<AspectRatio> findCommonAspectRatios(List<Camera.Size> previewSizes, List<Camera.Size> captureSizes) { private TreeSet<AspectRatio> findCommonAspectRatios(List<Camera.Size> previewSizes, List<Camera.Size> captureSizes) {
Set<AspectRatio> previewAspectRatios = new HashSet<>(); Set<AspectRatio> previewAspectRatios = new HashSet<>();
for (Camera.Size size : previewSizes) { for (Camera.Size size : previewSizes) {

@ -3,14 +3,18 @@ package com.flurgle.camerakit;
import android.annotation.TargetApi; import android.annotation.TargetApi;
import android.content.Context; import android.content.Context;
import android.graphics.ImageFormat; import android.graphics.ImageFormat;
import android.graphics.PointF;
import android.hardware.camera2.CameraAccessException; import android.hardware.camera2.CameraAccessException;
import android.hardware.camera2.CameraCharacteristics; import android.hardware.camera2.CameraCharacteristics;
import android.hardware.camera2.CameraDevice; import android.hardware.camera2.CameraDevice;
import android.hardware.camera2.CameraManager; import android.hardware.camera2.CameraManager;
import android.hardware.camera2.params.StreamConfigurationMap; import android.hardware.camera2.params.StreamConfigurationMap;
import android.support.annotation.Nullable;
import android.util.Log; import android.util.Log;
import android.util.SizeF;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator; import java.util.Iterator;
import java.util.List; import java.util.List;
import java.util.TreeSet; import java.util.TreeSet;
@ -28,6 +32,8 @@ class Camera2 extends CameraImpl {
private Size mCaptureSize; private Size mCaptureSize;
private Size mPreviewSize; private Size mPreviewSize;
private final HashMap<String, CameraProperties> mCameraPropertyMap = new HashMap<>();
Camera2(CameraListener callback, PreviewImpl preview, Context context) { Camera2(CameraListener callback, PreviewImpl preview, Context context) {
super(callback, preview); super(callback, preview);
preview.setCallback(new PreviewImpl.Callback() { preview.setCallback(new PreviewImpl.Callback() {
@ -38,6 +44,36 @@ class Camera2 extends CameraImpl {
}); });
mCameraManager = (CameraManager) context.getSystemService(Context.CAMERA_SERVICE); mCameraManager = (CameraManager) context.getSystemService(Context.CAMERA_SERVICE);
// Get all view angles
try {
for (final String cameraId : mCameraManager.getCameraIdList()) {
CameraCharacteristics characteristics =
mCameraManager.getCameraCharacteristics(cameraId);
@SuppressWarnings("ConstantConditions")
int orientation = characteristics.get(CameraCharacteristics.LENS_FACING);
if (orientation == CameraCharacteristics.LENS_FACING_BACK) {
float[] maxFocus = characteristics.get(
CameraCharacteristics.LENS_INFO_AVAILABLE_FOCAL_LENGTHS);
if (maxFocus == null) {
continue;
}
SizeF size = characteristics.get(
CameraCharacteristics.SENSOR_INFO_PHYSICAL_SIZE);
if (size == null) {
continue;
}
float w = size.getWidth();
float h = size.getHeight();
mCameraPropertyMap.put(cameraId, new CameraProperties(
(float) Math.toDegrees(2*Math.atan(size.getWidth()/(maxFocus[0]*2))),
(float) Math.toDegrees(2*Math.atan(size.getHeight()/(maxFocus[0]*2)))
));
}
}
} catch (CameraAccessException e) {
throw new RuntimeException("Failed to get camera view angles", e);
}
} }
// CameraImpl: // CameraImpl:
@ -196,6 +232,14 @@ class Camera2 extends CameraImpl {
return mCamera != null; return mCamera != null;
} }
@Nullable
@Override
CameraProperties getCameraProperties() {
if (mCamera == null) {
return null;
}
return mCameraPropertyMap.get(mCamera.getId());
}
// Internal // Internal
private List<Size> getAvailableCaptureResolutions() { private List<Size> getAvailableCaptureResolutions() {

@ -1,5 +1,7 @@
package com.flurgle.camerakit; package com.flurgle.camerakit;
import android.support.annotation.Nullable;
abstract class CameraImpl { abstract class CameraImpl {
protected final CameraListener mCameraListener; protected final CameraListener mCameraListener;
@ -30,4 +32,7 @@ abstract class CameraImpl {
abstract Size getPreviewResolution(); abstract Size getPreviewResolution();
abstract boolean isCameraOpened(); abstract boolean isCameraOpened();
@Nullable
abstract CameraProperties getCameraProperties();
} }

@ -0,0 +1,14 @@
package com.flurgle.camerakit;
/**
* Simple pojo containing various camera properties.
*/
public class CameraProperties {
public final float verticalViewingAngle;
public final float horizontalViewingAngle;
public CameraProperties(float verticalViewingAngle, float horizontalViewingAngle) {
this.verticalViewingAngle = verticalViewingAngle;
this.horizontalViewingAngle = horizontalViewingAngle;
}
}

@ -258,6 +258,11 @@ public class CameraView extends FrameLayout {
mCameraImpl.stop(); mCameraImpl.stop();
} }
@Nullable
public CameraProperties getCameraProperties() {
return mCameraImpl.getCameraProperties();
}
@Facing @Facing
public int getFacing() { public int getFacing() {
return mFacing; return mFacing;

Loading…
Cancel
Save