IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 移动开发 -> Android接入advance活体检测 -> 正文阅读

[移动开发]Android接入advance活体检测

Android接入Advance.Ai活体检测 Api (安卓活体检测)

通过摄像头实时采集动态影像、识别人物面部表情,以此检测、验证用户的真实性与可靠性。
advance.ai 系统已针对印度尼西亚、印度、菲律宾、越南、泰国这五个国家市场的本地使用环境,定制开发了性能优化方案

活体检测前提:安卓系统相机授权可点击此链接学习

1.advance活体检测动作

在这里插入图片描述
快速调用代码块(下方有详细操作)

String accessKey = "ADVANCE_ACCESS_KEY";  //此处输入你的ADVANCE_ACCESS_KEY
String secretKey = "ADVANCE_SECRET_KEY";  //此处输入你的ADVANCE_SECRET_KEY
Market market = Market.Indonesia;         //印尼的Market   (Market的选择在下方可参考)
GuardianLivenessDetectionSDK.init(getApplication(), accessKey, secretKey, market);
//动作顺序  张嘴  眨眼  摇头...
// 第一个布尔值代表是否打乱传入的动作顺序,true 代表打乱顺序。 默认的动作顺序是 [眨眼]->[摇头]
GuardianLivenessDetectionSDK.setActionSequence(true,Detector.DetectionType.POS_YAW, Detector.DetectionType.MOUTH, Detector.DetectionType.BLINK);

2.advance官网

2.1 中文官网

https://www.advanceai.com.cn/cn/index/pageview/catid/122.html

2.2 印尼官网

https://in.advance.ai/

[ click (API Doc-> Liveness detection)
点击 (API文档->活体检测) ]

2.3 英文官网

https://www.advance.ai/liveness-detection

3. Android接入advance活体检测

Android接入AdvanceAI活体检测,通过摄像头实时采集检测详细说明如下:

3.0 Advance活性检测服务有三个步骤:

`
*步骤1:请求活动检测许可证授权以获得“许可证”
*步骤2:转到下载,下载Android或IOS SDK,将其集成到您的移动应用程序中,以进行活跃度检测,并将步骤1中获取的“许可证”作为请求参数
*步骤3:请求Liveness Detection,以步骤2返回的“livenessId”作为请求参数,获取Liveness分数及其对应的图像
`

官网参考:
活动检测许可证授权(步骤一)
Android or IOS(步骤二)
example Android sdk url address:SDK
(如果访问不了外网,可下载我上传csdn的SDK资源包AndroidX SDK)

当下载完SDK后,可进行如下操作:

3.1 集成 SDK 到您的工程中


3.1.1 打开SDK文件夹,得到如下文件。

文件/文件夹名称解释
liveness集成活体检测功能的模块
  • liveness module 是集成了活体检测功能的UI模块,可直接引用到您的主工程中,根据实际需求进行个性化修改。
  • 考虑到架构之间存在兼容性,以及每种架构的机型占比,如果对包大小有要求,建议选择如下方案:
android{
    ...
    defaultConfig {
        ...
        ndk {
            abiFilters "armeabi","arm64-v8a","x86"
        }   
    }
}

3.1.2 导入 liveness 模块到您的工程

导入模块时注意点说明:

①.liveness模块与app同级目录
在这里插入图片描述
②.livenness模块内的build.gradle下的vision版本记得更改
compileSdkVersion、targetSdkVersion等
在这里插入图片描述
③.app目录内的build.gradle下的dependencies依赖以及flatDir
加入:

repositories {
    flatDir {
        dirs project(':liveness').file('libs')
    }
}
dependencies {
	implementation project(":liveness")
}

在这里插入图片描述
④. 修改android目录下的setting.gradle文件,添加项目模块的引用

include ":liveness"

在这里插入图片描述

3.2 快速接入SDK


  1. 初始化 SDK。
  • 在自定义的 application 中增加如下初始化代码:
// 初始化方法不耗时,非必须在 application 中初始化,但要确保进入 LivenessActivity 之前完成调用
GuardianLivenessDetectionSDK.init(this,your market);

JAVA Android 例子

String accessKey = "ADVANCE_ACCESS_KEY";  //此处输入你的ADVANCE_ACCESS_KEY
String secretKey = "ADVANCE_SECRET_KEY";  //此处输入你的ADVANCE_SECRET_KEY
Market market = Market.Indonesia;         //印尼的Market   (Market的选择在下方可参考)
GuardianLivenessDetectionSDK.init(getApplication(), accessKey, secretKey, market);
Market
Indonesia
India
Philippines
Vietnam
Thailand
Malaysia
Mexico
Singapore
Aksata
Pakistan
Nigeria
CentralData

最后一个参数 Market 是一个枚举类型,必须和您的账号所属国家的类别一致,否则无法通过授权。

  1. 设置 license (由您的服务端调用openAPI获取license)
