Flutter保活插件alive_flutter_plugin的使用

Flutter保活插件alive_flutter_plugin的使用

根据提示做出相应动作,SDK 实时采集动态信息,判断用户是否为活体、真人。

平台支持(兼容性)

Android iOS
适用版本区间:4.4以上 适用版本区间:9 - 14

环境准备

安装 CocoaPods:

gem install cocoapods

资源引入/集成

pubspec.yaml 中添加:

dependencies:
    alive_flutter_plugin: ^0.2.0

项目开发配置

Android 配置

flutter 工程对应的 android/app/build.gradle 文件的 android 域中添加:

repositories {
    flatDir {
        dirs project(':alive_flutter_plugin').file('libs')
    }
}

插件依赖于相机权限,需要动态申请!可以引入 permission_handler: ^8.1.6 插件动态申请 camera 权限:

// 当前权限
Permission permission = Permission.camera;
// 权限的状态
PermissionStatus status = await permission.status;
if (status.isUndetermined) {
  // 发起权限申请
  PermissionStatus status = await permission.request();
  if (status.isGranted) {
    return true;
  }
} else {
  return true;
}

release 包需要添加混淆规则:

-keep class com.netease.nis.alivedetected.entity.*{*;}
-keep class com.netease.nis.alivedetected.AliveDetector  {
    public <methods>;
    public <fields>;
}
-keep class com.netease.nis.alivedetected.DetectedEngine{
    native <methods>;
}
-keep class com.netease.nis.alivedetected.NISCameraPreview  {
    public <methods>;
}
-keep class com.netease.nis.alivedetected.DetectedListener{*;}
-keep class com.netease.nis.alivedetected.ActionType{ *;}

iOS 配置

flutter 工程对应的 example/ios/Runner/info.plist 里,添加:

<key>NSPhotoLibraryUsageDescription</key> 
<string></string> 
<key>NSCameraUsageDescription</key>
<string></string>

调用示例

class LiveDetectExample extends StatefulWidget {
  @override
  _LiveDetectExampleState createState() => _LiveDetectExampleState();
}

class _LiveDetectExampleState extends State<LiveDetectExample> {
  final AliveFlutterPlugin aliveFlutterPlugin = new AliveFlutterPlugin();

  @override
  void initState() {
    super.initState();
    WidgetsBinding.instance.addPostFrameCallback((_) {
      aliveFlutterPlugin.init("易盾业务id", 30);
    });
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: const Text('易盾活体检测'),
        ),
        body: new SingleChildScrollView(
          physics: BouncingScrollPhysics(),
          child: new Center(
            child: Center(
              child: new Column(
                children: [showFaceImageWidget(), startDetectButton()],
              ),
            ),
          ),
        ),
      ),
    );
  }

  Widget showFaceImageWidget() {
    if (defaultTargetPlatform == TargetPlatform.android) {
      return new Center(
        child: Container(
            width: 300,
            height: 400,
            child: PlatformViewLink(
              viewType: "platform-view-alive",
              surfaceFactory: (context, controller) {
                return AndroidViewSurface(
                  controller: controller as AndroidViewController,
                  gestureRecognizers: const <Factory<OneSequenceGestureRecognizer>>{},
                  hitTestBehavior: PlatformViewHitTestBehavior.opaque,
                );
              },
              onCreatePlatformView: (params) {
                return PlatformViewsService.initExpensiveAndroidView(
                  id: params.id,
                  viewType: "platform-view-alive",
                  layoutDirection: TextDirection.ltr,
                  creationParams: {"width": 300, "height": 400, "backgroundColor":"#ffffff"},
                  creationParamsCodec: const StandardMessageCodec(),
                  onFocus: () {
                    params.onFocusChanged(true);
                  },
                )
                  ..addOnPlatformViewCreatedListener(
                      params.onPlatformViewCreated)
                  ..create();
              },
            ),
            alignment: Alignment.center),
      );
    } else if (defaultTargetPlatform == TargetPlatform.iOS) {
      return new Center(
        child: Container(
          width: 200,
          height: 200,
          decoration: BoxDecoration(
              borderRadius: BorderRadius.all(Radius.circular(100))),
          child: UiKitView(
            viewType: 'com.flutter.alive.imageview',
            creationParams: {
              "width": "200",
              "height": "200",
              "radius": "100",
            },
            // 参数的编码方式
            creationParamsCodec: const StandardMessageCodec(),
          ),
        ),
      );
    }
    return Text('$defaultTargetPlatform is not yet supported by this plugin');
  }

  Widget startDetectButton() {
    return new Container(
      child: SizedBox(
        child: new TextButton(
          onPressed: () {
            startLive();
          },
          child: Text("开始检测"),
        ),
        width: double.infinity,
        height: 49,
      ),
      margin: EdgeInsets.fromLTRB(40, 5, 40, 5),
    );
  }

  void startLive() {
    aliveFlutterPlugin.startLiveDetect().then((value) {
      /**
       * action表示返回的动作,动作状态表示:0——正面,1——右转,2——左转,3——张嘴,4——眨眼。
       */
      var method = value["method"];
      var data = value["data"];
      print("当前阶段为:" + method);
      print("下发的动作序列为:" + data["actions"]);
    });
  }
}

SDK 方法说明

1 初始化活体检测

