Flutter人脸检测锁定插件face_detection_lock的使用

Flutter人脸检测锁定插件face_detection_lock的使用

一个用于iOS和Android的Flutter插件,通过面部识别来保护您的应用或部分页面。

特性

  • 当未检测到人脸时,屏幕将被锁定。
  • 通过回调函数可以获取解锁屏幕的人脸快照。

开始使用

首先,此插件使用了Google的Mk Kit进行面部识别。因此,您需要将项目连接到Firebase项目,并在Flutter项目的android/app/目录下放置google-services.json文件。

其次,在pubspec.yaml文件中添加camera依赖项。

iOS

该插件使用相机进行面部识别,因此请确保请求相机权限。

ios/Runner/Info.plist中添加两行:

  • 一个键为Privacy - Camera Usage Description,并附上使用描述。
  • 另一个键为Privacy - Microphone Usage Description,并附上使用描述。

如果以文本形式编辑Info.plist,添加以下内容:

<key>NSCameraUsageDescription</key>
<string>your usage description here</string>
<key>NSMicrophoneUsageDescription</key>
<string>your usage description here</string>

Android

android/app/build.gradle文件中将最低Android SDK版本更改为21(或更高)。

minSdkVersion 21

使用方法

如果您希望仅锁定某个页面或整个应用,则可以通过FaceDetectionLock包装需要锁定的页面或整个应用。

示例代码

import 'dart:developer';

import 'package:face_detection_lock/face_detection_lock.dart';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:flutter_hooks/flutter_hooks.dart';
import 'package:physical_security_app/main_app_content_placeholder.dart';

Future<void> main() async {
  WidgetsFlutterBinding.ensureInitialized();
  runApp(const MyApp());
}

class MyApp extends StatelessWidget {
  const MyApp({Key? key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    SystemChrome.setPreferredOrientations([
      DeviceOrientation.portraitUp,
      DeviceOrientation.portraitDown,
    ]);
    return MaterialApp(title: 'Secure screen Demo', home: WidgetToggle());
  }
}

class WidgetToggle extends HookWidget {
  const WidgetToggle({super.key});

  @override
  Widget build(BuildContext context) {
    final isAbove = useState(false);
    return Scaffold(
      body: isAbove.value
          ? BlocProvider(
              create: (context) => FaceDetectionBloc(
                onFaceSnapshot: (faces) {
                  log(faces.toString());
                },
                // cameraController: _yourCameracontroller
              )..add(const FaceDetectionEvent.initializeCam()),
              child: FaceDetectionLock(
                isBlocInitializeAbove: isAbove.value,
                body: MainAppContentPlaceholder(),
              ),
            )
          : FaceDetectionLock(
              body: MainAppContentPlaceholder(),
            ),
      floatingActionButton: ElevatedButton(
        child: Text('Switch to isBlocInitialize = ${!isAbove.value}'),
        onPressed: () {
          isAbove.value = !isAbove.value;
        },
      ),
    );
  }
}

解释

在上述示例中,我们创建了一个简单的Flutter应用,其中包含一个切换按钮。当点击按钮时,应用会切换是否使用FaceDetectionBloc初始化。如果使用FaceDetectionBloc初始化,我们将能够通过回调函数获取解锁屏幕的人脸信息。

  1. 创建应用:

    Future<void> main() async {
      WidgetsFlutterBinding.ensureInitialized();
      runApp(const MyApp());
    }
    
  2. 设置应用的基本配置:

    class MyApp extends StatelessWidget {
      const MyApp({Key? key}) : super(key: key);
    
      @override
      Widget build(BuildContext context) {
        SystemChrome.setPreferredOrientations([
          DeviceOrientation.portraitUp,
          DeviceOrientation.portraitDown,
        ]);
        return MaterialApp(title: 'Secure screen Demo', home: WidgetToggle());
      }
    }
    
  3. 创建可切换的页面:

    class WidgetToggle extends HookWidget {
      const WidgetToggle({super.key});
    
