iis服务器助手广告广告
返回顶部
首页 > 资讯 > 移动开发 >Android6.0指纹识别开发案例
  • 232
分享到

Android6.0指纹识别开发案例

指纹识别指纹Android 2022-06-06 07:06:11 232人浏览 八月长安
摘要

Android M指纹的资料太少,经过一段时间阅读原生Android代码,写了以下例子,贡献出来给需要帮助的人。 以下内容基于64位的高通CPU,搭载fpc1020芯片,此部分

Android M指纹的资料太少,经过一段时间阅读原生Android代码,写了以下例子,贡献出来给需要帮助的人。
以下内容基于64位的高通CPU,搭载fpc1020芯片,此部分代码在原生android上做了更改,以应付工厂指纹的测试。原生android指纹录入需要采集10次(因不同的芯片而定)。

代码简单说明:

1. FingerPrintEnrollBase类:
重要的是


public interface Listener { 
  void onEnrollmentHelp(CharSequence helpString); 
  void onEnrollmentError(int errMsgId, CharSequence errString); 
  void onEnrollmentProgressChange(int steps, int remaining); 
} 

这个接口。
  1)onEnrollmentHelp函数:是下层返回的指纹操作帮助信息。
  2)onEnrollmentError函数是下层返回的错误信息,errMsgId是错误信息类型,其中1表示指纹硬件不可用,3表示超时,5表示操作已取消。errString是errMsgId对应的文字信息,有需要的自己实验就知道了。
  3)onEnrollmentProgressChange()函数是显示当前指纹的采集情况,steps:总共需要录入多少次;remaining是剩余多少次,我在此函数中有打印Log。

2. FingerPrintActivity是主Activity类,FingerPrintEnrollBase是指纹Base类。
需要特别说明的是,在FingerPrintEnrollBase类中有一句:private byte[] mToken = new byte[69];这个数组正常情况是通过输入密码后经由framework层向hal层申请的,我这里为了省去验证那一块的代码,通过sizeof(hw_auth_token_t)计算出来的为69,需要的请依此计算。我在代码里实验过,此数组如果不是69(在64位CPU上),将直接导致程序crach!
fpc指纹的采集流程图:


 
package com.mediatek.test; 
import android.app.Activity; 
import android.app.Fragment; 
import android.content.Context; 
import android.hardware.fingerprint.FingerprintManager; 
import android.os.Bundle; 
import android.os.CancellationSignal; 
import android.os.Handler; 
import android.util.Log; 
 
