首页 > 解决方案 > 使用 camera2 API 捕获 Android ISO、曝光、光圈

问题描述

我有一个为 iOS 编写的 cordova 插件,可以传输相机信息,但很难将其转换为 Android。感谢阅读 camera2 API 和https://inducesmile.com/android/android-camera2-api-example-tutorial/,我取得了一些进展。

我希望不要实际创建图像来获取相机值,而且似乎这是在 acaptureRequest上完成的问题Surface

我声明了一些类变量

CameraManager manager;
CameraDevice cameraDevice;
CaptureRequest.Builder builder;
String cameraId;
protected final String TAG = "STREAMLINX_CAMERA";
CallbackContext callbackContext;

加载视图时,我发出start()

    public void start() {
        this.manager = (CameraManager) cordova.getActivity().getSystemService(Context.CAMERA_SERVICE);
        this.cameraId = this.getCameraId(CameraCharacteristics.LENS_FACING_FRONT);

        if (!cordova.hasPermission(Manifest.permission.CAMERA)) {
            cordova.requestPermission(this, 0, Manifest.permission.CAMERA);
        } else {
            this.callbackContext.sendPluginResult(new PluginResult(PluginResult.Status.OK, "success"));
            try {
                this.manager.openCamera(cameraId, stateCallback, null);
            } catch (CameraAccessException e) {
                Log.e(TAG, e.toString());
            } catch (SecurityException e) {
                Log.e(TAG, e.toString());
            }
        }
    }

然后在科尔多瓦应用程序中,我有一个 setInterval 每 500 毫秒运行一次capture()

public void capture() {
    Log.d(TAG, "capture");
    builder.build();
    Log.d(TAG, "APERTURE: " + builder.get(CaptureRequest.LENS_APERTURE));
    Log.d(TAG, "ISO: " + builder.get(CaptureRequest.SENSOR_SENSITIVITY));
    Log.d(TAG, "EXPOSURE: " + builder.get(CaptureRequest.SENSOR_EXPOSURE_TIME));
}

..还有我的一些帮助

private String getCameraId(int orientation) {
    try {
        for (String cameraId: this.manager.getCameraIdList()) {
            CameraCharacteristics characteristics = this.manager.getCameraCharacteristics(cameraId);
            Log.d(TAG, "RANGE: " + characteristics.get(SENSOR_INFO_SENSITIVITY_RANGE);
            if (characteristics.get(CameraCharacteristics.LENS_FACING) == orientation) {
                return cameraId;
            }
        }
    } catch (CameraAccessException e) {
        Log.e(TAG, e.toString());
    }

    return null;
}

private final CameraDevice.StateCallback stateCallback = new CameraDevice.StateCallback() {
    @Override
    public void onOpened(CameraDevice camera) {
        cameraDevice = camera;
        try {
            builder = cameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_MANUAL);
        } catch (CameraAccessException e) {
            Log.e(TAG, e.toString());
        }
    }
    @Override
    public void onDisconnected(CameraDevice camera) {
        cameraDevice.close();
    }
    @Override
    public void onError(CameraDevice camera, int error) {
        cameraDevice.close();
        cameraDevice = null;
    }
};

我相信我需要将 my 更改createCaptureRequest为某种形式的 acreateCaptureSession和 use Surface,但是当我查看一些代码示例时,不确定这是否是过度思考。

我是否缺少一些可以获取相机当前状态的 API 功能?

标签: androidcordova

解决方案


推荐阅读