From 5b8ffdd1fb6956da7e1c1acfd7337f07d621d019 Mon Sep 17 00:00:00 2001 From: justin200914 <125717930+justin200914@users.noreply.github.com> Date: Tue, 18 Jul 2023 09:09:55 +0800 Subject: [PATCH] fixed issue --- .../FaceRecognitionSdkViewManager.kt | 2 + .../com/facerecognitionsdk/FaceSDKModule.kt | 6 +- .../main/java/com/facerecognitionsdk/Utils.kt | 49 +++++++----- example/src/FaceRecognitionPage.tsx | 79 ++++++++++++++----- 4 files changed, 96 insertions(+), 40 deletions(-) diff --git a/android/src/main/java/com/facerecognitionsdk/FaceRecognitionSdkViewManager.kt b/android/src/main/java/com/facerecognitionsdk/FaceRecognitionSdkViewManager.kt index b823ef2..76a48a4 100644 --- a/android/src/main/java/com/facerecognitionsdk/FaceRecognitionSdkViewManager.kt +++ b/android/src/main/java/com/facerecognitionsdk/FaceRecognitionSdkViewManager.kt @@ -98,6 +98,8 @@ class FaceRecognitionSdkViewManager(private val reactContext: ReactApplicationCo fun setLivenessLevel(view: View, livenessLevel: Int) { Log.e("TestEngine", "setLivenessLevel " + livenessLevel) this.checkLivenessLevel = livenessLevel + + startCamera() } @ReactProp(name = "cameraLens") diff --git a/android/src/main/java/com/facerecognitionsdk/FaceSDKModule.kt b/android/src/main/java/com/facerecognitionsdk/FaceSDKModule.kt index 5f86f7b..1cafc9c 100644 --- a/android/src/main/java/com/facerecognitionsdk/FaceSDKModule.kt +++ b/android/src/main/java/com/facerecognitionsdk/FaceSDKModule.kt @@ -111,20 +111,20 @@ class FaceSDKModule(reactContext: ReactApplicationContext) : ReactContextBaseJav @ReactMethod fun similarityCalculation(templates1: String, templates2: String, promise: Promise) { val similarity = FaceSDK.similarityCalculation(Utils.base64ToByteArray(templates1), Utils.base64ToByteArray(templates2)) - Log.e("TestEngine", "similarityCalculation" + similarity) + Log.e("KBY", "similarityCalculation" + similarity) promise.resolve(similarity) } @ReactMethod fun startCamera(promise: Promise) { - Log.e("TestEngine", "start camera" + faceRecognitionSdkViewManager); + Log.e("KBY", "start camera" + faceRecognitionSdkViewManager); faceRecognitionSdkViewManager?.startCamera() promise.resolve(0) } @ReactMethod fun stopCamera(promise: Promise) { - Log.e("TestEngine", "stop camera"); + Log.e("KBY", "stop camera"); faceRecognitionSdkViewManager?.stopCamera() promise.resolve(0) } diff --git a/android/src/main/java/com/facerecognitionsdk/Utils.kt b/android/src/main/java/com/facerecognitionsdk/Utils.kt index aa7e03b..85e7737 100644 --- a/android/src/main/java/com/facerecognitionsdk/Utils.kt +++ b/android/src/main/java/com/facerecognitionsdk/Utils.kt @@ -8,9 +8,9 @@ import android.graphics.Matrix import android.net.Uri import android.provider.MediaStore import android.util.Base64 - +import android.util.Log import com.kbyai.facesdk.FaceBox - +import android.media.ExifInterface import java.io.IOException import java.io.InputStream @@ -59,28 +59,39 @@ object Utils { @Throws(IOException::class) fun getCorrectlyOrientedImage(context: Context, photoUri: Uri): Bitmap { - var isStream: InputStream? = context.contentResolver.openInputStream(photoUri) - val dbo = BitmapFactory.Options() - dbo.inJustDecodeBounds = true - BitmapFactory.decodeStream(isStream, null, dbo) - isStream?.close() - - val orientation = getOrientation(context, photoUri) + var rotate = 0 + val inputStream: InputStream? = context.contentResolver.openInputStream(photoUri) + inputStream?.let { + val exif = ExifInterface(it) + val orientation = exif.getAttributeInt( + ExifInterface.TAG_ORIENTATION, + ExifInterface.ORIENTATION_NORMAL + ) + rotate = when (orientation) { + ExifInterface.ORIENTATION_ROTATE_270 -> 270 + ExifInterface.ORIENTATION_ROTATE_180 -> 180 + ExifInterface.ORIENTATION_ROTATE_90 -> 90 + else -> 0 + } + it.close() + } var srcBitmap: Bitmap - isStream = context.contentResolver.openInputStream(photoUri) + val isStream = context.contentResolver.openInputStream(photoUri) srcBitmap = BitmapFactory.decodeStream(isStream) isStream?.close() - if (orientation > 0) { - val matrix = Matrix() - matrix.postRotate(orientation.toFloat()) - - srcBitmap = Bitmap.createBitmap(srcBitmap, 0, 0, srcBitmap.width, - srcBitmap.height, matrix, true) - } - - return srcBitmap + val matrix = Matrix() + matrix.postRotate(rotate.toFloat()) + return Bitmap.createBitmap( + srcBitmap, + 0, + 0, + srcBitmap.width, + srcBitmap.height, + matrix, + true + ) } fun byteArrayToBase64(byteArray: ByteArray): String { diff --git a/example/src/FaceRecognitionPage.tsx b/example/src/FaceRecognitionPage.tsx index 795481a..8539b63 100644 --- a/example/src/FaceRecognitionPage.tsx +++ b/example/src/FaceRecognitionPage.tsx @@ -1,5 +1,5 @@ // FaceRecognitionPage.js -import React, { useEffect, useState } from 'react'; +import React, { useEffect, useState, useRef } from 'react'; import { View, Text, StyleSheet, TouchableOpacity, Image, } from 'react-native'; import { FaceRecognitionSdkView, FaceSDKModule } from 'face-recognition-sdk'; import { check, request, PERMISSIONS, RESULTS } from 'react-native-permissions' @@ -13,10 +13,57 @@ const cameraPermission = Platform.select({ android: PERMISSIONS.ANDROID.CAMERA, }) +const FaceRecognitionView = () => { + const isFocused = useIsFocused(); + const sdkViewRef = useRef(null); + + useEffect(() => { + if (isFocused) { + startCamera(); + } else { + stopCamera(); + } + + return () => { + stopCamera(); + }; + }, [isFocused]); + + const startCamera = async () => { + await FaceSDKModule.startCamera(); + }; + + const stopCamera = async () => { + await FaceSDKModule.stopCamera(); + }; + + const handleViewLayout = () => { + if (isFocused && sdkViewRef.current) { + startCamera(); + } else { + stopCamera(); + } + }; + + return ( + + + + + + ); +}; + const FaceRecognitionPage = ({ navigation, route }) => { const { persons } = route.params; const [faces, setFaces] = useState([]); + const [cameraShow, setCameraShow] = useState(false); const isFocused = useIsFocused(); var recognized = false; @@ -26,7 +73,6 @@ const FaceRecognitionPage = ({ navigation, route }) => { }; useEffect(() => { - console.log("isFocused", isFocused); checkPermission(); const eventEmitter = new NativeEventEmitter(FaceSDKModule); @@ -37,11 +83,12 @@ const FaceRecognitionPage = ({ navigation, route }) => { } }); - return () => { - stopCamera(); - // AppState.removeEventListener('change', handleAppStateChange); - // BackHandler.removeEventListener('hardwareBackPress', handleBackButton); + if(isFocused) + recognized = false; + else + recognized = true; + return () => { eventListener.remove(); }; @@ -96,15 +143,6 @@ const FaceRecognitionPage = ({ navigation, route }) => { } }; - - const startCamera = async () => { - await FaceSDKModule.startCamera(); - } - - const stopCamera = async () => { - await FaceSDKModule.stopCamera(); - } - const checkPermission = async () => { const permissionStatus = await check(cameraPermission); handlePermissionStatus(permissionStatus); @@ -124,7 +162,7 @@ const FaceRecognitionPage = ({ navigation, route }) => { requestPermission(); break; case RESULTS.GRANTED: - startCamera(); + setCameraShow(true); break; case RESULTS.BLOCKED: break; @@ -146,8 +184,13 @@ const FaceRecognitionPage = ({ navigation, route }) => { - - + {cameraShow ? ( + + ) : ( + + Camera permission issue. + + )}