У меня есть плагин Cordova, написанный для iOS, который передает информацию о камере, но с трудом конвертирует ее в Android.Благодаря чтению API-интерфейса camera2 и https://inducesmile.com/android/android-camera2-api-example-tutorial/, я сделал некоторый прогресс.
Я надеюсь на самом деле не создавать изображение для получения значений камеры, и этокажется, что это сделано, выдает captureRequest
на 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());
}
}
}
Затем в приложении cordova каждые 500 мс у меня есть setInterval, который запускает 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;
}
};
Я полагаю, что мне нужно изменить createCaptureRequest
, чтобы он стал некой формой createCaptureSession
, и использовать Surface
, но не уверен, не слишком ли это обдумано, когда я смотрю на некоторые примеры кода.
Мне не хватает некоторых функций API, которые бы отображали текущее состояние камеры?