public class FingerPrintEnrollBase extends Fragment { 
 private int mEnrollmentSteps = -1; 
 private int mEnrollmentRemaining = 0; 
 private Listener mListener; 
 private boolean mEnrolling; 
 private CancellationSignal mEnrollmentCancel; 
 private Handler mHandler = new Handler(); 
 private byte[] mToken = new byte[69];//if byte length != sizeof(hw_auth_token_t), throws Exception 
 private boolean mDone; 
 private static final String TAG = "FingerPrintEnrollBase"; 
 @Override 
 public void onCreate(Bundle savedInstanceState) { 
  super.onCreate(savedInstanceState); 
  setRetainInstance(true); 
 } 
 @Override 
 public void onAttach(Activity activity) { 
  super.onAttach(activity); 
 } 
 @Override 
 public void onStart() { 
  super.onStart(); 
  Log.d(TAG, "mToken length="+mToken.length); 
  if (!mEnrolling) { 
   FingerprintManager mFpM = (FingerprintManager) getActivity().getSystemService(Context.FINGERPRINT_SERVICE); 
   startEnrollment(mFpM); 
  } 
 } 
 @Override 
 public void onStop() { 
  super.onStop(); 
  if (!getActivity().isChanginGConfigurations()) { 
   cancelEnrollment(); 
  } 
 } 
 protected void startEnrollment(FingerprintManager mFpM) { 
  mHandler.removeCallbacks(mTimeoutRunnable); 
  mEnrollmentSteps = -1; 
  mEnrollmentCancel = new CancellationSignal(); 
  if(mFpM != null){ 
   mFpM.enroll(mToken, mEnrollmentCancel, 0, mEnrollmentCallback); 
  } 
  mEnrolling = true; 
 } 
 protected void cancelEnrollment() { 
  mHandler.removeCallbacks(mTimeoutRunnable); 
  if (mEnrolling) { 
   mEnrollmentCancel.cancel(); 
   mEnrolling = false; 
   mEnrollmentSteps = -1; 
  } 
 } 
 public void setListener(Listener listener) { 
  mListener = listener; 
 } 
 public int getEnrollmentSteps() { 
  return mEnrollmentSteps; 
 } 
 public int getEnrollmentRemaining() { 
  return mEnrollmentRemaining; 
 } 
 public boolean isDone() { 
  return mDone; 
 } 
 private FingerprintManager.EnrollmentCallback mEnrollmentCallback 
   = new FingerprintManager.EnrollmentCallback() { 
  @Override 
  public void onEnrollmentProgress(int remaining) { 
   if (mEnrollmentSteps == -1) { 
    mEnrollmentSteps = remaining; 
   } 
   mEnrollmentRemaining = remaining; 
   mDone = remaining == 0; 
   if (mListener != null) { 
    mListener.onEnrollmentProgressChange(mEnrollmentSteps, remaining); 
   } 
  } 
  @Override 
  public void onEnrollmentHelp(int helpMsgId, CharSequence helpString) { 
   if (mListener != null) { 
    mListener.onEnrollmentHelp(helpString); 
   } 
  } 
  @Override 
  public void onEnrollmentError(int errMsgId, CharSequence errString) { 
   if (mListener != null) { 
    mListener.onEnrollmentError(errMsgId, errString); 
   } 
  } 
 }; 
 private final Runnable mTimeoutRunnable = new Runnable() { 
  @Override 
  public void run() { 
   cancelEnrollment(); 
  } 
 }; 
 public interface Listener { 
  void onEnrollmentHelp(CharSequence helpString); 
  void onEnrollmentError(int errMsgId, CharSequence errString); 
  void onEnrollmentProgressChange(int steps, int remaining); 
 } 
} 

 FingerPrintActivity:


