android - 使用 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 功能?
解决方案
推荐阅读
- apache-spark - 在 Google Colab 上安装 Spark 时出错
- python - 修补函数的 assert_call_with
- pic - SMBus 地址和波特率
- r - 如何合并这些数据框
- android - Android KeyChain:对变化做出反应
- wordpress - wordpress 安装在 iis 窗口服务器上的 cakephp 子文件夹中
- sql - SQL Server:如何每小时运行一次查询,并将结果存储在表中?更新时替换它们
- python - 如何在python中克隆或复制元素为列表的列表?
- tensorflow - 音频发生器 keras
- android - 为现有的 android 应用程序添加主题支持