分享

Android 指纹识别

 univasity 2017-03-14

Android 指纹识别的基本介绍

近期项目中有指纹识别的需求,没接触过,查阅API发现指纹识别是从Android 6.0新增的,也就是必须API版本至少要23以上,要通过指纹扫描验证用户身份,请获取新 FingerprintManager 类的实例,并调用 authenticate()方法。您的应用必须运行在带有指纹传感器的兼容设备上。您必须在应用中实现指纹身份验证流的用户界面,并在 UI 中使用标准 Android 指纹图标。

1.使用时必须首先判断API版本,先得到系统的API版本:

  1. minSdkVersion= Build.VERSION.SDK;    

2.判断设备是否支持指纹权限:

  1. manager = (FingerprintManager) getSystemService(Context.FINGERPRINT_SERVICE);    
  2. keyManager= (KeyguardManager) getSystemService(Context.KEYGUARD_SERVICE);    
  3. //硬件设备是否支持指纹解锁功能    
  4.         if (!manager.isHardwareDetected()) {    
  5.             Toast.makeText(getBaseContext(), "该手机不支持指纹解锁", Toast.LENGTH_SHORT).show();    
  6.             return false;    
  7.         }    


3.还有就是权限,这个也是6.0之后新增的权限:

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

4.接下来就是指纹识别了:
主要就是FingerprintManager.AuthenticationCallback的几个回调:
 onAuthenticateSuccess();
 onAuthenticateFailed();
 onAuthenticateError();

  1. manger.authenticate(cryptoObject, mCancellationSignal, 0, mAuthCallback, null);  
这里的四个参数分别是:
  1. 第一个参数是一个加密对象。这里的 CryptoObject 对象就是使用 Cipher 对象创建创建出来的:new FingerprintManager.CryptoObject(cipher)。
  2. 第二个参数是一个 CancellationSignal 对象,该对象提供了取消操作的能力。创建该对象也很简单,使用 new CancellationSignal() 就可以了。
  3. 第三个参数是一个标志,默认为0。
  4. 第四个参数是 AuthenticationCallback 对象,它本身是 FingerprintManager 类里面的一个抽象类。该类提供了指纹识别的几个回调方法,包括指纹识别成功、失败等。需要我们重写。
  5. 最后一个 Handler,可以用于处理回调事件,可以传null。

