之前直接照着自己的理解罗列了下腾讯云的文档,然后被喷了,那么直接提供代码把。

调用方法

    var userBean = UserBean()userBean.name = ""//验证姓名userBean.idNo = ""// 身份证号userBean.userId = "123456"
FaceVerifySuper.setListener(mContext, userBean, object : FaceVerifySuper.OnTencentRequestListener {override fun faceVerifySuccess() {}override fun faild() {}})}

具体实现

APP_ID,SECRT, keyLicence,这3个参数要自己填写

import android.annotation.SuppressLint
import android.content.Context
import android.content.Context.WIFI_SERVICE
import android.net.wifi.WifiManager
import android.nfc.Tag
import android.os.Bundle
import android.util.Log
import android.widget.Toast
import com.google.common.hash.Hashing
import com.hjq.toast.ToastUtils
import com.webank.facelight.contants.WbCloudFaceContant
import com.webank.facelight.contants.WbFaceError
import com.webank.facelight.listerners.WbCloudFaceVeirfyLoginListner
import com.webank.facelight.tools.WbCloudFaceVerifySdk
import okio.HashingSink
import retrofit2.Call
import retrofit2.Callback
import retrofit2.Response
import java.util.*
import kotlin.collections.ArrayList
import kotlin.collections.HashMap
import kotlin.math.log@SuppressLint("StaticFieldLeak")
object FaceVerifySuper {var TAG = "FaceVerify"val APP_ID = ""val SECRT = ""val GRANT_TYPE = "client_credential"val VERSION = "1.0.0"val TENCENT_BASE_URL = "https://idasc.webank.com/api/"var onTencentRequestListener: OnTencentRequestListener? = nullvar userBean: UserBean? = nullvar mContext: Context? = nullfun setListener(mContext: Context, userBean: UserBean, onTencentRequestListener: OnTencentRequestListener) {this.mContext = mContextthis.userBean = userBeanLog.e("Tag", "userBean====${userBean}")this.onTencentRequestListener = onTencentRequestListenerdoFaceVerify()}fun transferFaceSdk(verifyBean: TencentFaceVerifyBean) {verifyBean?.wifiIp = "IP=" + getIpAddress(mContext!!)var faceVerifyResult: FaceVerifyResult = FaceVerifyResult()//腾讯云线下对接分配的 Licencevar keyLicence = ""var verifyMsgBean = VerifyMsgBean()verifyMsgBean.userId = verifyBean.userIdverifyMsgBean.wifiIp = verifyBean?.wifiIp
//        verifyMsgBean.roleName = verifyBean.userBean?.roleNameLog.e("tag", " verifyBean.orderNo=======${verifyBean.orderNo}")//传入数据var data = Bundle();var inputData = WbCloudFaceVerifySdk.InputData(verifyBean.faceId,verifyBean.orderNo,verifyBean.wifiIp,verifyBean.gps,APP_ID,VERSION,verifyBean.noceStr,verifyBean.userId,verifyBean.sign,verifyBean.verifyMode,keyLicence);data.putSerializable(WbCloudFaceContant.INPUT_DATA, inputData);//个性化参数设置,可以不设置,不设置则为默认选项。//是否显示成功结果页,默认显示,此处设置为不显示data.putBoolean(WbCloudFaceContant.SHOW_SUCCESS_PAGE, false);//是否展示刷脸失败页面,默认展示,此处设置为不显示data.putBoolean(WbCloudFaceContant.SHOW_FAIL_PAGE, false);//sdk样式设置,默认为黑色//此处设置为白色data.putString(WbCloudFaceContant.COLOR_MODE, WbCloudFaceContant.WHITE);//设置选择的比对类型  默认为权威库网纹图片比对//权威数据源比对 WbCloudFaceContant.ID_CRAD//自带比对源比对  WbCloudFaceContant.SRC_IMG//仅活体检测  WbCloudFaceContant.NONE//此处设置权威数据源对比// data.putString(WbCloudFaceContant.COMPARE_TYPE, WbCloudFaceContant.ID_CRAD);//是否需要录制上传视频 默认需要,此处设置为需要data.putBoolean(WbCloudFaceContant.VIDEO_UPLOAD, false);//是否对录制视频进行检查,默认不检查,此处设置为不检查data.putBoolean(WbCloudFaceContant.VIDEO_CHECK, false);//设置是否打开闭眼检测,默认不检测,此处设置为检测data.putBoolean(WbCloudFaceContant.ENABLE_CLOSE_EYES, true);Log.e("FVPresenter", "\n========>>>>" + inputData + "\n")//初始化 SDK,得到是否登录 SDK 成功的结果WbCloudFaceVerifySdk.getInstance().initSdk(mContext, data, object : WbCloudFaceVeirfyLoginListner {override fun onLoginSuccess() {WbCloudFaceVerifySdk.getInstance().startWbFaceVeirifySdk(mContext) { result ->if (result != null) {verifyMsgBean.isSuccess = result.isSuccessverifyMsgBean.sign = result.signverifyMsgBean.liveRate = result.liveRateverifyMsgBean.similarity = result.similarityverifyMsgBean.orderNo = result.orderNo if (result.isSuccess) {faceVerifyResult?.isSuccess = trueLog.d(TAG, "刷脸成功! Sign=" + result.sign + "; liveRate=" + result.liveRate +"; similarity=" + result.similarity + "userImageString=" + result.userImageString)Toast.makeText(mContext, "身份识别成功", Toast.LENGTH_SHORT).show()onTencentRequestListener?.faceVerifySuccess()} else {val error = result.errorverifyMsgBean.verror = VerifyMsgBean.VError()verifyMsgBean.verror?.domain = error.domainverifyMsgBean.verror?.code = error.codeverifyMsgBean.verror?.desc = error.descverifyMsgBean.verror?.reason = error.reasonverifyMsgBean.error = verifyMsgBean.verror.toString()if (error != null) {Log.d(TAG, "刷脸失败!domain=" + error.domain + " ;code= " + error.code+ " ;desc=" + error.desc + ";reason=" + error.reason)if (error.domain == WbFaceError.WBFaceErrorDomainCompareServer) {Log.d(TAG, "对比失败,liveRate=" + result.liveRate +"; similarity=" + result.similarity)}onTencentRequestListener?.faild()Toast.makeText(mContext, "刷脸失败!" + error.desc,Toast.LENGTH_LONG).show()} else {Log.e(TAG, "sdk返回error为空!")}}
//                        listener.success(verifyBean, result)} else {verifyMsgBean.sdkNull = trueLog.e(TAG, "sdk返回结果为空!")}sumbitVerifyMsg(verifyMsgBean!!)}}override fun onLoginFailed(error: WbFaceError?) {Log.i(TAG, "onLoginFailed!")// 通知页面失败
//                listener.faild(verifyBean, error!!)onTencentRequestListener?.faild()if (error != null) {verifyMsgBean.verror = VerifyMsgBean.VError()verifyMsgBean.verror?.domain = error.domainverifyMsgBean.verror?.code = error.codeverifyMsgBean.verror?.desc = error.descverifyMsgBean.verror?.reason = error.reasonverifyMsgBean.error = verifyMsgBean.verror.toString()Log.e(TAG, "登录失败!domain=" + error.domain + " ;code= " + error.code+ " ;desc=" + error.desc + ";reason=" + error.reason)if (error.domain == WbFaceError.WBFaceErrorDomainParams) {ToastUtils.show("传入参数有误!" + error.reason)} else {ToastUtils.show("登录刷脸sdk失败!" + error.desc)
//                        Toast.makeText(mContext, "登录刷脸sdk失败!" + error.desc, Toast.LENGTH_SHORT).show()}} else {verifyMsgBean.sdkNull = trueLog.e(TAG, "sdk返回error为空!")}sumbitVerifyMsg(verifyMsgBean)}})}/*** 人脸识别请求*/fun doFaceVerify() {// 判断传入数据是否合法if (onTencentRequestListener == null || userBean == null || Constants.isEmptyS(userBean!!.name, userBean!!.idNo, userBean!!.userId)) {Log.e(TAG, "onTencentRequestListener${onTencentRequestListener}")Log.e(TAG, "userBean!!.name${userBean!!.name}")Log.e(TAG, "userBean!!.name${userBean!!.idNo}")Log.e(TAG, "userBean!!.name${userBean!!.userId}")ToastUtils.show("非法数据")} else {getAccessToken()}}fun getFaceId(sgin: String, noceStr: String) {var verifyBean = TencentFaceVerifyBean()verifyBean.webankAppId = APP_IDverifyBean.orderNo = Constants.getRandomNumber()verifyBean.name = userBean?.nameverifyBean.idNo = userBean?.idNoverifyBean.userId = userBean?.userIdverifyBean.sign = sginverifyBean.noceStr = noceStrgetRetroClientByTencentUrl().requestFaceId(Constants.Obj2RequestBody(verifyBean)).enqueue(object : Callback<TencentResponseBean> {override fun onResponse(call: Call<TencentResponseBean>, response: Response<TencentResponseBean>) {// 成功获取信息if (OnRequestUtils.isTXResponseSuccess(response) && response.body()?.result?.faceId != null) {verifyBean.faceId = response.body()?.result?.faceIdtransferFaceSdk(verifyBean)} else {if (response.body()?.msg != null)
//                        doFaildOperational(response,-1)ToastUtils.show("错误信息:" + response.body()?.msg)onTencentRequestListener?.faild()}}override fun onFailure(call: Call<TencentResponseBean>, t: Throwable) {onTencentRequestListener?.faild()}})}//    https://idasc.webank.com/api/oauth2/api_ticket/*** 获取NoceTicket*/fun getNonceTicket(t: TencentResponseBean) {val requestMap = HashMap<String, String>()requestMap.put("app_id", APP_ID);requestMap.put("access_token", t.access_token!!);requestMap.put("type", "NONCE");requestMap.put("version", VERSION);requestMap.put("user_id", userBean!!.userId!!);getRetroClientByTencentUrl().requestNonceTicket(requestMap).enqueue(object : Callback<TencentResponseBean> {override fun onResponse(call: Call<TencentResponseBean>, response: Response<TencentResponseBean>) {if (OnRequestUtils.isTXResponseSuccess(response)&& response.body()?.tickets?.size!! > 0&& response.body()?.tickets?.get(0)!!.value != null) {var noceStr: String = Constants.getRandomNumber()var values = ArrayList<String>()values.add(APP_ID)values.add(userBean!!.userId!!) //合作方自行分配(与 SDK 里定义的 userId 保持一致)values.add(VERSION)values.add(noceStr)// 合作方自行生成(与 SDK 里定义的随机数保持一致)var sign = signGenerate(values, response.body()!!.tickets!!.get(0)!!.value!!) // 获取签名//  执行获取 faceId 方法getFaceId(sign, noceStr)} else {doFaildOperational(response, 1)onTencentRequestListener?.faild()}}override fun onFailure(call: Call<TencentResponseBean>, t: Throwable) {onTencentRequestListener?.faild()}})}/*** 获取Access Token*/@Throws()fun getAccessToken() {val requestMap = HashMap<String, String>()requestMap.put("app_id", APP_ID);requestMap.put("secret", SECRT);requestMap.put("grant_type", GRANT_TYPE);requestMap.put("version", VERSION);getRetroClientByTencentUrl().requestAccessToken(requestMap).enqueue(object : Callback<TencentResponseBean> {override fun onResponse(call: Call<TencentResponseBean>, response: Response<TencentResponseBean>) {// 判断返回是否成功if (OnRequestUtils.isTXResponseSuccess(response) && response.body()?.access_token != null) {getNonceTicket(response.body()!!)} else {doFaildOperational(response, 0)onTencentRequestListener?.faild()}}override fun onFailure(call: Call<TencentResponseBean>, t: Throwable) {onTencentRequestListener?.faild()}})}/*** 签名算法* @param values* @param ticket* @return*/fun signGenerate(values: ArrayList<String>, ticket: String): String {
//        values.removeAll(Collections.singleton(null))// remove nullvalues.add(ticket)Collections.sort(values)val sb = StringBuilder()for (s in values) {sb.append(s)}return Hashing.sha1().hashString(sb, Charsets.UTF_8).toString().toUpperCase()}/*** 腾讯云请求配置*/fun getRetroClientByTencentUrl(): RequsetDataInterface {return RetroClient.getApiService(TENCENT_BASE_URL)}/*** 腾讯云正常响应,返回不通过处理*/fun doFaildOperational(response: Response<TencentResponseBean>, type: Int) {var failMsg: StringBuffer = StringBuffer("Faild code :").append(response.body()?.code).append(" msg :").append(response.body()?.msg)if (type == 0 && response.body()?.access_token == null) {failMsg.append("Bad Response ACCESS_TOKEN = NULL")} else if (type == 1 && response.body()?.tickets == null) {failMsg.append("Bad Response NONCE_TICKET = NULL")}ToastUtils.show(failMsg)}/*** 提交此次验证信息结果至己方平台*/fun sumbitVerifyMsg(v: VerifyMsgBean) {}/*** 获取当前设备wifi IP*/private fun getIpAddress(mContext: Context): String {val wm = mContext.getApplicationContext().getSystemService(WIFI_SERVICE) as WifiManagerval ipAddressInt = wm.connectionInfo.ipAddressval ipAddress = String.format(Locale.getDefault(), "%d.%d.%d.%d", ipAddressInt and 0xff, ipAddressInt shr 8 and 0xff, ipAddressInt shr 16 and 0xff, ipAddressInt shr 24 and 0xff)return ipAddress}/*** 回调响应*/interface OnTencentRequestListener {fun faceVerifySuccess()fun faild()}
}

腾讯云Android 人脸识别,快速接入代码相关推荐

