diff --git a/android/src/main/java/org/reactnative/camera/CameraViewManager.java b/android/src/main/java/org/reactnative/camera/CameraViewManager.java index ba70dc1..337fd79 100644 --- a/android/src/main/java/org/reactnative/camera/CameraViewManager.java +++ b/android/src/main/java/org/reactnative/camera/CameraViewManager.java @@ -20,6 +20,7 @@ public class CameraViewManager extends ViewGroupManager { EVENT_ON_FACES_DETECTED("onFacesDetected"), EVENT_ON_BARCODES_DETECTED("onGoogleVisionBarcodesDetected"), EVENT_ON_FACE_DETECTION_ERROR("onFaceDetectionError"), + EVENT_ON_BARCODE_DETECTION_ERROR("onGoogleVisionBarcodeDetectionError"), EVENT_ON_TEXT_RECOGNIZED("onTextRecognized"); private final String mName; diff --git a/android/src/main/java/org/reactnative/camera/RNCameraView.java b/android/src/main/java/org/reactnative/camera/RNCameraView.java index 1f6f3fd..3becc90 100644 --- a/android/src/main/java/org/reactnative/camera/RNCameraView.java +++ b/android/src/main/java/org/reactnative/camera/RNCameraView.java @@ -20,10 +20,10 @@ import com.google.zxing.BarcodeFormat; import com.google.zxing.DecodeHintType; import com.google.zxing.MultiFormatReader; import com.google.zxing.Result; +import org.reactnative.barcodedetector.RNBarcodeDetector; import org.reactnative.camera.tasks.*; import org.reactnative.camera.utils.ImageDimensions; import org.reactnative.camera.utils.RNFileUtils; -import org.reactnative.barcodedetector.RNBarcodeDetector; import org.reactnative.facedetector.RNFaceDetector; import java.io.File; @@ -84,7 +84,7 @@ public class RNCameraView extends CameraView implements LifecycleEventListener, @Override public void onMountError(CameraView cameraView) { - RNCameraViewHelper.emitMountErrorEvent(cameraView); + RNCameraViewHelper.emitMountErrorEvent(cameraView, "Camera view threw an error - component could not be rendered."); } @Override @@ -414,9 +414,7 @@ public class RNCameraView extends CameraView implements LifecycleEventListener, } } } else { - WritableMap error = Arguments.createMap(); - error.putString("message", "Camera permissions not granted - component could not be rendered."); - RNCameraViewHelper.emitMountErrorEvent(this); + RNCameraViewHelper.emitMountErrorEvent(this, "Camera permissions not granted - component could not be rendered."); } } @@ -433,6 +431,7 @@ public class RNCameraView extends CameraView implements LifecycleEventListener, mFaceDetector.release(); mBarcodeDetector.release(); stop(); + mThemedReactContext.removeLifecycleEventListener(this); } private boolean hasCameraPermissions() { diff --git a/android/src/main/java/org/reactnative/camera/RNCameraViewHelper.java b/android/src/main/java/org/reactnative/camera/RNCameraViewHelper.java index ffbda16..6e73af2 100644 --- a/android/src/main/java/org/reactnative/camera/RNCameraViewHelper.java +++ b/android/src/main/java/org/reactnative/camera/RNCameraViewHelper.java @@ -161,8 +161,8 @@ public class RNCameraViewHelper { }; // Mount error event - public static void emitMountErrorEvent(ViewGroup view) { - CameraMountErrorEvent event = CameraMountErrorEvent.obtain(view.getId()); + public static void emitMountErrorEvent(ViewGroup view, String error) { + CameraMountErrorEvent event = CameraMountErrorEvent.obtain(view.getId(), error); ReactContext reactContext = (ReactContext) view.getContext(); reactContext.getNativeModule(UIManagerModule.class).getEventDispatcher().dispatchEvent(event); } diff --git a/android/src/main/java/org/reactnative/camera/events/BarcodeDetectionErrorEvent.java b/android/src/main/java/org/reactnative/camera/events/BarcodeDetectionErrorEvent.java index 3539a37..9328e03 100644 --- a/android/src/main/java/org/reactnative/camera/events/BarcodeDetectionErrorEvent.java +++ b/android/src/main/java/org/reactnative/camera/events/BarcodeDetectionErrorEvent.java @@ -37,7 +37,7 @@ public class BarcodeDetectionErrorEvent extends Event { private static final Pools.SynchronizedPool EVENTS_POOL = new Pools.SynchronizedPool<>(3); - private CameraMountErrorEvent() {} + private String mError; - public static CameraMountErrorEvent obtain(int viewTag) { + private CameraMountErrorEvent() { + } + + public static CameraMountErrorEvent obtain(int viewTag, String error) { CameraMountErrorEvent event = EVENTS_POOL.acquire(); if (event == null) { event = new CameraMountErrorEvent(); } - event.init(viewTag); + event.init(viewTag, error); return event; } + private void init(int viewTag, String error) { + super.init(viewTag); + mError = error; + } + @Override public short getCoalescingKey() { return 0; @@ -39,6 +44,8 @@ public class CameraMountErrorEvent extends Event { } private WritableMap serializeEventData() { - return Arguments.createMap(); + WritableMap arguments = Arguments.createMap(); + arguments.putString("message", mError); + return arguments; } } diff --git a/src/RNCamera.js b/src/RNCamera.js index 26b1ec4..0e1525a 100644 --- a/src/RNCamera.js +++ b/src/RNCamera.js @@ -268,9 +268,9 @@ export default class Camera extends React.Component { CameraManager.stopRecording(this._cameraHandle); } - _onMountError = () => { + _onMountError = ({ nativeEvent }: EventCallbackArgumentsType) => { if (this.props.onMountError) { - this.props.onMountError(); + this.props.onMountError(nativeEvent); } }; diff --git a/types/index.d.ts b/types/index.d.ts index 238810e..3be3499 100644 --- a/types/index.d.ts +++ b/types/index.d.ts @@ -53,7 +53,9 @@ export interface RNCameraProps { useCamera2Api?: boolean; onCameraReady?(): void; - onMountError?(): void; + onMountError?(error: { + message: string + }): void; /** Value: float from 0 to 1.0 */ zoom?: number;