package com.mediatek.test; 
import java.io.FileInputStream; 
import java.io.IOException; 
import java.util.List; 
import java.util.Timer; 
import java.util.TimerTask; 
import android.R.color; 
import android.app.Activity; 
import android.app.AlertDialog; 
import android.content.Context; 
import android.content.DialogInterface; 
import android.content.Intent; 
import android.graphics.Color; 
import android.os.Bundle; 
import android.os.CancellationSignal; 
import android.os.Handler; 
import android.os.Message; 
import android.text.Spannable; 
import android.text.style.ForegroundColorSpan; 
import android.util.Log; 
import android.view.KeyEvent; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.widget.Button; 
import android.widget.ImageView; 
import android.widget.ProgressBar; 
import android.widget.TableRow; 
import android.widget.TextView; 
import android.widget.Toast; 
import com.mediatek.test.R; 
import android.hardware.fingerprint.Fingerprint; 
import android.hardware.fingerprint.FingerprintManager; 
public class FingerPrintActivity extends Activity implements FingerPrintEnrollBase.Listener{ 
 private static final String TAG = "FingerPrintActivity"; 
 private MyHandler mHandler = new MyHandler(); 
 private TextView fingerPrintAcquisitionTextView, fingerPrintEnrollmentErrorView, fingerPrintEnrollmentHelpView; 
 private FingerPrintEnrollBase fpeb; 
 private FingerprintManager mFingerprintManager; 
 @Override 
 protected int setTitleId() { 
  return R.string.tittle_fingerprint; 
 } 
 @Override 
 protected Activity getActivity() { 
  return this; 
 } 
 @Override 
 protected void onCreate(Bundle savedInstanceState) { 
  super.onCreate(savedInstanceState); 
  setContentView(R.layout.fingerprint); 
  fingerPrintAcquisitionTextView = (TextView)findViewById(R.id.fingerprint_message); 
  fingerPrintEnrollmentErrorView= (TextView)findViewById(R.id.fingerprint_enrollment_error); 
  fingerPrintEnrollmentHelpView= (TextView)findViewById(R.id.fingerprint_enrollment_help); 
  mFingerprintManager = (FingerprintManager) getActivity().getSystemService( 
    Context.FINGERPRINT_SERVICE); 
 } 
 private void sendMsgToHandler(int msgType, String remark){ 
  Message msg = Message.obtain(); 
  msg.what = msgType; 
  Bundle bundle = new Bundle(); 
  bundle.putString("result", remark); 
  msg.setData(bundle); 
  mHandler.sendMessage(msg); 
 } 
 @Override 
 public void onEnrollmentHelp(CharSequence helpString) { 
  Log.d(TAG, "==onEnrollmentHelp="+helpString.toString()); 
  sendMsgToHandler(3, helpString.toString()); 
 } 
 @Override 
 public void onEnrollmentError(int errMsgId, CharSequence errString) { 
  Log.d(TAG, "==onEnrollmentError errMsgId="+errMsgId+" errString="+errString.toString()); 
  if(errMsgId == 3){//time out 
   postEnrollment(); 
  }else if(errMsgId == 1){//hardware lose efficacy 
   startEnrollment(); 
  }else if(errMsgId == 5){//operation cancel 
  }else{ 
   sendMsgToHandler(4, errString.toString()); 
  } 
 } 
 @Override 
 public void onEnrollmentProgressChange(int steps, int remaining) { 
  Log.d(TAG, "===============onEnrollmentProgressChange======="); 
  Log.d(TAG, "steps" + steps + "||remaining=" + remaining); 
  fingerPrintEnrollmentHelpView.setText(""); 
  fingerPrintEnrollmentErrorView.setText(""); 
  sendMsgToHandler(2, getString(R.string.fingerprint_validate_success)); 
  buttonS.setEnabled(true); 
  stopFingerprint(); 
 } 
 private void startEnrollment(){ 
  if (fpeb == null) { 
   fpeb = new FingerPrintEnrollBase(); 
  } 
  fpeb.setListener(this); 
  fpeb.startEnrollment(mFingerprintManager); 
 } 
 private void postEnrollment(){ 
  if(mFingerprintManager != null){ 
   mFingerprintManager.postEnroll(); 
  } 
 } 
 private void stopFingerprint() { 
  if (fpeb != null){ 
   fpeb.cancelEnrollment(); 
   onStop(); 
  } 
 } 
 @Override 
 protected void onStart() { 
  super.onStart(); 
 } 
 @Override 
 protected void onStop() { 
  super.onStop(); 
  if(fpeb != null){ 
   fpeb.setListener(null); 
  } 
 } 
 @Override 
 protected void onResume() { 
  super.onResume(); 
  if(mFingerprintManager == null){ 
   mFingerprintManager = (FingerprintManager) getActivity().getSystemService( 
    Context.FINGERPRINT_SERVICE); 
  } 
  startEnrollment(); 
 } 
 @Override 
 protected void onPause() { 
  super.onPause(); 
  postEnrollment(); 
  mFingerprintManager = null; 
  stopFingerprint(); 
  fpeb = null; 
 } 
 class MyHandler extends Handler{ 
  @Override 
  public void handleMessage(Message msg) { 
   Bundle bundle = null; 
   super.handleMessage(msg); 
   switch (msg.what) { 
   case 0: 
    removeMessages(0); 
    bundle = msg.getData(); 
    String result = bundle.getString("result"); 
    selfTestView.setText(result); 
    selfTestView.setTextColor(result.contains("PASS")?Color.GREEN:Color.RED); 
    break; 
   case 1: 
    removeMessages(1); 
    bundle = msg.getData(); 
    String rs = bundle.getString("result"); 
    checkBroadView.setText(bundle.getString("result")); 
    checkBroadView.setTextColor(rs.contains("PASS")?Color.GREEN:Color.RED); 
    break; 
   case 2: 
    removeMessages(2); 
    bundle = msg.getData(); 
    String fingerprint = bundle.getString("result"); 
    fingerPrintAcquisitionTextView.setText(bundle.getString("result")); 
    fingerPrintAcquisitionTextView.setTextColor(fingerprint.contains("PASS")?Color.GREEN:Color.WHITE); 
    mButtonSelftest.setEnabled(true); 
    mButtonCheckerboardTest.setEnabled(true); 
    break; 
   case 3: 
    removeMessages(3); 
    bundle = msg.getData(); 
    String enrollmentHelp = bundle.getString("result"); 
    fingerPrintEnrollmentHelpView.setText(bundle.getString("result")); 
    break; 
   case 4: 
    removeMessages(4); 
    bundle = msg.getData(); 
    String enrollmentError = bundle.getString("result"); 
    fingerPrintEnrollmentErrorView.setText(bundle.getString("result")); 
    fingerPrintAcquisitionTextView.setText(""); 
    break; 
   default: 
    break; 
   } 
  } 
 } 
} 
您可能感兴趣的文章:Android指纹识别功能Android6.0指纹识别开发实例详解Android指纹识别功能深入浅出分析到实战(6.0以下系统解决方案)Android 指纹识别开发实例Android 6.0指纹识别App开发案例android 指纹识别调用实现方法及示例代码Android 指纹识别详解及实现方法Android中的指纹识别demo开发实例Android指纹识别api初试Android指纹识别认识和基本使用详解


