android指纹
Android 6.0+指纹识别心得
Android 6.0+Fingerprint心得
数据来源:https://blog.csdn.net/lhj1076880929/article/details/52297812
我的demo链接
google官方demo
google相关API:android.support.v4.hardware.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)
这个方法是FingerprintManagerCompat类的公有方法,然后想办法把这个方法需要的几个参数给他,最后在调用他,这个功能大体就实现了;嗯,中间当然还有一些细节需要注意,比如如何实例化那几个类,可不可以传null之类的。下面给出我demo的具体代码,大家挑重要的看,然后按我说的方法看(这个方法authenticate着手哦),试试效果。
AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.contacts.lhj.myfingerprinttest"> <!--指纹权限-->
<uses-permission android:name="android.permission.USE_FINGERPRINT" /> <application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:name=".Main2Activity"/>
</application> </manifest>
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();
}
}
}
}
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;
}
}
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);
}
}
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'
}
好了,布局就不贴了,很简单,自己随便弄几个控件就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去看源码啰(小编尽量的在看了,只是看懂花的时间真的有点多啊!前辈说的话要听,慢慢来。。。呵呵)。
android指纹的更多相关文章
- Android 指纹认证
安卓指纹认证使用智能手机触摸传感器对用户进行身份验证.Android Marshmallow(棉花糖)提供了一套API,使用户很容易使用触摸传感器.在Android Marshmallow之前访问触摸 ...
- Android指纹识别API讲解,让你有更好的用户体验
我发现了一个比较怪的现象.在iPhone上使用十分普遍的指纹认证功能,在Android手机上却鲜有APP使用,我简单观察了一下,发现Android手机上基本上只有支付宝.微信和极少APP支持指纹认证功 ...
- android指纹识别、拼图游戏、仿MIUI长截屏、bilibili最美创意等源码
Android精选源码 一个动画效果的播放控件,播放,暂停,停止之间的动画 用 RxJava 实现 Android 指纹识别代码 Android仿滴滴打车(滴滴UI)源码 Android高仿哔哩哔哩动 ...
- Android指纹识别
原文:Android指纹识别 上一篇讲了通过FingerprintManager验证手机是否支持指纹识别,以及是否录入了指纹,这里进行指纹的验证. //获取FingerprintManager实例 F ...
- Android指纹解锁
Android6.0及以上系统支持指纹识别解锁功能:项目中用到,特此抽离出来,备忘. 功能是这样的:在用户将app切换到后台运行(超过一定的时长,比方说30秒),再进入程序中的时候就会弹出指纹识别的界 ...
- Android指纹识别深入浅出分析到实战(6.0以下系统适配方案)
指纹识别这个名词听起来并不陌生,但是实际开发过程中用得并不多.Google从Android6.0(api23)开始才提供标准指纹识别支持,并对外提供指纹识别相关的接口.本文除了能适配6.0及以上系统, ...
- Android指纹识别深入浅出分析到实战
指纹识别这个名词听起来并不陌生,但是实际开发过程中用得并不多.Google从Android6.0(api23)开始才提供标准指纹识别支持,并对外提供指纹识别相关的接口.本文除了能适配6.0及以上系统, ...
- android指纹识别认证实现
Android从6.0系统支持指纹认证功能 启动页面简单实现 package com.loaderman.samplecollect.zhiwen; import android.annotation ...
- Android M Developer Preview - API Preview(一)
API Overview The M Developer Preview gives you an advance look at the upcoming release for the Andro ...
随机推荐
- 一些有用的java 框架
jwt 用于生成web toke的类库 http://jwt.io/ jasypt java加密类库 http://www.jasypt.org/
- css笔记 - 张鑫旭css课程笔记之 z-index 篇
一.z-index语法.支持的属性值等 z-index: 在支持z-index的元素上, z-index规定了元素(包括子元素)的垂直z方向的层级顺序, z-index可以决定哪个元素覆盖在哪个元素上 ...
- PowerDesigner 同名问题解决 Entity Attribute name uniqueness
选择"Tools -> Model Options"后 "Allow reuse"复选框,建议把这个钩也去掉 Tool->check model.. ...
- jQuery事件处理(六)
1.通过一步步调试的的方法观察了一下存放到cache中的事件及其处理程序的数据格式: { events : { // 根据事件类型存放添加到该元素上的所有事件,下面以click为例 click : [ ...
- sencha touch + Cordova 3.x下载文件
今天实现了一个文件下载功能,在网上找了下资料发现有些问题. 我用的是小米1s,安卓 4.1.2,cordova 3.5,打包测试运行正常 首先在控制层launch方法中加入以下代码: // 等待加载P ...
- linux各种版本下载地址
本文转载地址:http://52199999.blog.51cto.com/740826/290179 觉得好大家给顶顶,先谢谢了!呵呵 首先提供两个镜像站:http://mirrors.sohu.c ...
- 2015.7.7js-07-2(基础)
1.用求模来计算时间,秒%60,就能获取剩余的秒 var s = 362; var minute = parseInt(s/60) + "分" //取得分 var second = ...
- 关于ASP.NET Web API的ModelBinding杂谈
由于客户端调用Web API传递的数据属性命名一般偏向javascript规范,只是简单的大小写差异没有问题,但始终会有一些特殊情况.比如OAuth的请求: client_id : "val ...
- iOS - 指定UIView的某几个角为圆角
如果需要将UIView的4个角全部都为圆角,做法相当简单,只需设置其Layer的cornerRadius属性即可(项目需要使用QuartzCore框架).而若要指定某几个角(小于4)为圆角而别的不变时 ...
- spring jdbcTemplate 操作存储过程
Spring的SimpleJdbcTemplate将存储过程的调用进行了良好的封装,下面列出使用JdbcTemplate调用Oracle存储过程的三种情况: 一.无返回值的存储过程调用 1.存储过程代 ...