Android 指纹功能实例代码

所属分类: 软件编程 / Android 阅读数: 30
收藏 0 赞 0 分享

最近在做项目的时候遇到了添加打开app图像解锁的功能,自己嘴欠说现在都用指纹功能,自己给自己挖了一个坑,真是没谁了

从网上看了一些资料,但是给我demo考虑的不是很多,设备支不支持都没考虑,如果支持的话是否添加过指纹也不知道,其实方法都很简单。

废话不多说,贴上工具类和使用方法

package com.tsm.test;
import android.annotation.TargetApi;
import android.app.Activity;
import android.app.KeyguardManager;
import android.content.Context;
import android.content.Intent;
import android.os.Build;
import android.support.v4.hardware.fingerprint.FingerprintManagerCompat;
import android.support.v4.os.CancellationSignal;
/**
 * Created by tsm on 2017/3/20.
 * <p/>
 * 指纹识别功能
 *
 * 如果创建了该类的实例,必须调用  stopsFingerPrintListen 方法
 *
 * 添加权限
 * <uses-permission android:name="android.permission.USE_FINGERPRINT" />
 *
 */
public class FingerPrintUiHelper extends FingerprintManagerCompat.AuthenticationCallback {
  private final FingerPrintCallBack callback;
  private CancellationSignal signal;
  private FingerprintManagerCompat fingerprintManager;
  /**
   * 如果失败次数过多,调用系统的startActivityForResult
   * 这个是code
   */
  public static final int REQUEST_CODE_CONFIRM_DEVICE_CREDENTIALS = 10;
  /**
   * 用于提示用户还可以尝试几次,比较友好
   */
  private int count;
  /**
   * 控制是否开启过指纹功能
   */
  public boolean isStartFinger;
  /**
   * 初始化指纹功能
   * @param activity
   * @param callback
   */
  public FingerPrintUiHelper(Activity activity, FingerPrintCallBack callback) {
    this.callback = callback;
    signal = new CancellationSignal();
    fingerprintManager = FingerprintManagerCompat.from(activity);
    isStartFinger = false;
    if (!fingerprintManager.isHardwareDetected()) {
      if (callback != null)
        callback.doNotSupportFinger();
      return;
    }
    if (!fingerprintManager.hasEnrolledFingerprints()) {
      if (callback != null)
        callback.FingerClosed();
    }
  }
  /**
   * 开始扫描指纹
   */
  public void startFingerPrintListen() {
    count = 5;
    isStartFinger = true;
    fingerprintManager.authenticate(null, 0, signal, this, null);
  }
  /**
   * 初始化未必调用 startFingerPrintListen
   * 所以添加变量控制
   */
  public void stopsFingerPrintListen() {
    if (isStartFinger) {
      if (signal != null && !signal.isCanceled()) {
        signal.cancel();
      }
    }
  }
  /**
   * 识别成功
   * @param result
   */
  @Override
  public void onAuthenticationSucceeded(FingerprintManagerCompat.AuthenticationResult result) {
    if (callback != null)
      callback.onAuthenticationSucceeded();
  }
  /**
   * 识别失败
   */
  @Override
  public void onAuthenticationFailed() {
    count--;
    if (count > 0) {
      if (callback != null)
        callback.onAuthenticationFailed(count);
      return;
    }
  }
  /**
   * 有错误
   * @param errMsgId
   * @param errString
   */
  @Override
  public void onAuthenticationError(int errMsgId, CharSequence errString) {
    if (errMsgId == 5) {
      if (callback != null)
        callback.FingerClosed();
      return;
    }
    if (errMsgId == 7) {
      if (callback != null)
        callback.onAuthenticationError();
      return;
    }
  }
  /**
   * 多次调用指纹识别失败后,调用此方法
   *
   * @param activity
   */
  @TargetApi(Build.VERSION_CODES.LOLLIPOP)
  public static void jumpToGesturePassCheck(Activity activity) {
    KeyguardManager keyguardManager =
        (KeyguardManager) activity.getSystemService(Context.KEYGUARD_SERVICE);
    Intent intent =
        keyguardManager.createConfirmDeviceCredentialIntent("finger", "测试指纹识别");
    activity.startActivityForResult(intent, REQUEST_CODE_CONFIRM_DEVICE_CREDENTIALS);
  }
  interface FingerPrintCallBack {
    /**
     * 识别成功
     */
    void onAuthenticationSucceeded();
    /**
     * 识别失败
     *
     * @param count 还可以尝试的次数
     * @param count
     */
    void onAuthenticationFailed(int count);
    /**
     * 失败次数过多
     */
    void onAuthenticationError();
    /**
     * 未开启指纹功能
     */
    void FingerClosed();
    /**
     * 不支持指纹功能
     */
    void doNotSupportFinger();
  }
}

这个是工具类,下面上使用方法