  1. 腾讯云app人脸识别 java

    人脸检测与分析和接口鉴权 --来自腾讯al开放平台 代码中用到的方法会在文末给出 人脸检测与分析文档地址:https://ai.qq.com/doc/detectface.shtml 分为两步,1接口 ...

  2. 腾讯云AI人脸识别到底是什么

    人工智能是最近几年特别火的概念,人脸识别作为AI中一种相对应用较多的技术,也广泛被人提及,但是人脸识别到底是什么呢?我们从腾讯云的产品角度来看下: 腾讯云人脸识别(Face Recognition)是 ...

  3. 腾讯云AI人脸识别到底是什么?

    人工智能是近几年是特别火的概念,作为AI中一种相对应用较多的技术,也广泛被人提及,但是人脸识别到底是什么呢? 腾讯云人脸识别(Face Recognition)是基于腾讯优图领先的面部分析技术,提供人 ...

  4. 腾讯云【人脸识别】服务的一次尝试(JAVA)

    背景 人脸识别是人工智能智能领域中应用最广泛的服务之一.个人认为,人脸识别也是目前人工智能领域中技术最成熟的技术之一.各大云服务厂商均开通了人脸识别的服务. 那就来尝尝吧.. 登陆注册->找到人 ...

  5. 百度云android人脸识别sdk,android 集成百度人脸识别sdk 实现考勤

