博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Android 6.0+指纹识别心得
阅读量:6951 次
发布时间:2019-06-27

本文共 9628 字,大约阅读时间需要 32 分钟。

hot3.png

Android 6.0+Fingerprint心得

 

 

具体实现:实现某个功能模块我认为最有效的方法就是找到该功能模块的启动方法(看别人代码我认为很有效的方法),然后逆推看明白整个工作流程。千万不要盲目的从第一行代码慢慢的一行一行的看,这样效率会很低,也很乏味。步入正题,先找到Fingerprint的启动方法:

/*Request authentication of a crypto object. This call  warms up the fingerprint hardware and starts scanning for a fingerprint. It terminates when onAuthenticationError(int, CharSequence) or {@link AuthenticationCallback#onAuthenticationSucceeded(AuthenticationResult) is called, at which point the object is no longer valid. The operation can be canceled by using the provided cancel object.*/public void authenticate (FingerprintManagerCompat.CryptoObject crypto,                 int flags,                 CancellationSignal cancel,                 FingerprintManagerCompat.AuthenticationCallback callback,                 Handler handler)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

这个方法是FingerprintManagerCompat类的公有方法,然后想办法把这个方法需要的几个参数给他,最后在调用他,这个功能大体就实现了;嗯,中间当然还有一些细节需要注意,比如如何实例化那几个类,可不可以传null之类的。下面给出我demo的具体代码,大家挑重要的看,然后按我说的方法看(这个方法authenticate着手哦),试试效果。 

AndroidManifest.xml

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24

MainActivity

