From c01461c8a32cec56ba93b1d20cca8351091ce90b Mon Sep 17 00:00:00 2001 From: chenjiayin Date: Wed, 30 Jun 2021 20:51:33 +0800 Subject: [PATCH 1/2] fix bug for camera Signed-off-by: chenjiayin --- .../ohos/samples/camera/TakePhotoAbility.java | 45 ++++++++++++++++--- .../samples/camera/VideoRecordAbility.java | 42 +++++++++++++++-- 2 files changed, 76 insertions(+), 11 deletions(-) diff --git a/media/Camera/entry/src/main/java/ohos/samples/camera/TakePhotoAbility.java b/media/Camera/entry/src/main/java/ohos/samples/camera/TakePhotoAbility.java index e5fab3f653..333b4245e6 100644 --- a/media/Camera/entry/src/main/java/ohos/samples/camera/TakePhotoAbility.java +++ b/media/Camera/entry/src/main/java/ohos/samples/camera/TakePhotoAbility.java @@ -29,7 +29,6 @@ import ohos.agp.graphics.Surface; import ohos.agp.graphics.SurfaceOps; import ohos.agp.window.dialog.ToastDialog; import ohos.app.Context; -import ohos.app.Environment; import ohos.eventhandler.EventHandler; import ohos.eventhandler.EventRunner; import ohos.hiviewdfx.HiLog; @@ -37,6 +36,7 @@ import ohos.hiviewdfx.HiLogLabel; import ohos.media.camera.CameraKit; import ohos.media.camera.device.Camera; import ohos.media.camera.device.CameraConfig; +import ohos.media.camera.device.CameraInfo; import ohos.media.camera.device.CameraStateCallback; import ohos.media.camera.device.FrameConfig; import ohos.media.image.ImageReceiver; @@ -66,7 +66,7 @@ public class TakePhotoAbility extends Ability { private ImageReceiver imageReceiver; - private boolean isCameraFront; + private boolean isFrontCamera; private Surface previewSurface; @@ -115,9 +115,29 @@ public class TakePhotoAbility extends Ability { imageReceiver.setImageArrivalListener(this::saveImage); CameraKit cameraKit = CameraKit.getInstance(getApplicationContext()); String[] cameraList = cameraKit.getCameraIds(); - String cameraId = cameraList.length > 1 && isCameraFront ? cameraList[1] : cameraList[0]; - CameraStateCallbackImpl cameraStateCallback = new CameraStateCallbackImpl(); - cameraKit.createCamera(cameraId, cameraStateCallback, eventHandler); + String cameraId = cameraList[0]; + for (String logicalCameraId : cameraList) { + int faceType = cameraKit.getCameraInfo(logicalCameraId).getFacingType(); + switch (faceType){ + case CameraInfo.FacingType.CAMERA_FACING_FRONT: + if (isFrontCamera) { + cameraId = logicalCameraId; + } + break; + case CameraInfo.FacingType.CAMERA_FACING_BACK: + if (!isFrontCamera) { + cameraId = logicalCameraId; + } + break; + case CameraInfo.FacingType.CAMERA_FACING_OTHERS: + default: + break; + } + } + if (cameraId != null) { + CameraStateCallbackImpl cameraStateCallback = new CameraStateCallbackImpl(); + cameraKit.createCamera(cameraId, cameraStateCallback, eventHandler); + } } private void saveImage(ImageReceiver receiver) { @@ -157,7 +177,10 @@ public class TakePhotoAbility extends Ability { } private void switchCamera(Component component) { - isCameraFront = !isCameraFront; + isFrontCamera = !isFrontCamera; + if (cameraDevice != null) { + cameraDevice.release(); + } updateComponentVisible(false); openCamera(); } @@ -196,7 +219,15 @@ public class TakePhotoAbility extends Ability { private class SurfaceCallBack implements SurfaceOps.Callback { @Override public void surfaceCreated(SurfaceOps callbackSurfaceOps) { - openCamera(); + if (callbackSurfaceOps != null) { + callbackSurfaceOps.setFixedSize(SCREEN_HEIGHT,SCREEN_WIDTH); + } + eventHandler.postTask(new Runnable() { + @Override + public void run() { + openCamera(); + } + },200); } @Override diff --git a/media/Camera/entry/src/main/java/ohos/samples/camera/VideoRecordAbility.java b/media/Camera/entry/src/main/java/ohos/samples/camera/VideoRecordAbility.java index 361f364aa4..4aeb904d66 100644 --- a/media/Camera/entry/src/main/java/ohos/samples/camera/VideoRecordAbility.java +++ b/media/Camera/entry/src/main/java/ohos/samples/camera/VideoRecordAbility.java @@ -34,6 +34,7 @@ import ohos.hiviewdfx.HiLogLabel; import ohos.media.camera.CameraKit; import ohos.media.camera.device.Camera; import ohos.media.camera.device.CameraConfig; +import ohos.media.camera.device.CameraInfo; import ohos.media.camera.device.CameraStateCallback; import ohos.media.camera.device.FrameConfig; import ohos.media.common.AudioProperty; @@ -53,6 +54,10 @@ public class VideoRecordAbility extends Ability { private static final HiLogLabel LABEL_LOG = new HiLogLabel(3, 0xD000F00, TAG); + private static final int SCREEN_WIDTH = 1080; + + private static final int SCREEN_HEIGHT = 1920; + private SurfaceProvider surfaceProvider; private Surface recorderSurface; @@ -153,9 +158,29 @@ public class VideoRecordAbility extends Ability { private void openCamera() { CameraKit cameraKit = CameraKit.getInstance(getApplicationContext()); String[] cameraList = cameraKit.getCameraIds(); - String cameraId = cameraList.length > 1 && isFrontCamera ? cameraList[1] : cameraList[0]; - CameraStateCallbackImpl cameraStateCallback = new CameraStateCallbackImpl(); - cameraKit.createCamera(cameraId, cameraStateCallback, eventHandler); + String cameraId = cameraList[0]; + for (String logicalCameraId : cameraList) { + int faceType = cameraKit.getCameraInfo(logicalCameraId).getFacingType(); + switch (faceType){ + case CameraInfo.FacingType.CAMERA_FACING_FRONT: + if (isFrontCamera) { + cameraId = logicalCameraId; + } + break; + case CameraInfo.FacingType.CAMERA_FACING_BACK: + if (!isFrontCamera) { + cameraId = logicalCameraId; + } + break; + case CameraInfo.FacingType.CAMERA_FACING_OTHERS: + default: + break; + } + } + if (cameraId != null) { + CameraStateCallbackImpl cameraStateCallback = new CameraStateCallbackImpl(); + cameraKit.createCamera(cameraId, cameraStateCallback, eventHandler); + } } private void switchCamera(Component component) { @@ -247,7 +272,16 @@ public class VideoRecordAbility extends Ability { private class SurfaceCallBack implements SurfaceOps.Callback { @Override public void surfaceCreated(SurfaceOps callbackSurfaceOps) { - openCamera(); + if (callbackSurfaceOps != null) { + callbackSurfaceOps.setFixedSize(SCREEN_HEIGHT,SCREEN_WIDTH); + } + eventHandler.postTask(new Runnable() { + @Override + public void run() { + openCamera(); + } + },200); + } @Override -- Gitee From 304303baa0e070c8a1230c1681d745a2b293755f Mon Sep 17 00:00:00 2001 From: chenjiayin Date: Wed, 30 Jun 2021 20:51:33 +0800 Subject: [PATCH 2/2] fix bug for camera Signed-off-by: chenjiayin --- .../ohos/samples/camera/TakePhotoAbility.java | 45 ++++++++++++++++--- .../samples/camera/VideoRecordAbility.java | 42 +++++++++++++++-- 2 files changed, 76 insertions(+), 11 deletions(-) diff --git a/media/Camera/entry/src/main/java/ohos/samples/camera/TakePhotoAbility.java b/media/Camera/entry/src/main/java/ohos/samples/camera/TakePhotoAbility.java index e5fab3f653..d8401fe205 100644 --- a/media/Camera/entry/src/main/java/ohos/samples/camera/TakePhotoAbility.java +++ b/media/Camera/entry/src/main/java/ohos/samples/camera/TakePhotoAbility.java @@ -29,7 +29,6 @@ import ohos.agp.graphics.Surface; import ohos.agp.graphics.SurfaceOps; import ohos.agp.window.dialog.ToastDialog; import ohos.app.Context; -import ohos.app.Environment; import ohos.eventhandler.EventHandler; import ohos.eventhandler.EventRunner; import ohos.hiviewdfx.HiLog; @@ -37,6 +36,7 @@ import ohos.hiviewdfx.HiLogLabel; import ohos.media.camera.CameraKit; import ohos.media.camera.device.Camera; import ohos.media.camera.device.CameraConfig; +import ohos.media.camera.device.CameraInfo; import ohos.media.camera.device.CameraStateCallback; import ohos.media.camera.device.FrameConfig; import ohos.media.image.ImageReceiver; @@ -66,7 +66,7 @@ public class TakePhotoAbility extends Ability { private ImageReceiver imageReceiver; - private boolean isCameraFront; + private boolean isFrontCamera; private Surface previewSurface; @@ -115,9 +115,29 @@ public class TakePhotoAbility extends Ability { imageReceiver.setImageArrivalListener(this::saveImage); CameraKit cameraKit = CameraKit.getInstance(getApplicationContext()); String[] cameraList = cameraKit.getCameraIds(); - String cameraId = cameraList.length > 1 && isCameraFront ? cameraList[1] : cameraList[0]; - CameraStateCallbackImpl cameraStateCallback = new CameraStateCallbackImpl(); - cameraKit.createCamera(cameraId, cameraStateCallback, eventHandler); + String cameraId = ""; + for (String logicalCameraId : cameraList) { + int faceType = cameraKit.getCameraInfo(logicalCameraId).getFacingType(); + switch (faceType){ + case CameraInfo.FacingType.CAMERA_FACING_FRONT: + if (isFrontCamera) { + cameraId = logicalCameraId; + } + break; + case CameraInfo.FacingType.CAMERA_FACING_BACK: + if (!isFrontCamera) { + cameraId = logicalCameraId; + } + break; + case CameraInfo.FacingType.CAMERA_FACING_OTHERS: + default: + break; + } + } + if (cameraId != null && !cameraId.equals("")) { + CameraStateCallbackImpl cameraStateCallback = new CameraStateCallbackImpl(); + cameraKit.createCamera(cameraId, cameraStateCallback, eventHandler); + } } private void saveImage(ImageReceiver receiver) { @@ -157,7 +177,10 @@ public class TakePhotoAbility extends Ability { } private void switchCamera(Component component) { - isCameraFront = !isCameraFront; + isFrontCamera = !isFrontCamera; + if (cameraDevice != null) { + cameraDevice.release(); + } updateComponentVisible(false); openCamera(); } @@ -196,7 +219,15 @@ public class TakePhotoAbility extends Ability { private class SurfaceCallBack implements SurfaceOps.Callback { @Override public void surfaceCreated(SurfaceOps callbackSurfaceOps) { - openCamera(); + if (callbackSurfaceOps != null) { + callbackSurfaceOps.setFixedSize(SCREEN_HEIGHT,SCREEN_WIDTH); + } + eventHandler.postTask(new Runnable() { + @Override + public void run() { + openCamera(); + } + },200); } @Override diff --git a/media/Camera/entry/src/main/java/ohos/samples/camera/VideoRecordAbility.java b/media/Camera/entry/src/main/java/ohos/samples/camera/VideoRecordAbility.java index 361f364aa4..455775911d 100644 --- a/media/Camera/entry/src/main/java/ohos/samples/camera/VideoRecordAbility.java +++ b/media/Camera/entry/src/main/java/ohos/samples/camera/VideoRecordAbility.java @@ -34,6 +34,7 @@ import ohos.hiviewdfx.HiLogLabel; import ohos.media.camera.CameraKit; import ohos.media.camera.device.Camera; import ohos.media.camera.device.CameraConfig; +import ohos.media.camera.device.CameraInfo; import ohos.media.camera.device.CameraStateCallback; import ohos.media.camera.device.FrameConfig; import ohos.media.common.AudioProperty; @@ -53,6 +54,10 @@ public class VideoRecordAbility extends Ability { private static final HiLogLabel LABEL_LOG = new HiLogLabel(3, 0xD000F00, TAG); + private static final int SCREEN_WIDTH = 1080; + + private static final int SCREEN_HEIGHT = 1920; + private SurfaceProvider surfaceProvider; private Surface recorderSurface; @@ -153,9 +158,29 @@ public class VideoRecordAbility extends Ability { private void openCamera() { CameraKit cameraKit = CameraKit.getInstance(getApplicationContext()); String[] cameraList = cameraKit.getCameraIds(); - String cameraId = cameraList.length > 1 && isFrontCamera ? cameraList[1] : cameraList[0]; - CameraStateCallbackImpl cameraStateCallback = new CameraStateCallbackImpl(); - cameraKit.createCamera(cameraId, cameraStateCallback, eventHandler); + String cameraId = ""; + for (String logicalCameraId : cameraList) { + int faceType = cameraKit.getCameraInfo(logicalCameraId).getFacingType(); + switch (faceType){ + case CameraInfo.FacingType.CAMERA_FACING_FRONT: + if (isFrontCamera) { + cameraId = logicalCameraId; + } + break; + case CameraInfo.FacingType.CAMERA_FACING_BACK: + if (!isFrontCamera) { + cameraId = logicalCameraId; + } + break; + case CameraInfo.FacingType.CAMERA_FACING_OTHERS: + default: + break; + } + } + if (cameraId != null && !cameraId.equals("")) { + CameraStateCallbackImpl cameraStateCallback = new CameraStateCallbackImpl(); + cameraKit.createCamera(cameraId, cameraStateCallback, eventHandler); + } } private void switchCamera(Component component) { @@ -247,7 +272,16 @@ public class VideoRecordAbility extends Ability { private class SurfaceCallBack implements SurfaceOps.Callback { @Override public void surfaceCreated(SurfaceOps callbackSurfaceOps) { - openCamera(); + if (callbackSurfaceOps != null) { + callbackSurfaceOps.setFixedSize(SCREEN_HEIGHT,SCREEN_WIDTH); + } + eventHandler.postTask(new Runnable() { + @Override + public void run() { + openCamera(); + } + },200); + } @Override -- Gitee