    主要sdk 离线人脸采集sdk 具体实现官网已经写的很详细,这边就说一下移动端集成sdk 所碰到的坑. 第一坑 sdk下载 要下载sdk必须要认证,不过现在有了个人认证,可以先认证一下 下载下来sdk ...

  6. 虹软人脸识别SDK接入Milvus实现海量人脸快速检索

    虹软人脸识别SDK接入Milvus实现海量人脸快速检索 背景 虹软SDK及Milvus简介 开发环境 虹软人脸识别SDK使用简介 Milvus环境搭建 快速检索实现 人脸识别流程简介 快速检索 虹软S ...

  7. 手写体识别代码_【玩转腾讯云】使用API快速构建文字识别小工具之唐诗识别

    本篇推文共计1500个字,阅读时间约3分钟. 腾讯云-腾讯倾力打造的云计算品牌,以卓越科技能力助力各行各业数字化转型,为全球客户提供领先的云计算.大数据.人工智能服务,以及定制化行业解决方案.具体包括 ...

  8. 安卓Android基于百度云平台人脸识别学生考勤签到系统设计

    开发软件:Idea + Mysql + AndroidStudio + 雷电模拟器 基于安卓开发一个人脸识别签到系统,服务器采用springboot框架开发,管理员登录后可以添加和维护人脸信息,添加的 ...

