Browse Source

1、安卓板子摄像头调整

guanxinyi 1 year ago
parent
commit
275a97f2ad

+ 6 - 8
lib/pages/check/widgets/exam_configurable/exam_urinalys.dart

@@ -1,8 +1,6 @@
 import 'package:flutter/material.dart';
 import 'package:vitalapp/components/dialog_input.dart';
-import 'package:vnote_device_plugin/consts/types.dart';
 import 'package:vitalapp/pages/check/widgets/exam_configurable/exam_card.dart';
-import 'package:vitalapp/pages/medical/controller.dart';
 
 ///  尿常规
 class ExamUrinalysis extends StatefulWidget {
@@ -19,8 +17,6 @@ class ExamUrinalysis extends StatefulWidget {
 }
 
 class _ExamUrinalysisState extends State<ExamUrinalysis> {
-  String? deviceType = MedicalController.typeConvertMap[DeviceTypes.URINE];
-
   List<Map<String, String>> urinalysis = [
     {"name": '尿白细胞', "key": 'LEU'},
     {"name": '红细胞/潜血', "key": 'BLD'},
@@ -38,15 +34,17 @@ class _ExamUrinalysisState extends State<ExamUrinalysis> {
   Map _value = {};
   @override
   void initState() {
-    initUrinalys();
+    initData();
     super.initState();
   }
 
-  Future<void> initUrinalys() async {
-    await initData();
+  @override
+  void didUpdateWidget(ExamUrinalysis oldWidget) {
+    initData();
+    super.didUpdateWidget(oldWidget);
   }
 
-  Future<void> initData() async {
+  void initData() {
     _value = widget.currentValue;
     setState(() {});
   }

+ 10 - 5
lib/pages/check/widgets/new_configurable_card.dart

@@ -142,12 +142,18 @@ class NewConfigurableFormState extends State<NewConfigurableCard> {
 
   void onSetExamDataEvent(sender, Map<String, dynamic> e) {
     if (mounted) {
-      Map<String, String> examData = {};
+      Map<String, dynamic> examData = {};
       setState(() {
-        e.values.forEach((element) {
-          examData.addAll(element);
+        print(widget.cardKey);
+        e.forEach((key, value) {
+          if (key != "Urine") {
+            examData.addAll(value);
+          } else {
+            examData.addAll({"Urinary_Pro": value});
+          }
         });
-        Map<String, String> newMap = Map.from(examData);
+
+        Map<String, dynamic> newMap = Map.from(examData);
 
         if (examData["sugar"]?.isNotEmpty ?? false) {
           newMap.remove("sugar");
@@ -684,7 +690,6 @@ class NewConfigurableFormState extends State<NewConfigurableCard> {
   }
 
   Widget _buildRadioScore(FormObject currentFormObject) {
-    print(currentFormObject.toJson());
     List<Option> options = currentFormObject.options ?? [];
     String currentSelected =
         formValue[currentFormObject.childrenKey!.first] ?? "";

+ 41 - 1
lib/pages/facial_recognition/controller.dart

@@ -8,6 +8,7 @@ import 'package:flutter/services.dart';
 import 'package:get/get.dart';
 import 'package:google_mlkit_face_detection/google_mlkit_face_detection.dart';
 import 'package:image_gallery_saver/image_gallery_saver.dart';
+import 'package:vitalapp/architecture/app_parameters.dart';
 import 'package:vitalapp/architecture/storage/storage.dart';
 import 'package:vitalapp/architecture/utils/prompt_box.dart';
 import 'package:vitalapp/components/alert_dialog.dart';
@@ -46,6 +47,7 @@ class FacialRecognitionController extends GetxController
 
   // 屏幕上手指数量
   int pointers = 0;
+  bool _isLocalStation = AppParameters.data.isLocalStation;
 
   // 当前需要返回的身份信息
   IdCardInfoModel idCardInfo = IdCardInfoModel();
@@ -233,6 +235,42 @@ class FacialRecognitionController extends GetxController
     }
   }
 
+  int adjustCameraAngle(
+    CameraController controller,
+    CameraDescription cameraDescription,
+  ) {
+    int sensorOrientation = cameraDescription.sensorOrientation;
+    DeviceOrientation deviceOrientation = controller.value.deviceOrientation;
+
+    // 根据设备方向调整摄像头角度
+    int angle = 0;
+    switch (deviceOrientation) {
+      case DeviceOrientation.portraitUp:
+        angle = sensorOrientation;
+        break;
+      case DeviceOrientation.landscapeLeft:
+        angle = sensorOrientation - 90;
+        break;
+      case DeviceOrientation.portraitDown:
+        angle = sensorOrientation - 180;
+        break;
+      case DeviceOrientation.landscapeRight:
+        angle = sensorOrientation + 90;
+        break;
+    }
+
+    /// 前置需要倒转180度
+    if (cameraDescription.lensDirection == CameraLensDirection.front) {
+      angle -= 180;
+    }
+
+    /// 体检工作站返回的是后置,但是实际上效果需要转180度
+    if (_isLocalStation) {
+      angle -= 180;
+    }
+    return angle;
+  }
+
   /// 相机锁定旋转
   Future<void> lockCaptureOrientation() async {
     final CameraController? cameraController = kCameraController;
@@ -243,8 +281,10 @@ class FacialRecognitionController extends GetxController
 
     if (!cameraController.value.isCaptureOrientationLocked) {
       try {
+        //  await cameraController.lockCaptureOrientation(DeviceOrientation.landscapeLeft)
+
         await cameraController
-            .lockCaptureOrientation(DeviceOrientation.landscapeLeft);
+            .lockCaptureOrientation(cameraController.value.deviceOrientation);
       } on CameraException catch (e) {
         PromptBox.toast('Error: ${e.code}\n${e.description}');
       }

+ 44 - 24
lib/pages/facial_recognition/view.dart

@@ -1,3 +1,5 @@
+import 'dart:math';
+
 import 'package:camera/camera.dart';
 import 'package:fis_jsonrpc/rpc.dart';
 import 'package:flutter/material.dart';
@@ -54,16 +56,22 @@ class FacialRecognitionPage extends GetView<FacialRecognitionController> {
             child: LayoutBuilder(builder: (context, constraints) {
               return Stack(
                 children: <Widget>[
-                  OverflowBox(
-                    maxHeight: constraints.maxHeight,
-                    maxWidth: 2000,
-                    child: Container(
-                      color: Colors.black,
-                      child: Center(
-                        child: _cameraPreviewWidget(),
-                      ),
+                  Container(
+                    color: Colors.black,
+                    child: Center(
+                      child: _cameraPreviewWidget(),
                     ),
                   ),
+                  // OverflowBox(
+                  //   maxHeight: constraints.maxHeight,
+                  //   maxWidth: 2000,
+                  //   child: Container(
+                  //     color: Colors.black,
+                  //     child: Center(
+                  //       child: _cameraPreviewWidget(),
+                  //     ),
+                  //   ),
+                  // ),
                   const Center(child: CameraForFace()),
                   Align(
                     alignment: Alignment.bottomRight,
@@ -88,22 +96,34 @@ class FacialRecognitionPage extends GetView<FacialRecognitionController> {
         child: CircularProgressIndicator(),
       );
     } else {
-      return Listener(
-        onPointerDown: (_) => controller.pointers++,
-        onPointerUp: (_) => controller.pointers--,
-        child: CameraPreview(
-          cameraController,
-          child: LayoutBuilder(
-            builder: (BuildContext context, BoxConstraints constraints) {
-              return GestureDetector(
-                behavior: HitTestBehavior.opaque,
-                onScaleStart: controller.handleScaleStart,
-                onScaleUpdate: controller.handleScaleUpdate,
-                onTapDown: (TapDownDetails details) =>
-                    controller.onViewFinderTap(details, constraints),
-                child: const FaceBoundingBox(),
-              );
-            },
+      return Transform.rotate(
+        angle: controller.adjustCameraAngle(
+              cameraController,
+              cameraController.description,
+            ) *
+            pi /
+            180,
+        child: Listener(
+          onPointerDown: (_) => controller.pointers++,
+          onPointerUp: (_) => controller.pointers--,
+          child: Column(
+            children: [
+              CameraPreview(
+                cameraController,
+                child: LayoutBuilder(
+                  builder: (BuildContext context, BoxConstraints constraints) {
+                    return GestureDetector(
+                      behavior: HitTestBehavior.opaque,
+                      onScaleStart: controller.handleScaleStart,
+                      onScaleUpdate: controller.handleScaleUpdate,
+                      onTapDown: (TapDownDetails details) =>
+                          controller.onViewFinderTap(details, constraints),
+                      child: const FaceBoundingBox(),
+                    );
+                  },
+                ),
+              ),
+            ],
           ),
         ),
       );

+ 45 - 2
lib/pages/id_card_scan/controller.dart

@@ -10,6 +10,7 @@ import 'package:flutter_smartscan_plugin/id_card_recognition.dart'
 import 'package:get/get.dart';
 import 'package:google_mlkit_face_detection/google_mlkit_face_detection.dart';
 import 'package:intl/intl.dart';
+import 'package:vitalapp/architecture/app_parameters.dart';
 import 'package:vitalapp/architecture/storage/storage.dart';
 import 'package:vitalapp/architecture/utils/common_util.dart';
 import 'package:vitalapp/architecture/utils/prompt_box.dart';
@@ -42,6 +43,9 @@ class IdCardScanController extends GetxController with WidgetsBindingObserver {
   // 屏幕上手指数量
   int pointers = 0;
 
+  /// 是否是工作站
+  bool _isLocalStation = AppParameters.data.isLocalStation;
+
   /// 开始缩放
   void handleScaleStart(ScaleStartDetails details) {
     _baseScale = _currentScale;
@@ -96,6 +100,42 @@ class IdCardScanController extends GetxController with WidgetsBindingObserver {
     }
   }
 
+  int adjustCameraAngle(
+    CameraController controller,
+    CameraDescription cameraDescription,
+  ) {
+    int sensorOrientation = cameraDescription.sensorOrientation;
+    DeviceOrientation deviceOrientation = controller.value.deviceOrientation;
+
+    // 根据设备方向调整摄像头角度
+    int angle = 0;
+    switch (deviceOrientation) {
+      case DeviceOrientation.portraitUp:
+        angle = sensorOrientation;
+        break;
+      case DeviceOrientation.landscapeLeft:
+        angle = sensorOrientation - 90;
+        break;
+      case DeviceOrientation.portraitDown:
+        angle = sensorOrientation - 180;
+        break;
+      case DeviceOrientation.landscapeRight:
+        angle = sensorOrientation + 90;
+        break;
+    }
+
+    /// 前置需要倒转180度
+    if (cameraDescription.lensDirection == CameraLensDirection.front) {
+      angle -= 180;
+    }
+
+    /// 体检工作站返回的是后置,但是实际上效果需要转180度
+    if (_isLocalStation) {
+      angle -= 180;
+    }
+    return angle;
+  }
+
   /// 启动指定相机
   Future<void> openNewCamera(CameraDescription cameraDescription) async {
     final CameraController? oldController = kCameraController;
@@ -221,8 +261,11 @@ class IdCardScanController extends GetxController with WidgetsBindingObserver {
 
     if (!cameraController.value.isCaptureOrientationLocked) {
       try {
-        await cameraController
-            .lockCaptureOrientation(DeviceOrientation.landscapeLeft);
+        DeviceOrientation deviceOrientation =
+            cameraController.value.deviceOrientation;
+
+        // await cameraController.lockCaptureOrientation(DeviceOrientation.landscapeLeft);
+        await cameraController.lockCaptureOrientation(deviceOrientation);
       } on CameraException catch (e) {
         PromptBox.toast('Error: ${e.code}\n${e.description}');
       }

+ 28 - 16
lib/pages/id_card_scan/view.dart

@@ -1,3 +1,5 @@
+import 'dart:math';
+
 import 'package:camera/camera.dart';
 import 'package:flutter/material.dart';
 import 'package:get/get.dart';
@@ -76,22 +78,32 @@ class IdCardScanPage extends GetView<IdCardScanController> {
         child: CircularProgressIndicator(),
       );
     } else {
-      return Listener(
-        onPointerDown: (_) => controller.pointers++,
-        onPointerUp: (_) => controller.pointers--,
-        child: CameraPreview(
-          cameraController,
-          child: LayoutBuilder(
-            builder: (BuildContext context, BoxConstraints constraints) {
-              return GestureDetector(
-                behavior: HitTestBehavior.opaque,
-                onScaleStart: controller.handleScaleStart,
-                onScaleUpdate: controller.handleScaleUpdate,
-                onTapDown: (TapDownDetails details) =>
-                    controller.onViewFinderTap(details, constraints),
-                child: Container(),
-              );
-            },
+      return Transform.rotate(
+        angle: controller.adjustCameraAngle(
+              cameraController,
+              cameraController.description,
+            ) *
+            pi /
+            180,
+        child: Listener(
+          onPointerDown: (_) => controller.pointers++,
+          onPointerUp: (_) => controller.pointers--,
+          child: CameraPreview(
+            cameraController,
+            child: LayoutBuilder(
+              builder: (BuildContext context, BoxConstraints constraints) {
+                return FittedBox(
+                  child: GestureDetector(
+                    behavior: HitTestBehavior.opaque,
+                    onScaleStart: controller.handleScaleStart,
+                    onScaleUpdate: controller.handleScaleUpdate,
+                    onTapDown: (TapDownDetails details) =>
+                        controller.onViewFinderTap(details, constraints),
+                    child: Container(),
+                  ),
+                );
+              },
+            ),
           ),
         ),
       );