--结束END--

本文标题: Android6.0指纹识别开发案例

本文链接: https://www.lsjlt.com/news/24017.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 利用Android6.0怎么实现一个指纹识别功能
    本篇文章为大家展示了利用Android6.0怎么实现一个指纹识别功能,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。Android6.0指纹识别开发实例详解谷歌在android6.0及以上版本对指纹识...
    99+
    2023-05-31
    android roi
  • win7指纹识别步骤操作图例
      随着大家对计算机信息安全的的重视程度日益提高,给 Windows 帐户配置一个强壮的密码几乎成为了每个用户的标准配置,但复杂而冗长的密码字符串往往难以记忆,遇到遗忘密码的状况就会严重影响用户对计算机的使用体验。指纹识...
    99+
    2023-05-30
    win7 指纹识别 步骤
  • Ubuntu14.04中怎么设置指纹识别登
    本篇文章给大家分享的是有关Ubuntu14.04中怎么设置指纹识别登,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。首先更新一下系统更新包:在终端中输入:sudo apt-get...
    99+
    2023-06-13
  • 指纹识别解锁OUT了!Windows 10生物识别来了
    Windows 10的生物识别安全机制在新近曝光的Build 10125版本中得到确认。现在,国外媒体分享了该功能的操作演示。 据了解,Windows 10的生物识别安全功能名为“Windows Hello&...
    99+
    2023-06-15
    指纹识别 生物识别 OUT Windows 10生物
  • 教你如何设置Win7指纹识别
    如今很多笔记本电脑上都配备了指纹识别器,通过扫描指纹来代替输入密码就方便多了。以往我们需要安装第三方应用才能正常使用指纹识别,而在Win7中,系统对指纹识别设备提供了内置支持,不用再安装任何第三方应用,就可以在Win7中...
    99+
    2023-05-26
    Win7 指纹识别
  • Web服务器指纹识别工具httprint
    Web服务器指纹识别工具httprint...
    99+
    2023-06-04
  • 指纹识别综述(3): 特征提取
    本文主要基于《Handbook of Fingerprint Recognition》第三版第三章“Fingerprint Analysis and Representation”的内容。本文会不...
    99+
    2023-09-07
    指纹识别 图像处理 计算机视觉 人工智能
  • 找不到支持windows hello指纹的指纹识别器如何解决
    本篇内容主要讲解“找不到支持windows hello指纹的指纹识别器如何解决”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“找不到支持windows hello...
    99+
    2023-02-23
    windows
  • win10指纹识别登入Windows hello演示视频
    win10指纹识别登入Windows hello是微软研发的一个比传统密码更加安全的一项登入操作,下文小编就为大家奉上win10指纹识别登入Windows hello演示视频,感兴趣的小伙伴一起跟小编去下文看看吧。   ...
    99+
    2023-06-15
    win10 指纹 指纹识别 视频 演示 Windows hello
  • windows11找不到指纹识别器如何解决
    如果您的电脑升级到了Windows 11,但无法找到指纹识别器,请尝试以下解决方法:1. 检查硬件兼容性:确保您的电脑硬件支持指纹识...
    99+
    2023-09-12
    windows11
  • 微信小程序中如何实现指纹识别功能
    这篇文章主要为大家展示了“微信小程序中如何实现指纹识别功能”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“微信小程序中如何实现指纹识别功能”这篇文章吧。以下为测试...
    99+
    2024-04-02
  • Web应用程序指纹识别工具BlindElephant是什么意思
    Web应用程序指纹识别工具BlindElephant是什么意思,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。Web应用程序指纹识别工具BlindElephantBlindEle...
    99+
    2023-06-04
  • matlab GUI指纹识别门禁系统介绍及源码实现
    目录引言一、指纹识别简介1 指纹识别系统的构成2 指纹识别系统的实现2.1 指纹图像的采集2.2 指纹图像的预处理2.3 指纹图像特征提取2.4 指纹图像匹配二、部分源代码三、运行结...
    99+
    2024-04-02
  • c# 圆形识别方案和直线识别方案的参考示例
    目录圆形识别方案直线识别方案圆形识别方案 识别流程 判断是否为封闭图形; 根据圆的方程,取输入点集中的1/6、3/6、5/6处的三个点,求得圆的方程,获取圆心及半径; ...
    99+
    2024-04-02
  • Android 实例开发基于ArcSoft实现人脸识别
    目录效果图激活引擎第一步配置APP_ID和SDK_KEY第二步:判断是否添加动态链接库(so文件与jar包)第三步:判断是否申明所有权限人脸比对 1:N第一步:初始化本地人脸库第二步...
    99+
    2024-04-02
  • 2016年夏季版Win10 Mobile一周年更新将新增指纹识别
    根据微软WinHEC大会消息,微软将在2016年夏季对Win10 Mobile手机产品增加指纹识别支持。这项功能加入后,Windows 10 Mobile一周年更新版对于Windows Hello的支持将包含虹膜和指纹识...
    99+
    2023-05-20
    Win10
  • Win10指纹识别功能Windows Hello怎么用?多图演示使用方法
    Windows 10的生物识别安全机制在新近曝光的Build 10125版本中得到确认。现在,国外媒体分享了该功能的操作演示。据了解,Windows 10的生物识别安全功能名为“Windows Hello&r...
    99+
    2023-06-15
    win10 指纹识别 windows指纹识别 演示 功能 使用 指纹识别
  • Go后端开发:入门指南与实战案例
    go 后端开发入门指南:安装并设置 go 语言环境。编写第一个后端服务,定义处理请求的函数并启动 http 服务器。集成 mysql 数据库,创建模型、连接数据库并执行查询。 Go 后...
    99+
    2024-04-08
    go 后端开发 mysql
  • 人脸识别具体案例(李智恩)
    项目环境:python3.6 一、项目结构 二、数据集准备 数据集准备分为两步: 获取图片. 提取人脸. 1、获取图片 首先可以利用爬虫,从百度图片上批量下载...
    99+
    2024-04-02
  • YOLOv5车牌识别案例代码分析
    本文小编为大家详细介绍“YOLOv5车牌识别案例代码分析”,内容详细,步骤清晰,细节处理妥当,希望这篇“YOLOv5车牌识别案例代码分析”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。1 目标检测概念目标检测是计算...
    99+
    2023-07-05
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作