Поскольку я работаю над приложением Android с минимальным уровнем API 16. Мне нужно создать свой собственный Camera Builder для живых кадров и обработать их для распознавания текста. Я установил вид поверхности и добавил обратный вызов для предварительного просмотра, чтобы я мог работать вживую.кадры в onPreviewFrame (byte [] bytes, Camera camera) Method.
По умолчанию экран работает в альбомной ориентации, и на большинстве устройств я получаю правильную ориентацию. Но в некоторых устройствах я получаю изображение, повернутое на 180 градусов в этом методе , и не смог обработать.
Display display = ((WindowManager) Objects.requireNonNull(context.getSystemService(WINDOW_SERVICE))).getDefaultDisplay();
return display.getRotation();
Приведенный выше метод возвращает поворот на 90 градусов в обоих устройствах.Но, с одной стороны, изображение имеет правильную ориентацию, а с другой - изображение поворачивается на 180 градусов.Вот класс камеры:
public abstract class Camera {
private static android.hardware.Camera mCamera;
/**
* A safe way to get an instance of the Camera object.
*/
private static android.hardware.Camera getCameraInstance(int cameraFacing) {
android.hardware.Camera c = null;
try {
c = android.hardware.Camera.open(cameraFacing); // attempt to get a Camera instance
} catch (Exception e) {
// Camera is not available (in use or does not exist)
}
return c; // returns null if camera is unavailable
}
public static void closeCamera() {
if (mCamera != null) {
mCamera.release();
mCamera = null;
}
}
public static void autoFocus() {
if (mCamera != null)
try {
mCamera.autoFocus(null);
} catch (Exception ignored) {
}
}
/**
* focusMode: android.hardware.Camera.Parameters
* cameraFacing: android.hardware.Camera.CameraInfo.FACING_FRONT or FACING_BACK
*/
public static class CameraBuilder {
private static final String TAG = CameraBuilder.class.getSimpleName();
private String focusMode = android.hardware.Camera.Parameters.FOCUS_MODE_AUTO;
private int cameraFacing = android.hardware.Camera.CameraInfo.CAMERA_FACING_BACK;
private int displayOrientation = 0;
public CameraBuilder() {
}
/**
* @param focusMode default: android.hardware.Camera.Parameters.FOCUS_MODE_AUTO
* @return CameraBuilder
*/
public CameraBuilder setFocusMode(String focusMode) {
this.focusMode = focusMode;
return this;
}
/**
* @param cameraFacing default : android.hardware.Camera.CameraInfo.CAMERA_FACING_BACK
* @return CameraBuilder
*/
public CameraBuilder setCameraFacing(int cameraFacing) {
this.cameraFacing = cameraFacing;
return this;
}
public CameraBuilder setDisplayOrientation(int orientation) {
this.displayOrientation = orientation;
return this;
}
public android.hardware.Camera build() {
try {
mCamera = getCameraInstance(cameraFacing);
android.hardware.Camera.Parameters params = mCamera.getParameters();
params.setFocusMode(focusMode);
mCamera.setParameters(params);
} catch (Exception e) {
// Camera is not available (in use or does not exist)
Log.e(TAG, "Camera Exception: " + e.getMessage());
}
mCamera.setDisplayOrientation(displayOrientation);
return mCamera;
}
}
}
Вот инициализация моей камеры.
camera = new CameraBuilder()
.setCameraFacing(Camera.CameraInfo.CAMERA_FACING_BACK)
.setFocusMode(android.hardware.Camera.Parameters.FOCUS_MODE_AUTO)
.setDisplayOrientation(0)
.build();