package com.tsm.test;
import android.app.Activity;
import android.content.Intent;
import android.os.Build;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;
public class MainActivity extends Activity implements FingerPrintUiHelper.FingerPrintCallBack {
  private FingerPrintUiHelper fingerPrintUiHelper;
  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {////指纹功能是23之后的版本才有的
      initFingerPrint();
      Button button = (Button) findViewById(R.id.button);
      assert button != null;
      button.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
          fingerPrintUiHelper.startFingerPrintListen();
        }
      });
      findViewById(R.id.btn).setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
          fingerPrintUiHelper.stopsFingerPrintListen();
        }
      });
    }
  }
  private void initFingerPrint() {
    fingerPrintUiHelper = new FingerPrintUiHelper(this, this);
  }
  @Override
  protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (requestCode == FingerPrintUiHelper.REQUEST_CODE_CONFIRM_DEVICE_CREDENTIALS) {
      // Challenge completed, proceed with using cipher
      if (resultCode == RESULT_OK) {
        Toast.makeText(this, "识别成功", Toast.LENGTH_SHORT).show();
//        jumpToMain2Activity();
      } else {
        Toast.makeText(this, "识别失败", Toast.LENGTH_SHORT).show();
      }
    }
  }
  @Override
  protected void onDestroy() {
    if (fingerPrintUiHelper != null)
      fingerPrintUiHelper.stopsFingerPrintListen();
    super.onDestroy();
  }
  /**
   * 成功
   */
  @Override
  public void onAuthenticationSucceeded() {
    Toast.makeText(this, "识别成功", Toast.LENGTH_SHORT).show();
  }
  @Override
  public void onAuthenticationFailed(int count) {
    String msg = "您还可以尝试%d次";
    Toast.makeText(this, String.format(msg, count), Toast.LENGTH_SHORT).show();
  }
  /**
   * 验证失败,走密码验证
   */
  @Override
  public void onAuthenticationError() {
    FingerPrintUiHelper.jumpToGesturePassCheck(this);
  }
 
  /**
  * 没有指纹功能
  */
  @Override
  public void FingerClosed() {
    //TODO 可以写一个Dialog跳转设置页,这里我就不写了
    Toast.makeText(this, "指纹功能已关闭", Toast.LENGTH_SHORT).show();
  }
  @Override
  public void doNotSupportFinger() {
  Log.i("info", "-------------doNotSupportFinger--------------------");
    Toast.makeText(this, "该设备不支持指纹功能", Toast.LENGTH_SHORT).show();
  }
 }

最后添加权限:

<uses-permission android:name="android.permission.USE_FINGERPRINT" />

以上所示是小编给大家介绍的Android 指纹功能实例代码,希望对大家有所帮助,如果大家有任何疑问欢迎给我留言,小编会及时回复大家的!

更多精彩内容其他人还在看

Android中加入名片扫描功能实例代码

这篇文章主要介绍了Android中加入名片扫描功能实例代码的相关资料,需要的朋友可以参考下
收藏 0 赞 0 分享

Android仿微信发表说说实现拍照、多图上传功能

这篇文章主要为大家详细介绍了Android仿微信发表说说实现拍照、多图上传功能,使用Retrofit2.0技术,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
收藏 0 赞 0 分享

设置Android系统永不锁屏永不休眠的方法

在进行Android系统开发的时候,有些特定的情况需要设置系统永不锁屏,永不休眠。本篇文章给大家介绍Android 永不锁屏,开机不锁屏,删除设置中休眠时间选项,需要的朋友一起学习吧
收藏 0 赞 0 分享

Android Retrofit 2.0框架上传图片解决方案

这篇文章主要介绍了Android Retrofit 2.0框架上传一张与多张图片解决方案,感兴趣的小伙伴们可以参考一下
收藏 0 赞 0 分享

Android自定义等待对话框

这篇文章主要为大家详细介绍了Android自定义等待对话框的实现方法,感兴趣的小伙伴们可以参考一下
收藏 0 赞 0 分享

Android中Window添加View的底层原理

这篇文章主要介绍了Android中Window添加View的底层原理,需要的朋友可以参考下
收藏 0 赞 0 分享

Android调用系统默认浏览器访问的方法

这篇文章主要介绍了Android调用系统默认浏览器访问的方法的相关资料,需要的朋友可以参考下
收藏 0 赞 0 分享

Android开发退出程序的方法汇总

Android程序有很多Activity,比如说主窗口A,调用了子窗口B,子窗口B又调用子窗口C,back返回子窗口B后,在B中如何关闭整个Android应用程序呢? 下面脚本之家小编就给大家介绍android开发退出程序的几种方法,感兴趣的朋友参考下吧
收藏 0 赞 0 分享

Android程序开发中单选按钮(RadioGroup)的使用详解

在android程序开发中,无论是单选按钮还是多选按钮都非常的常见,接下来通过本文给大家介绍Android程序开发中单选按钮(RadioGroup)的使用,需要的朋友参考下吧
收藏 0 赞 0 分享

Android实现仿网易今日头条等自定义频道listview 或者grideview等item上移到另一个view中

这篇文章主要介绍了Android实现仿网易今日头条等自定义频道listview 或者grideview等item上移到另一个view中 的相关资料,需要的朋友可以参考下
收藏 0 赞 0 分享
查看更多