步骤:
- 首先要检测手机是否支持指纹识别的功能
- 其次要判断手机中是否已经录入了指纹
- 开启指纹验证
使用的类:
1.FingerprintManager:主要用来协调管理和访问指纹识别硬件设备
2.FingerprintManager.AuthenticationCallback这个一个callback接口,当指纹认证后系统会回调这个接口通知app认证的结果是什么
3.FingerprintManager.AuthenticationResult这是一个表示认证结果的类,会在回调接口中以参数给出
4.FingerprintManager.CryptoObject这是一个加密的对象类,用来保证认证的安全性,
Demo(一个页面有两个Button,一个是开启指纹验证,一个是取消指纹验证):
import android.support.v4.hardware.fingerprint.FingerprintManagerCompat;
import android.support.v4.os.CancellationSignal;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.widget.Button;
import com.example.a_0102.mylearn.R;
import butterknife.BindView;
import butterknife.ButterKnife;
import butterknife.OnClick;
/**
* 1.FingerprintManager:主要用来协调管理和访问指纹识别硬件设备
2.FingerprintManager.AuthenticationCallback这个一个callback接口,当指纹认证后系统会回调这个接口通知app认证的结果是什么
3.FingerprintManager.AuthenticationResult这是一个表示认证结果的类,会在回调接口中以参数给出
4.FingerprintManager.CryptoObject这是一个加密的对象类,用来保证认证的安全性,
*/
public class FingerPrintActivity extends AppCompatActivity {
private Button btnCheck;
private Button btnCancel;
private CancellationSignal cancellationSignal;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_finger_print);
}
/**
* 第一个参数是用于通过指纹验证取出AndroidKeyStore中的key的对象。crypto这是一个加密类的对象,指纹扫描器会使用这个对象来判断认证结果的合法性。
* 这个对象可以是null,但是这样的话,就意味这app无条件信任认证的结果,虽然从理论上这个过程可能被攻击,数据可以被篡改,这是app在这种情况下必须承担的风险。
* 因此,建议这个参数不要置为null。这个类的实例化有点麻烦,主要使用javax的security接口实现,
* 通常来讲,用来加密指纹扫描结果的机制就是一个Javax.Crypto.Cipher对象。Cipher对象本身会使用由应用调用Android keystore的API产生一个key来实现上面说道的保护功能
*
* 第二个参数可以用来取消指纹验证,如果想手动关闭验证,可以调用该参数的cancel方法。
*
* 第三个参数没什么意义,就是传0就好了。
*
* 第四个参数最重要,由于指纹信息是存在系统硬件中的,app是不可以访问指纹信息的,所以每次验证的时候,系统会通过这个callback告诉你是否验证通过、验证失败等。
* 第四个参数是handler,fingerprint中的消息都通过这个handler来传递消息,如果你传空,则默认创建一个在主线程上的handler来传递消息,没什么用,0传null好了。
*/
public void check(View view){
FingerprintManagerCompat fingerprintManager = FingerprintManagerCompat.from(this);
cancellationSignal = new CancellationSignal();
//判断指纹功能是否可用
if(fingerprintManager.isHardwareDetected()){//需要添加权限USE_FINGERPRINT
Log.e("--------->","isHardwareDetected");
//手机中是否有已经登记的指纹,即是否录入过指纹,如果没有需要先输入密码在录入指纹
if(fingerprintManager.hasEnrolledFingerprints()){
Log.e("--------->","hasEnrolledFingerprints");
//启动指纹识别
fingerprintManager.authenticate(null, 0, cancellationSignal, new FingerprintManagerCompat.AuthenticationCallback() {
@Override
public void onAuthenticationError(int errMsgId, CharSequence errString) {
super.onAuthenticationError(errMsgId, errString);
Log.e("--------->","onAuthenticationError"+errMsgId+",errString:"+errString);
}
@Override
public void onAuthenticationHelp(int helpMsgId, CharSequence helpString) {
super.onAuthenticationHelp(helpMsgId, helpString);
Log.e("--------->","onAuthenticationHelp"+helpMsgId+",helpString:"+helpString);
}
@Override
public void onAuthenticationSucceeded(FingerprintManagerCompat.AuthenticationResult result) {
super.onAuthenticationSucceeded(result);
Log.e("--------->","onAuthenticationSucceeded"+result);
}
@Override
public void onAuthenticationFailed() {
super.onAuthenticationFailed();
Log.e("--------->","onAuthenticationFailed");
}
},null);
}
}
}
public void cancel(View view){
cancellationSignal.cancel();
}
}
更多参考:
Android 6.0指纹识别App开发demo