代码说明:

// 初始化对象
final AliveFlutterPlugin aliveFlutterPlugin = new AliveFlutterPlugin(); 
aliveFlutterPlugin.init("businessID", “timeout”);

参数说明:

参数 类型 是否必填 默认值 描述
businessID String 易盾分配的业务id
timeout int 30秒 活体检测超时时间
isDebug bool false 是否打开debug开关
shakeThreshold int 35 设备抖动检测阈值

2 开始活体检测验证

代码说明:

aliveFlutterPlugin.startLiveDetect().then((value) {
    var method = value["method"];
    var data = value["data"];
    var actions = data["actions"];
});

回调参数说明:

参数 类型 描述
method String 值为onConfig,表示当前为动作下发阶段
actions String 所有待检测动作 0:正视前方 1:向右转头 2:向左转头 3:张嘴动作 4:眨眼动作

3 停止活体检测

代码说明:

aliveFlutterPlugin.stopLiveDetect();

4 检测状态监听

代码说明:

var eventChannel = const EventChannel("yd_alive_flutter_event_channel")

eventChannel.receiveBroadcastStream().listen(_onData, onError: _onError);

void _onData(response) {
    if (response is Map) {
        setState(() {
            var method = response["method"];
            var data = response["data"];
            if (method == "onChecking") {
                _currentStep = data["currentStep"];
                _result = data["message"];
            } else if (method == "onChecked") {
                _result = data["message"];
                _currentStep = 0;
                stopLive();
            } else if (method == "onError") {
             _result = response["message"];
            }
         }
    }
}

response 监听回调类型说明:

method 所处阶段 data中的字段说明
onReady 初始化引擎 initResult:引擎初始化结果 true表现引擎初始化成功、false表示失败
onChecking 检测中 currentStep:当前检测动作 0:正视前方 1:向右转头 2:向左转头 3:张嘴动作 4:眨眼动作 message:动作描述信息
onChecked 检测完成 isPassed:是否通过 token:校验码,用于二次校验
onError 发生异常 code:错误码 message:错误信息
overTime 超时

5 资源释放

代码说明:

void dispose() {
    if (defaultTargetPlatform == TargetPlatform.android) {
      // android需要释放资源,否则会引发内存泄露
      aliveFlutterPlugin.destroy();
    }
    super.dispose();
}

更多关于Flutter保活插件alive_flutter_plugin的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter保活插件alive_flutter_plugin的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,以下是如何在Flutter项目中使用alive_flutter_plugin插件的示例代码和步骤。这个插件主要用于Android平台,帮助应用在后台保持活跃状态。需要注意的是,保持应用在后台活跃可能会消耗更多系统资源,因此应谨慎使用并遵循平台政策和最佳实践。

步骤一:添加依赖

首先,在你的pubspec.yaml文件中添加alive_flutter_plugin依赖:

dependencies:
  flutter:
    sdk: flutter
  alive_flutter_plugin: ^最新版本号 # 请替换为实际最新版本号

然后运行flutter pub get来安装依赖。

步骤二:配置AndroidManifest.xml

由于alive_flutter_plugin主要与Android相关,你可能需要在android/app/src/main/AndroidManifest.xml中添加一些必要的权限配置。通常,插件文档会列出所需的权限,但这里假设没有特定权限要求(实际上,请查阅插件的官方文档以获取准确信息)。

步骤三:初始化插件

在你的Flutter项目的main.dart文件中,初始化并使用alive_flutter_plugin

import 'package:flutter/material.dart';
import 'package:alive_flutter_plugin/alive_flutter_plugin.dart';

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

class MyApp extends StatefulWidget {
  @override
  _MyAppState createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  AliveFlutterPlugin? _alivePlugin;

  @override
  void initState() {
    super.initState();
    // 初始化插件
    _alivePlugin = AliveFlutterPlugin();

    // 启动保活服务(假设插件提供了这样的方法,具体请参考插件文档)
    _startKeepAliveService();
  }

  @override
  void dispose() {
    // 清理资源
    _alivePlugin?.dispose();
    super.dispose();
  }

  Future<void> _startKeepAliveService() async {
    try {
      // 调用插件提供的方法来启动保活服务
      // 假设方法名为startKeepAlive,具体请参考插件文档
      await _alivePlugin?.startKeepAlive();
      print("Keep-alive service started successfully.");
    } catch (e) {
      print("Failed to start keep-alive service: $e");
    }
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Alive Flutter Plugin Demo'),
        ),
        body: Center(
          child: Text('Check log for keep-alive service status.'),
        ),
      ),
    );
  }
}

注意事项

  1. 插件文档:务必查阅alive_flutter_plugin的官方文档,因为插件的API可能会随着版本更新而变化。
  2. 电池优化:Android设备可能有电池优化设置,这些设置可能会限制后台应用的行为。确保用户了解并可能需要在设备设置中调整这些设置。
  3. 平台政策:不同平台(如Google Play Store)对于后台应用行为有不同的政策。确保你的应用遵循这些政策,以避免被下架或受到其他处罚。

结论

上述代码提供了一个基本的框架,展示了如何在Flutter项目中使用alive_flutter_plugin插件。但是,请务必详细阅读插件的官方文档,以确保正确使用和理解插件的所有功能和限制。

回到顶部