String checkResult = GuardianLivenessDetectionSDK.setLicenseAndCheck(license);
if ("SUCCESS".equals(checkResult)) {
    // license 有效
   startLivenessActivity();
} else {
    // license 不可用,过期/格式错误/appId未备案
}
  1. 启动活体检测与获取检测结果。

SDK 默认不检查相机权限,如果您希望权限的申请交由 SDK 处理,可在 SDK 初始化方法调用后,调用如下方法,则 LivenessActivity 中会执行权限申请的操作:

GuardianLivenessDetectionSDK.letSDKHandleCameraPermission();

每次进行活体检测成功后,会返回唯一的 livenessId 和本次检测的 300*300 像素的清晰正面照片。

  • 您需要将 livenessId 传给您的服务端,由服务端调用 openAPI 获取本次检测的分值。
  • 您可以通过 SDK 提供的方法直接获取图片,也可以由服务端调用 openAPI 获取。
/**
 * 请求状态码
 */
public static final int REQUEST_CODE_LIVENESS = xxxx;

/**
 * 启动活体检测
 */
private void startLivenessActivity() {
    Intent intent = new Intent(this, LivenessActivity.class);
    startActivityForResult(intent, REQUEST_CODE_LIVENESS);
}

/**
 1. 获取检测结果
 */
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (requestCode == REQUEST_CODE_LIVENESS) {
        if (LivenessResult.isSuccess()) {// 活体检测成功
            String livenessId = LivenessResult.getLivenessId();// 本次活体id
            Bitmap livenessBitmap = LivenessResult.getLivenessBitmap();// 本次活体图片
        } else {// 活体检测失败
            String errorCode = LivenessResult.getErrorCode();// 失败错误码
            String errorMsg = LivenessResult.getErrorMsg();// 失败原因
            ...
        }
    }
}
  1. 动作顺序说明

默认的动作顺序是 [眨眼]->[摇头],如需自定义动作顺序请参考如下代码:

在启动LivenessActivity页面前调用如下方法:

// 第一个布尔值代表是否打乱传入的动作顺序,true 代表打乱顺序。
GuardianLivenessDetectionSDK.setActionSequence(true,Detector.DetectionType.POS_YAW, Detector.DetectionType.MOUTH, Detector.DetectionType.BLINK);
  1. 用户绑定(强烈建议)。

您可以通过该方法将自己的用户唯一标识传给我们,我们会根据该标识建立映射关系。当遇到问题时,方便同我们进行日志追踪。

GuardianLivenessDetectionSDK.bindUser(String userId)
  1. 开启遮挡检测

遮挡检测默认是关闭状态,如需开启遮挡检测,请在初始化SDK之后调用如下方法设置

GuardianLivenessDetectionSDK.isDetectOcclusion(true)
  1. liveness 模块的代码可以自行修改来满足定制化需求。

目前 SDK 支持中文,英文,印尼文,越南语,泰国语,印地语,西班牙语 七种语言/语音。根据手机当前语言自动切换,无需代码设置,如您仅支持一种语言,可自行删除其余国家的资源文件。

错误码解释
FACE_MISSING检测过程中人脸丢失
ACTION_TIMEOUT动作超时
MULTIPLE_FACE检测过程中出现多张人脸
MUCH_MOTION检测过程中动作幅度过大
AUTH_BAD_NETWORK授权请求网络失败
CHECKING_BAD_NETWORK动作结束后图像上传网络请求失败
DEVICE_NOT_SUPPORT该设备不支持活体检测
USER_GIVE_UP用户中途放弃检测
UNDEFINED未定义的其他错误类型
AUTH_PARAMETER_ERROR授权请求参数错误
AUTH_IAM_FAILED包名未备案

MainActivity 代码 (扫脸接口方法 initKeyTypeButton() ):

package ai.advance.integration.demo;

import android.Manifest;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.pm.PackageManager;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;
import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Toast;

import ai.advance.liveness.lib.GuardianLivenessDetectionSDK;
import ai.advance.liveness.lib.LivenessResult;
import ai.advance.liveness.lib.Market;
import ai.advance.liveness.sdk.activity.LivenessActivity;