      @override
      Widget build(BuildContext context) {
        final isAbove = useState(false);
        return Scaffold(
          body: isAbove.value
              ? BlocProvider(
                  create: (context) => FaceDetectionBloc(
                    onFaceSnapshot: (faces) {
                      log(faces.toString());
                    },
                    // cameraController: _yourCameracontroller
                  )..add(const FaceDetectionEvent.initializeCam()),
                  child: FaceDetectionLock(
                    isBlocInitializeAbove: isAbove.value,
                    body: MainAppContentPlaceholder(),
                  ),
                )
              : FaceDetectionLock(
                  body: MainAppContentPlaceholder(),
                ),
          floatingActionButton: ElevatedButton(
            child: Text('Switch to isBlocInitialize = ${!isAbove.value}'),
            onPressed: () {
              isAbove.value = !isAbove.value;
            },
          ),
        );
      }
    }
    

更多关于Flutter人脸检测锁定插件face_detection_lock的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter人脸检测锁定插件face_detection_lock的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,以下是如何在Flutter项目中使用face_detection_lock插件来实现人脸检测锁定的示例代码。请注意,实际使用前需要确保你已经将插件添加到你的pubspec.yaml文件中,并运行flutter pub get来安装依赖。

首先,确保你的pubspec.yaml文件中包含以下依赖:

dependencies:
  flutter:
    sdk: flutter
  face_detection_lock: ^最新版本号  # 请替换为插件的实际最新版本号

然后,你可以按照以下步骤在Flutter项目中实现人脸检测锁定功能:

  1. 导入必要的包
import 'package:flutter/material.dart';
import 'package:face_detection_lock/face_detection_lock.dart';
  1. 配置人脸检测锁定插件

在你的主应用文件中(通常是main.dart),配置并使用FaceDetectionLock插件。以下是一个简单的示例:

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: FaceDetectionLockScreen(),
    );
  }
}

class FaceDetectionLockScreen extends StatefulWidget {
  @override
  _FaceDetectionLockScreenState createState() => _FaceDetectionLockScreenState();
}

class _FaceDetectionLockScreenState extends State<FaceDetectionLockScreen> {
  late FaceDetectionLock faceDetectionLock;
  bool isLocked = true;

  @override
  void initState() {
    super.initState();
    faceDetectionLock = FaceDetectionLock();
    initFaceDetection();
  }

  Future<void> initFaceDetection() async {
    try {
      // 初始化插件并设置回调
      await faceDetectionLock.initialize();
      faceDetectionLock.setFaceDetectionCallback((bool isFaceDetected) {
        setState(() {
          isLocked = !isFaceDetected;
        });
      });
      
      // 开始人脸检测
      faceDetectionLock.startFaceDetection();
    } catch (e) {
      print("Error initializing face detection: $e");
    }
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Face Detection Lock'),
      ),
      body: Center(
        child: isLocked
            ? Text('Face not detected. Unlock by looking at the camera.')
            : Text('Face detected. Unlocked!'),
      ),
    );
  }

  @override
  void dispose() {
    // 停止人脸检测并释放资源
    faceDetectionLock.stopFaceDetection();
    faceDetectionLock.dispose();
    super.dispose();
  }
}
  1. 处理权限

请注意,由于人脸检测需要使用相机,因此你需要在Android和iOS平台上请求相机权限。以下是如何在Android的AndroidManifest.xml中添加相机权限的示例:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.yourapp">

    <uses-permission android:name="android.permission.CAMERA" />
    <uses-feature android:name="android.hardware.camera" />
    <uses-feature android:name="android.hardware.camera.autofocus" />

    <!-- 其他配置 -->

</manifest>

对于iOS,你需要在Info.plist中添加相机使用说明:

<key>NSCameraUsageDescription</key>
<string>App needs access to the camera to perform face detection.</string>
  1. 运行应用

确保所有配置正确后,你可以运行你的Flutter应用,并在设备上测试人脸检测锁定功能。

注意face_detection_lock插件的具体API和使用方式可能会根据插件的版本和更新有所变化,请参考插件的官方文档和示例代码以获取最新的使用指南。

回到顶部