package com.contacts.lhj.myfingerprinttest;import android.annotation.TargetApi;import android.app.KeyguardManager;import android.content.Context;import android.content.Intent;import android.os.Build;import android.os.Bundle;import android.support.v4.hardware.fingerprint.FingerprintManagerCompat;import android.support.v7.app.AppCompatActivity;import android.support.v7.widget.AppCompatButton;import android.view.View;import android.widget.Toast;public class MainActivity extends AppCompatActivity {    private final int REQUEST_CODE_CONFIRM_DEVICE_CREDENTIALS = 0;    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) {            initFingerPrint();            AppCompatButton button = (AppCompatButton) findViewById(R.id.button);            assert button != null;            button.setOnClickListener(new View.OnClickListener() {                @Override                public void onClick(View v) {                    jumpToGesturePassCheck();                }            });        } else {            jumpToMain2Activity();        }    }    private void jumpToMain2Activity() {        Intent intent = new Intent(MainActivity.this, Main2Activity.class);        startActivity(intent);        finish();    }    /**     * 跳转到手势密码校验界面     */    @TargetApi(Build.VERSION_CODES.LOLLIPOP)    private void jumpToGesturePassCheck() {        KeyguardManager keyguardManager =                (KeyguardManager) getSystemService(Context.KEYGUARD_SERVICE);        Intent intent =                keyguardManager.createConfirmDeviceCredentialIntent("finger", "测试指纹识别");        fingerPrintUiHelper.stopsFingerPrintListen();        startActivityForResult(intent, REQUEST_CODE_CONFIRM_DEVICE_CREDENTIALS);    }    private void initFingerPrint() {        fingerPrintUiHelper = new FingerPrintUiHelper(this);        fingerPrintUiHelper.startFingerPrintListen(new FingerprintManagerCompat.AuthenticationCallback() {            /**             * Called when a fingerprint is recognized.             *             * @param result An object containing authentication-related data             */            @Override            public void onAuthenticationSucceeded(FingerprintManagerCompat.AuthenticationResult result) {                Toast.makeText(MainActivity.this, "指纹识别成功", Toast.LENGTH_SHORT).show();                jumpToMain2Activity();            }            /**             * Called when a fingerprint is valid but not recognized.             */            @Override            public void onAuthenticationFailed() {                Toast.makeText(MainActivity.this, "指纹识别失败", Toast.LENGTH_SHORT).show();            }            /**             * Called when a recoverable error has been encountered during authentication. The help             * string is provided to give the user guidance for what went wrong, such as             * "Sensor dirty, please clean it."             *             * @param helpMsgId  An integer identifying the error message             * @param helpString A human-readable string that can be shown in UI             */            @Override            public void onAuthenticationHelp(int helpMsgId, CharSequence helpString) {                Toast.makeText(MainActivity.this, helpString, Toast.LENGTH_SHORT).show();            }            /**             * Called when an unrecoverable error has been encountered and the operation is complete.             * No further callbacks will be made on this object.             *             * @param errMsgId  An integer identifying the error message             * @param errString A human-readable error string that can be shown in UI             */            @Override            public void onAuthenticationError(int errMsgId, CharSequence errString) {                //但多次指纹密码验证错误后,进入此方法;并且,不能短时间内调用指纹验证                Toast.makeText(MainActivity.this, "errMsgId=" + errMsgId + "|" +                        errString, Toast.LENGTH_SHORT).show();                if (errMsgId == 7) { //出错次数过多(小米5测试是5次)                    jumpToGesturePassCheck();                }            }        });    }    @Override    protected void onActivityResult(int requestCode, int resultCode, Intent data) {        if (requestCode == 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();            }        }    }}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103
  • 104
  • 105
  • 106
  • 107
  • 108
  • 109
  • 110
  • 111
  • 112
  • 113
  • 114
  • 115
  • 116
  • 117
  • 118
  • 119
  • 120
  • 121
  • 122
  • 123
  • 124
  • 125
  • 126
  • 127

FingerPrintUiHelper

package com.contacts.lhj.myfingerprinttest;import android.app.Activity;import android.support.v4.hardware.fingerprint.FingerprintManagerCompat;import android.support.v4.os.CancellationSignal;/** * Small helper class to manage text/icon around fingerprint authentication UI. */public class FingerPrintUiHelper {    private CancellationSignal signal;    private FingerprintManagerCompat fingerprintManager;    public FingerPrintUiHelper(Activity activity) {        signal = new CancellationSignal();        fingerprintManager = FingerprintManagerCompat.from(activity);    }    public void startFingerPrintListen(FingerprintManagerCompat.AuthenticationCallback callback) {        fingerprintManager.authenticate(null, 0, signal, callback, null);    }    public void stopsFingerPrintListen() {        signal.cancel();        signal = null;    }}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30

Main2Activity

package com.contacts.lhj.myfingerprinttest;import android.support.v7.app.AppCompatActivity;import android.os.Bundle;public class Main2Activity extends AppCompatActivity {    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main2);    }}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

gradle

apply plugin: 'com.android.application'android {    compileSdkVersion 23    buildToolsVersion "24.0.0"    defaultConfig {        applicationId "com.contacts.lhj.myfingerprinttest"        minSdkVersion 15        targetSdkVersion 23        versionCode 1        versionName "1.0"    }    buildTypes {        release {            minifyEnabled false            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'        }    }}dependencies {    compile fileTree(dir: 'libs', include: ['*.jar'])    testCompile 'junit:junit:4.12'    compile 'com.android.support:appcompat-v7:23.4.0'}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27

好了,布局就不贴了,很简单,自己随便弄几个控件就OK了,实在不行就下载demo吧。

主要类(这些类可以通过上面API链接查看)

类名 注释 我的翻译
FingerprintManagerCompat A class that coordinates access to the fingerprint hardware. 一个用以访问指纹硬件的类
FingerprintManagerCompat.AuthenticationCallback Callback structure provided to authenticate(CryptoObject, CancellationSignal, int, AuthenticationCallback, Handler) 提供给方法authenticate的回调结构对象
FingerprintManagerCompat.AuthenticationResult Container for callback data from authenticate(CryptoObject, CancellationSignal, int, AuthenticationCallback, Handler). 一个用来存放来自方法authenticate的回调数据的容器。
FingerprintManagerCompat.CryptoObject A wrapper class for the crypto objects supported by FingerprintManager. FingerprintManager所支持的加密对象的包装类。

整个过程:这一次,当我决定了去做一个指纹识别的小功能的时候我第一件事是去google的开发者网站查看相关的API,这是由于我的潜意识就认为官方的才是权威、标准,这种想法其实也没问题;可是由于我的英语水平不咋的,所以只看了个半知半解,接着就做出了一个我不太满意有着bug的demo(主要是其中撤销指纹监听的功能一直做不出来)。我只能到百度、google这两个搜索引擎去寻找自己的答案了,终于我在google上面找到了答案(),这答案又指引我去看google官方的demo,最后终于把自己想做的demo完整的实现了。

总结:如果是需要短时间做出某个功能模块的话,尽量先使用自己比较擅长的能力去解决问题(这次我就该先百度或者google),因为重点是解决问题而不是完全弄清原理。时间充裕的话当然是去看API去看源码啰(小编尽量的在看了,只是看懂花的时间真的有点多啊!前辈说的话要听,慢慢来。。。呵呵)。

版权声明:本文为博主原创文章,转载请注明出处。

转载于:https://my.oschina.net/u/1177694/blog/896916

你可能感兴趣的文章
NinePatchChunk.java分析
查看>>
非template/render模式下使用iview组件时标签需要转化
查看>>
搜狐笔试 最大连续递增子段和 关键词连续递增
查看>>
.NET URL 301转向方法的实现
查看>>
新浪微博开放平台链接耗尽的情况分析
查看>>
极限编程的12个实践原则
查看>>
javascript--返回顶部效果
查看>>
C# NamePipe使用小结
查看>>
ZooKeeper Watcher注意事项
查看>>
Linux下清理内存和Cache方法
查看>>
表单元素的外观改变(webkit and IE10)
查看>>
帆软报表学习笔记②——行转列
查看>>
redis应用场景:实现简单计数器-防止刷单
查看>>
两款开发辅助工具介绍
查看>>
python 文件的打开与读取
查看>>
基于ROS的运动识别
查看>>
python 之selectors 实现文件上传下载
查看>>
【hdu - 2568】ACM程序设计期末考试081230
查看>>
C语言基础(一)
查看>>
python处理xml中非法字符的一种思路
查看>>