直接贴代码,大家参考一下:
  1. import android.Manifest;    
  2. import android.app.KeyguardManager;    
  3. import android.content.Context;    
  4. import android.content.Intent;    
  5. import android.content.pm.PackageManager;    
  6. import android.hardware.fingerprint.FingerprintManager;    
  7. import android.os.Bundle;    
  8. import android.os.CancellationSignal;    
  9. import android.support.v4.app.ActivityCompat;    
  10. import android.support.v4.app.FragmentActivity;    
  11. import android.util.Log;    
  12. import android.view.View;    
  13. import android.widget.Button;    
  14. import android.widget.Toast;    
  15.     
  16.     
  17.     
  18. public class MainActivity extends FragmentActivity {    
  19.     FingerprintManager manager;    
  20.     KeyguardManager mKeyManager;    
  21.     private final static int REQUEST_CODE_CONFIRM_DEVICE_CREDENTIALS = 0;    
  22.     private final static String TAG = "finger_log";    
  23.     
  24.     @Override    
  25.     protected void onCreate(Bundle savedInstanceState) {    
  26.         super.onCreate(savedInstanceState);    
  27.         setContentView(R.layout.activity_main);    
  28.         manager = (FingerprintManager) this.getSystemService(Context.FINGERPRINT_SERVICE);    
  29.         mKeyManager = (KeyguardManager) this.getSystemService(Context.KEYGUARD_SERVICE);    
  30.         Button btn_finger = (Button) findViewById(R.id.btn_activity_main_finger);    
  31.         btn_finger.setOnClickListener(new View.OnClickListener() {    
  32.             @Override    
  33.             public void onClick(View v) {    
  34.                 if (isFinger()) {    
  35.                     Toast.makeText(MainActivity.this, "请进行指纹识别", Toast.LENGTH_LONG).show();    
  36.                     Log(TAG, "keyi");    
  37.                     startListening(null);    
  38.                 }    
  39.             }    
  40.         });    
  41.     
  42.     }    
  43.     
  44.     public boolean isFinger() {    
  45.     
  46.         //android studio 上,没有这个会报错    
  47.         if (ActivityCompat.checkSelfPermission(this, Manifest.permission.USE_FINGERPRINT) != PackageManager.PERMISSION_GRANTED) {    
  48.             Toast.makeText(this, "没有指纹识别权限", Toast.LENGTH_SHORT).show();    
  49.             return false;    
  50.         }    
  51.         Log(TAG, "有指纹权限");    
  52.         //判断硬件是否支持指纹识别    
  53.         if (!manager.isHardwareDetected()) {    
  54.             Toast.makeText(this, "没有指纹识别模块", Toast.LENGTH_SHORT).show();    
  55.             return false;    
  56.         }    
  57.      Log(TAG, "有指纹模块");    
  58.         //判断 是否开启锁屏密码    
  59.     
  60.         if (!mKeyManager.isKeyguardSecure()) {    
  61.             Toast.makeText(this, "没有开启锁屏密码", Toast.LENGTH_SHORT).show();    
  62.             return false;    
  63.         }    
  64.         Log(TAG, "已开启锁屏密码");    
  65.         //判断是否有指纹录入    
  66.         if (!manager.hasEnrolledFingerprints()) {    
  67.             Toast.makeText(this, "没有录入指纹", Toast.LENGTH_SHORT).show();    
  68.             return false;    
  69.         }    
  70.        Log(TAG, "已录入指纹");    
  71.     
  72.         return true;    
  73.     }    
  74.     
  75.     CancellationSignal mCancellationSignal = new CancellationSignal();    
  76.     //回调方法    
  77.     FingerprintManager.AuthenticationCallback mSelfCancelled = new FingerprintManager.AuthenticationCallback() {    
  78.         @Override    
  79.         public void onAuthenticationError(int errorCode, CharSequence errString) {    
  80.             //但多次指纹密码验证错误后,进入此方法;并且,不能短时间内调用指纹验证    
  81.             Toast.makeText(MainActivity.this, errString, Toast.LENGTH_SHORT).show();    
  82.             showAuthenticationScreen();    
  83.         }    
  84.     
  85.         @Override    
  86.         public void onAuthenticationHelp(int helpCode, CharSequence helpString) {    
  87.     
  88.             Toast.makeText(MainActivity.this, helpString, Toast.LENGTH_SHORT).show();    
  89.         }    
  90.     
  91.         @Override    
  92.         public void onAuthenticationSucceeded(FingerprintManager.AuthenticationResult result) {    
  93.     
  94.             Toast.makeText(MainActivity.this, "指纹识别成功", Toast.LENGTH_SHORT).show();    
  95.         }    
  96.     
  97.         @Override    
  98.         public void onAuthenticationFailed() {    
  99.             Toast.makeText(MainActivity.this, "指纹识别失败", Toast.LENGTH_SHORT).show();    
  100.         }    
  101.     };    
  102.     
  103.     
  104.     public void startListening(FingerprintManager.CryptoObject cryptoObject) {    
  105.         //android studio 上,没有这个会报错    
  106.         if (ActivityCompat.checkSelfPermission(this, Manifest.permission.USE_FINGERPRINT) != PackageManager.PERMISSION_GRANTED) {    
  107.             Toast.makeText(this, "没有指纹识别权限", Toast.LENGTH_SHORT).show();    
  108.             return;    
  109.         }    
  110.         manager.authenticate(cryptoObject, mCancellationSignal, 0, mSelfCancelled, null);    
  111.     
  112.     
  113.     }    
  114.     
  115.     /**   
  116.      * 锁屏密码   
  117.      */    
  118.     private void showAuthenticationScreen() {    
  119.     
  120.         Intent intent = mKeyManager.createConfirmDeviceCredentialIntent("finger", "测试指纹识别");    
  121.         if (intent != null) {    
  122.             startActivityForResult(intent, REQUEST_CODE_CONFIRM_DEVICE_CREDENTIALS);    
  123.         }    
  124.     }    
  125.     
  126.     @Override    
  127.     protected void onActivityResult(int requestCode, int resultCode, Intent data) {    
  128.         if (requestCode == REQUEST_CODE_CONFIRM_DEVICE_CREDENTIALS) {    
  129.             // Challenge completed, proceed with using cipher    
  130.             if (resultCode == RESULT_OK) {    
  131.                 Toast.makeText(this, "识别成功", Toast.LENGTH_SHORT).show();    
  132.             } else {    
  133.                 Toast.makeText(this, "识别失败", Toast.LENGTH_SHORT).show();    
  134.             }    
  135.         }    
  136.     }    
  137.     
  138.     private void Log(String tag, String msg) {    
  139.         Log.d(tag, msg);    
  140.     }    
  141. }    

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多