Android M指纹的资料太少,经过一段时间阅读原生Android代码,写了以下例子,贡献出来给需要帮助的人。

以下内容基于64位的高通CPU,搭载fpc1020芯片,此部分代码在原生android上做了更改,以应付工厂指纹的测试。原生android指纹录入需要采集10次(因不同的芯片而定)。

代码简单说明:

1. FingerPrintEnrollBase类:

重要的是

Java代码

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指纹的采集流程图:

源码如下:

FingerPrintEnrollBase:

Java代码

/*

* Copyright (C) 2015 The Android Open Source Project

*

* Licensed under the Apache License, Version 2.0 (the "License");

* you may not use this file except in compliance with the License.

* You may obtain a copy of the License at

*

* http://www.apache.org/licenses/LICENSE-2.0

*

* Unless required by applicable law or agreed to in writing, software

* distributed under the License is distributed on an "AS IS" BASIS,

* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

* See the License for the specific language governing permissions and

* limitations under the License

*/

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;

/**

* local fragment to handle the state around fingerprint enrollment.

*/

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:

Java代码

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 指纹资料的整理,后续继续补充相关资料,谢谢大家对本站的支持!

android指纹java_Android相关推荐

  1. android指纹fingerprint学习总结

    文章目录 android指纹的软件框图 android指纹的软件框图 录入指纹enroll和验证指纹verify的流程: 当手指按到指纹模组上后,指纹模组产生一个中断,在指纹的linux driver ...

  2. Android指纹识别

    Android指纹识别 原文:Android指纹识别 上一篇讲了通过FingerprintManager验证手机是否支持指纹识别,以及是否录入了指纹,这里进行指纹的验证. //获取Fingerprin ...

  3. Android 指纹相关调研

    Android 指纹相关调研 背景:公司产品同学提出要接入指纹,用于登录场景,提高转化率,由于之前没接触过指纹,接下来就是指纹的相关调查. 一:指纹的优势 我们传统的登录方式,需要用户输入用户名和密码 ...

  4. android指纹解锁_Android指纹锁

    android指纹解锁 In this tutorial, we'll be discussing the Android Fingerprint API and implement a Finger ...

  5. android 指纹添加_如何将手势添加到Android手机的指纹扫描仪

    android 指纹添加 So you have a shiny new Android phone, equipped with a security-friendly fingerprint sc ...

  6. android指纹识别开发公司,FingerDemo实现Android指纹识别

    FingerDemo 指纹识别 最近在研究android的指纹,因为做的项目是金融类,所有想要把指纹添加到项目中, 但是Android手机有很多种类,有些有指纹,有些没有指纹.这就需要各种判断了. 1 ...

  7. Android指纹识别,提升APP用户体验,从这里开始

    本文由 左海龙 授权投稿 原文链接:https://blog.csdn.net/hailong0529/article/details/95406183 写在前面 指纹识别大家都不陌生,现在比较新的安 ...

  8. 如何实现Android指纹登录

    一.概述 指纹识别通过指纹传感器采集信息,进行指纹图像的预处理,然后进行特征点提取,最后进行特征匹配.一般指纹识别的用途有:系统解锁.应用锁.支付认证.普通的登录认证. 指纹识别两种场景 本地识别:在 ...

  9. android指纹识别源码

    随着科技的进步,不仅是软件方面,安卓系统在硬件发展上也有了日新月异的发展.2015年下半年出的安卓手机基本上都带指纹识别功能,不管是炒得很热的360奇酷手机.魅族手机,还是"中华酷联&quo ...

最新文章

  1. 使用程序解决一道逻辑推理题
  2. some requirement checks failed
  3. string来存放二进制数据
  4. Linux中find命令详解
  5. SAP Knowledge Article TREX search determination
  6. java 数据截断_java – 数据截断:第1行的列’标志’的数据太长
  7. python 正整数 连续多个数之和_vijos - P1302连续自然数和 (公式推导 + python)
  8. 曲线连接线_荷重位移曲线仪操作使用注意事项-荷重位移曲线仪厂家
  9. 60-100-030-使用-Docker MySQL 8 主从复制
  10. 牛顿下山法python_一文看懂牛顿法(附Python实现)
  11. hibernate one2one 唯一外键关联(双向关联)
  12. 如何基于数据快速构建用户模型(Persona)?
  13. 使用Requests+xpath实现简单的数据爬取
  14. python类使用异步_异步Python类
  15. FOC之PI控制的理解
  16. SPSS怎么筛选无效数据
  17. 机器学习练习 6 - Support Vector Machines(支持向量机)
  18. 江西游——动物昆虫世界
  19. vscode设置 pylint把违反了编码风格标准的提示信息忽略掉,就是Variable name “**“ doesn‘t conform to snake_case naming
  20. A Survey on Malicious Domains Detection through DNS Data Analysis

热门文章

  1. Java 输出当前目录
  2. Redis的基础事务
  3. java写一个类吧,能不能自己写个java自带的类
  4. 乘基取整法是什么_数字逻辑电路-学习指南
  5. flowjo软件使用方法_管家婆软件使用方法出库教程,管家婆软件做账流程视频_双全科技...
  6. 李沐老师《动手学深度学习》课程总结1
  7. opencv源码查看
  8. ubuntu Django项目后台不挂断运行之screen命令
  9. SyntaxError: ‘return‘ outside function 在python里面的报错问题
  10. 引入外部js如何通知页面其编码格式