android指纹java_Android

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

15749c37bba941aafb30e8590e8da9cb.png

源码如下:

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/574652.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

about-ie下模拟input file上传功能失效

Q:IE9下file提交到iframe中,load一直不触发,其他高级浏览器均无此问题 解决方案:不使用js模拟 input click事件,取而代之的是把真实的input设置为要触发元素的大小,进行触发onchange原因分析:低…

java把收集的数据节点_java面试题收集(04)

1、rebbitmq的使用场景有哪些?(1)单发送单接受使用场景:简单的发送与接受,没有特别的处理。(2)单发送多接受使用场景:一个发送端,多个接收端,如分布式的任务发布,要保证消息发送的可靠性&#x…

go java gc_图解Golang的GC垃圾回收算法

虽然Golang的GC自打一开始,就被人所诟病,但是经过这么多年的发展,Golang的GC已经改善了非常多,变得非常优秀了。以下是Golang GC算法的里程碑:v1.1 STWv1.3 Mark STW, Sweep 并行v1.5 三色标记法v1.8 hybrid write bar…

java wps linux 安装_ubuntu安装Java开发环境

1. 从sun主页JDK for Linux版本。这里的是jdk-6u6--i586.bin.2. 用root用户登录ubuntu,或是在普通用户下用su命令切换用户。切换到所需的安装目录。类型:cd 例如,要在 /usr/java/ 目录中 安装软件,请键入:cd /usr…

考研复试考java_2019考研复试经验帖:过来人谈5件“小事”

关于复试,决定这你的命运,考生一定要好好把握。关于复试,你做好前期功课,足够了解了吗?下面新东方在线分享一位过来人的经验之谈,给大家最走心的忠告~~▶先来说说复试规则。在复试之前学校会公布学校的复试分数线&…

Hadoop2源码分析-RPC机制初识

1.概述 上一篇博客,讲述Hadoop V2的序列化机制,这为我们学习Hadoop V2的RPC机制奠定了基础。RPC的内容涵盖的信息有点多,包含Hadoop的序列化机制,RPC,代理,NIO等。若对Hadoop序列化不了解的同学&#xff0c…

贪心 BestCoder Round #39 1001 Delete

题目传送门 1 /*2 贪心水题:找出出现次数>1的次数和res,如果要减去的比res小,那么总的不同的数字tot不会少;3 否则再在tot里减去多余的即为答案4 用set容器也可以做,思路一样5 */6 #include &l…

在ubuntu上搭建开发环境9---Ubuntu删除ibus出现的问题及解决

删除 ibus输入法:  sudo apt-get install ibus 我们会遇到下面的问题 Ubuntu 14.04 系统设置很多选项消失。 其实遇到这个问题的一个最主要的原因是之前执行过卸载ibus输入法的操作,所以为了避免这个问题请不要卸载ibus输入法,大家依然可以…

HDU 3951 (博弈) Coin Game

先考虑两种简单的情况: 如果先手能一次把硬币拿完,即 k > n ,那么先手胜如果每次只能拿一个硬币, 即 k 1 ,那么如果有奇数个硬币先手胜,如果有偶数个硬币后手胜。剩下的情况就是先手一次拿不完&#xf…

顺序表的插入与删除java_C++实现顺序表的常用操作(插入删出查找输出)

实现顺序表的插入,删除,查找,输出操作在C语言中经常用到。下面小编给大家整理实现代码,一起看下吧代码如下所示:#includeusing namespace std;#define MAXSIZE 15typedef int DataType;typedef struct{DataType data[M…

Android实例-手机安全卫士(三十六)-根据Service是否开启确定CheckBox选中状态

一、目标 1、根据service是否在后台运行情况来确定CheckBox的选中状态; 2、解决"设置中心"的“开启来电号码显示归属地”功能在退出程序再进入时选中状态消失,在任务管理器中关闭“来显”服务时,功能仍为选中状态 二、代码实现 1、…

HTTP - PUT 上传文件/Shell

今天遇到几个PUT上传的点,但是都没利用起来。一怒之下,在自己本地试了一下。步骤如下: 一、环境: 首先,根据 配置Apache服务器支持向目录PUT文件 更新一下httpd.conf文件,重启所有服务。 二、HTTP - PUT PU…

Pro Android学习笔记(三三):Menu(4):Alternative菜单

什么是Alternative menu(替代菜单) 举个例子,Activity显示一个文本文件。如果用户想对文本文件进行编辑,Activity不提供编辑能力,但可由其他activity或者其他应用提供。我们将相关信息存储在一个intent中,例…

java实现手机开关机_Android 系统重启与关机:Java 代码实现

粘贴一篇关于权限的文章:最近在做个东西,巧合碰到了sharedUserId 的问题,所以收集了一些资料,存存档备份。安装在设备中的每一个apk文件,Android 给每个 APK 进程分配一个单独的用户空间,其 manifest 中的 userid 就是…

java数据类型的站位_Java 数据类型在实际开发中应用

在前边的文章中,我已经介绍了Java核心的容器IO等,现在我来说一下java中的数据类型。在java中,一切东西皆为对象(这句话意思是java中绝大数情况都用对象),极少数不是对象的,也存在与之对应的对象(比如基本数据类型存在与…

java amf3_Java AMF3 反序列化漏洞分析

写在前面的话AMF(Action Message Format)是一种二进制序列化格式,之前主要是Flash应用程序在使用这种格式。近期,Code White发现有多个Java AMF库中存在目前,漏洞相关信息已上报至美国CERT(详情请参考美国CERT VU#307983)概述目前&#xff0c…

php修改js内容,js怎样修改html元素的内容?HTML DOM实现修改内容

js怎样修改html元素的内容?本章就给大家介绍在js中利用HTML DOM是怎样修改html元素内容的。有一定的参考价值,有需要的朋友可以参考一下,希望对你们有所帮助。首先我们要了解HTML DOM是什么?HTML DOM的作用是什么?HTML…

java中的删除函数的使用方法,如何用Java删除文件

本文概述有两种删除Java文件的方法:使用File.delete()方法使用File.deleteOnExit()方法Java File.delete()方法在Java中, 我们可以使用File类的File.delete()方法删除文件。 delete()方法删除由抽象路径名表示的文件或目录。如果路径名是目录, 则该目录必须为空才能…

C#开发微信门户及应用(28)--微信“摇一摇·周边”功能的使用和接口的实现

C#开发微信门户及应用(28)--微信“摇一摇周边”功能的使用和接口的实现 原文:C#开发微信门户及应用(28)--微信“摇一摇周边”功能的使用和接口的实现”摇一摇周边“是微信提供的一种新的基于位置的连接方式。用户通过“摇一摇”的“周边”页卡,可以与线下商户进行互…

【计算几何】点在多边形内部

问题描述:已知点P(x,y)和多边形Poly,判断点P(x,y)是否在多边形内部。 基本方法:射线法 以点P为端点,向左方作射线L,由于多边形是有界的,所以射线L的左端一定在多边形外部,考虑沿着L从无究远处开…