  9. Android人脸识别开发入门--基于虹软免费SDK实现

    转自:http://blog.csdn.net/feishixin/article/details/77718680 引言 人工智能时代快速来临,其中人脸识别是当前比较热门的技术,在国内也越来越多的运 ...

最新文章

  1. Spring AOP无法拦截内部方法调用-- expose-proxy=true用法
  2. 灵活性是原则性基础上的灵活
  3. 泼冷水:反思机器学习5年大跃进(附论文)
  4. Android开发之移动互联网周刊第二期,不错,推荐给大家
  5. LeetCode Text Justification(贪心)
  6. 【Python】你的表格太丑了!能美化下吗?
  7. 《***测试实践指南》D03
  8. 使用bootstrap按钮组并设置其按钮组中按钮的尺寸和距离
  9. [飞秋]局域网聊天写的代码旁人从来看不
  10. select - I/O多路复用
  11. HTTP Basic Authentication
  12. NetApp 数据存储 AFF 和 FAS 系统的磁盘架和存储介质
  13. 用requests库和BeautifulSoup4库爬取新闻列表
  14. RFID反向不归零编码(NRZ)
  15. PHP汉字转拼音笔记.txt
  16. win10+cuda9.2+cudnn 安装趟过的坑
  17. INF安装信息文件⑥
  18. python计算器函数_用Python实现计算器函数的一个小练习,python,功能
  19. 北大核心2020_清华和北大,可以同时上了
  20. 金陵科技学院计算机系男女比,慌了! 2018全国高校男女比例排行榜出炉! 哪所大学最难找对象?...

热门文章

  1. Java工具包:小写金额转换成大写金额
  2. 人脸属性数据数据集汇总
  3. 用python刷PAT【小结1】
  4. bottle学习之JSON模块
  5. 售前管理——怎样写解决方案
  6. Linux中软件的安装方式
  7. 魔方的征途 - 魔方如何选择?
  8. 玩游戏用什么轴的机械键盘好_玩游戏用什么轴的机械键盘好?Cherry轴体该如何选择?...
  9. 计算机防火墙打不开0x6d9,Win7系统打开防火墙出错显示0x6D9怎么处理
  10. linux 使用 mondo rescue 备份 还原系统 iso u盘