Android指纹识别API初试

作者:Fndroid 时间:2023-01-15 20:16:11 

在android6.0之后谷歌对指纹识别进行了官方支持,今天还在放假,所以就随意尝试了一下这个api,但是遇到了各种各样的问题
 ①在使用FingerPrintManager这个类实现的时候发现了很多问题,这个类里面的一些函数是被hide了的,也就是我们不能调用,比如enroll(),也就是说,当前的官方支持其实是有限的,我们能读取到本机已经存在的指纹(用于解锁的),然后验证这些指纹,但是不能让用户在app使用的时候录入一个指纹,用于app的其他功能,这个是一个缺陷吧目前来说,下面的图也是展示了识别一个可以用来解锁的指纹的功能。
 ②使用FingerPrintManager的时候会遇到要在应用中判断权限的问题,不清楚是因为android M要求的还是api需要,调用的时候也没有反应,既没有功能,也没有提示给予权限,原因有待查证。
 ③在一顿尝试无果之后发现了两个特别的类,一个叫做FingerPrintManagerCompat,这是一个兼容的FingerPrint操作类,还有一个类似的叫做FingerPrintManagerCompatApi23,使用这两个类也能实现到识别指纹的功能,但是也是有局限的,如①所说的。这两个类都能实现这个效果,但是需要API Level 23,如果达不到不会报错,这些类会什么都不做。
展示图,因为没有真机,所以只能用模拟器调试一下,这里也只能用官方的,Genymotion免费版貌似不能模拟指纹: 

Android指纹识别API初试

直接上代码:


public class MainActivity extends AppCompatActivity implements View.OnClickListener {
private static final String TAG = "MainActivity";
private Button check;
private FingerprintManagerCompat manager;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

check = (Button) findViewById(R.id.btn_check);

check.setOnClickListener(this);

// 获取一个FingerPrintManagerCompat的实例
manager = FingerprintManagerCompat.from(this);
}

@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.btn_check:
/**
 * 开始验证,什么时候停止由系统来确定,如果验证成功,那么系统会关系sensor,如果失败,则允许
 * 多次尝试,如果依旧失败,则会拒绝一段时间,然后关闭sensor,过一段时候之后再重新允许尝试
 *
 * 第四个参数为重点,需要传入一个FingerprintManagerCompat.AuthenticationCallback的子类
 * 并重写一些方法,不同的情况回调不同的函数
 */
manager.authenticate(null, 0, null, new MyCallBack(), null);
break;
}
}

public class MyCallBack extends FingerprintManagerCompat.AuthenticationCallback {
private static final String TAG = "MyCallBack";

// 当出现错误的时候回调此函数,比如多次尝试都失败了的时候,errString是错误信息
@Override
public void onAuthenticationError(int errMsgId, CharSequence errString) {
Log.d(TAG, "onAuthenticationError: " + errString);
}

// 当指纹验证失败的时候会回调此函数,失败之后允许多次尝试,失败次数过多会停止响应一段时间然后再停止sensor的工作
@Override
public void onAuthenticationFailed() {
Log.d(TAG, "onAuthenticationFailed: " + "验证失败");
}

@Override
public void onAuthenticationHelp(int helpMsgId, CharSequence helpString) {
Log.d(TAG, "onAuthenticationHelp: " + helpString);
}

// 当验证的指纹成功时会回调此函数,然后不再监听指纹sensor
@Override
public void onAuthenticationSucceeded(FingerprintManagerCompat.AuthenticationResult
   result) {
Log.d(TAG, "onAuthenticationSucceeded: " + "验证成功");
}
}

}

有朋友提出了问题,这里记录下:
如何让失败或者成功之后Sensor继续保持监听新的指纹?
 答:因为API较新的缘故,这个兼容的Manager类还不能做到自动重启的功能,但是我们可以自己写一个。因为Api中规定了如果回调了Error或者Succeed方法之后,sensor会被关闭,直到下一次重新调用authenticate方法授权,但是我们不能在Error或Succeed直接调用这个方法,因为处于安全性的考虑,不允许开发者短时间内连续授权,经过粗略的测试,android允许我们在30s之后重新打开Sensor授权监听,所以我们要做的,就是通过Handler的sendMessageDelayed方法发送一个延迟的消息,再在Handler中重新调用authenticate方法,具体的代码如下: 


private Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
Log.d(TAG, "handleMessage: 重启指纹模块");
manager.authenticate(null, 0, null, new MyCallBack(), handler);
}
};

@Override
public void onAuthenticationError(int errMsgId, CharSequence errString) {
handler.sendMessageDelayed(new Message(), 1000 * 30);
Log.d(TAG, "onAuthenticationError: " + errString);
}

@Override
public void onAuthenticationSucceeded(FingerprintManagerCompat.AuthenticationResult result) {
handler.sendMessageDelayed(new Message(), 1000 * 30);
Log.d(TAG, "onAuthenticationSucceeded: " + "验证成功");
}
标签:Android,指纹识别
0
投稿

猜你喜欢

  • java如何从不规则的字符串中截取出日期

    2022-05-28 02:33:58
  • Java经典面试题最全汇总208道(四)

    2023-11-08 23:59:26
  • C++在vscode中的多文件编程问题解读

    2021-06-14 13:37:04
  • java开发线上事故理解RocketMQ异步精髓

    2023-07-25 07:41:20
  • springboot项目以jar包运行的操作方法

    2023-11-10 07:47:43
  • Java实现画图 给图片底部添加文字标题

    2023-03-28 23:23:06
  • Android实现简单的分批加载ListView

    2023-10-28 14:49:21
  • Spring mvc Json处理实现流程代码实例

    2023-07-14 21:31:06
  • Android 官推 kotlin-first 的图片加载库——Coil的使用入门

    2022-07-06 00:53:34
  • Java传入用户名和密码并自动提交表单实现登录到其他系统的实例代码

    2023-09-20 00:40:46
  • CentOS 7系统下配置自定义JDK的教程

    2022-02-27 13:46:26
  • 在web.config和app.config文件中增加自定义配置节点的方法

    2021-11-03 03:21:41
  • Java中五种不同方法的创建对象

    2021-07-25 01:11:37
  • 修改idea的这些启动参数,令你的idea健步如飞

    2021-11-14 14:48:11
  • Android四种数据存储的应用方式

    2023-07-25 05:01:06
  • Flutter Android端启动白屏问题的解决

    2023-10-14 12:03:27
  • Java语言实现Blowfish加密算法完整代码分享

    2023-11-02 21:30:07
  • c++难以发现的bug(有趣)

    2022-01-27 17:01:41
  • C#自定义RSA加密解密及RSA签名和验证类实例

    2023-08-08 17:48:11
  • Java深入讲解异常处理try catch的使用

    2023-11-04 13:00:32
  • asp之家 软件编程 m.aspxhome.com