public class MainActivity extends AppCompatActivity {
    static final int REQUEST_CODE_LIVENESS = 1000;
    private static final int PERMISSIONS_REQUEST_CODE = 1;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initKeyTypeButton();
        initTicketButton();
        initLicenseButton();
    }

    private void initLicenseButton() {
        findViewById(R.id.license_type_button).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                // TODO 将此处的 license 修改
                String license = null;
                if (license == null) {
                    new AlertDialog.Builder(MainActivity.this).setMessage("请在 MainActivity 中给 license 赋值").setPositiveButton("确定", null).create().show();
                } else {
                    boolean packageNamePass = checkPackageName();
                    if (packageNamePass) {
                        GuardianLivenessDetectionSDK.init(getApplication(), Market.Indonesia);
                        String checkResult = GuardianLivenessDetectionSDK.setLicenseAndCheck(license);
                        if ("SUCCESS".equals(checkResult)) {
                            // license 有效
                            checkPermissions();
                        } else {// license 不可用,过期或者格式错误
                            Toast.makeText(MainActivity.this, checkResult, Toast.LENGTH_SHORT).show();
                        }
                    }

                }
            }
        });
    }

    private void initKeyTypeButton() {
        findViewById(R.id.key_type_button).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //TODO 将此处的 key 修改为您的
                String accessKey = "ADVANCE_ACCESS_KEY";
                String secretKey = "ADVANCE_SECRET_KEY";

                Market market = Market.Indonesia;
                if (accessKey == null || secretKey == null || market == null) {
                    new AlertDialog.Builder(MainActivity.this).setMessage("请在 MainActivity 中给 Key 赋值").setPositiveButton("确定", null).create().show();
                } else {
                    boolean packageNamePass = checkPackageName();
                    if (packageNamePass) {
                        GuardianLivenessDetectionSDK.init(getApplication(), accessKey, secretKey, market);
                        checkPermissions();
                    }
                }

            }
        });
    }

    private void initTicketButton() {
        findViewById(R.id.ticket_type_button).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                // TODO 将此处的 ticket 修改
                String ticket = null;
                String queryId = null;
                if (ticket == null) {
                    new AlertDialog.Builder(MainActivity.this).setMessage("请在 MainActivity 中给 ticket 赋值").setPositiveButton("确定", null).create().show();
                } else {
                    boolean packageNamePass = checkPackageName();
                    if (packageNamePass) {
                        GuardianLivenessDetectionSDK.init(getApplication(), Market.Indonesia);
                        GuardianLivenessDetectionSDK.setTicket(ticket);
                        GuardianLivenessDetectionSDK.setQueryId(queryId);
                        checkPermissions();
                    }

                }

            }
        });

    }

    private boolean checkPackageName() {
        if ("your.app.id".equals(getPackageName())) {
            new AlertDialog.Builder(MainActivity.this).setMessage("请将 build.gradle 中的包名修改为您已备案的").setPositiveButton("确定", null).create().show();
            return false;
        }
        return true;
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        switch (requestCode) {
            case REQUEST_CODE_LIVENESS:
//                    Call the following methods to get results
//                    String livenessId = LivenessResult.getLivenessId();
//                    Bitmap livenessBitmap = LivenessResult.getLivenessBitmap();
//                    String transactionId = LivenessResult.getTransactionId();
//                    boolean success = LivenessResult.isSuccess();
//                    String errorMsg = LivenessResult.getErrorMsg();
                if (LivenessResult.isSuccess()) {
                    Toast.makeText(this, "Success", Toast.LENGTH_SHORT).show();
                } else {
                    Toast.makeText(this, LivenessResult.getErrorCode(), Toast.LENGTH_SHORT).show();
                }
                break;
        }
    }

    private boolean allPermissionsGranted() {
        for (String permission : getRequiredPermissions()) {
            if (ContextCompat.checkSelfPermission(this, permission)
                    != PackageManager.PERMISSION_GRANTED) {
                return false;
            }
        }
        return true;
    }

    /**
     * Detect camera authorization
     */
    public void checkPermissions() {
        if (allPermissionsGranted()) {
            onPermissionGranted();
        } else {
            ActivityCompat.requestPermissions(this, getRequiredPermissions(), PERMISSIONS_REQUEST_CODE);
        }
    }

    public String[] getRequiredPermissions() {
        return new String[]{Manifest.permission.CAMERA};
    }

    @Override
    public void onRequestPermissionsResult(
            int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        if (requestCode == PERMISSIONS_REQUEST_CODE) {
            //已授权
            if (allGranted(grantResults)) {
                onPermissionGranted();
            } else {
                onPermissionRefused();
            }
        }
    }

    /**
     * Denied camera permissions
     */
    public void onPermissionRefused() {
        new AlertDialog.Builder(this).setMessage(getString(R.string.liveness_no_camera_permission)).setPositiveButton(getString(R.string.liveness_perform), new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                finish();
            }
        }).create().show();
    }

    private boolean allGranted(int[] grantResults) {
        boolean hasPermission = true;
        for (int i = 0; i < grantResults.length; i++) {
            if (grantResults[i] != PackageManager.PERMISSION_GRANTED) {
                hasPermission = false;
            }
        }
        return hasPermission;
    }

    /**
     * Got camera permissions
     */
    public void onPermissionGranted() {
        Intent intent = new Intent(this, LivenessActivity.class);
        startActivityForResult(intent, REQUEST_CODE_LIVENESS);
    }
}

  移动开发 最新文章
Vue3装载axios和element-ui
android adb cmd
【xcode】Xcode常用快捷键与技巧
Android开发中的线程池使用
Java 和 Android 的 Base64
Android 测试文字编码格式
微信小程序支付
安卓权限记录
知乎之自动养号
【Android Jetpack】DataStore
上一篇文章      下一篇文章      查看所有文章
加:2021-11-16 18:57:11  更:2021-11-16 18:57:53 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 3:46:50-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码