最近一个需求是要验证指纹传感器的可用性(在没有录入指纹时也能验证),所以考虑通过录入指纹来验证传感器的可用性;做个代码的记录方便以后可用。
判断设备是否支持指纹
@RequiresApi(api = Build.VERSION_CODES.M)
public static FingerprintManager getFingerprintManagerOrNull() {
if (getApp().getPackageManager().hasSystemFeature(PackageManager.FEATURE_FINGERPRINT)) {
return getApp().getSystemService(FingerprintManager.class);
} else {
return null;
}
}
开启指纹录入
long auth = this.mFingerprintManager.preEnroll();
byte[] arrayOfByte = getBytes(auth);
for (int i = 0; i < arrayOfByte.length; i++) {
mToken[(i + 1)] = (byte) arrayOfByte[i];
}
mEnrollmentCancel = new CancellationSignal();
mFingerprintManager.enroll(mToken, mEnrollmentCancel, 0, UserHandle.myUserId(), new FingerprintManager.EnrollmentCallback() {
@Override
public void onEnrollmentError(int errMsgId, CharSequence errString) {
super.onEnrollmentError(errMsgId, errString);
Log.v("lmjssjj", "Please try again errMsgId:"+errMsgId+" errString:"+errString);
}
@Override
public void onEnrollmentHelp(int helpMsgId, CharSequence helpString) {
super.onEnrollmentHelp(helpMsgId, helpString);
Log.v("lmjssjj", "helpMsgId:"+helpMsgId+" helpString:"+helpString);
}
@Override
public void onEnrollmentProgress(int remaining) {
super.onEnrollmentProgress(remaining);
Log.v("lmjssjj", "success");
}
});
public byte[] getBytes(long auth)
{
byte[] arrayOfByte = new byte[28];
arrayOfByte[0] = (byte)(byte)(int)(auth & 0xFF);
arrayOfByte[1] = (byte)(byte)(int)(auth >> 8 & 0xFF);
arrayOfByte[2] = (byte)(byte)(int)(auth >> 16 & 0xFF);
arrayOfByte[3] = (byte)(byte)(int)(auth >> 24 & 0xFF);
arrayOfByte[4] = (byte)(byte)(int)(auth >> 32 & 0xFF);
arrayOfByte[5] = (byte)(byte)(int)(auth >> 40 & 0xFF);
arrayOfByte[6] = (byte)(byte)(int)(auth >> 48 & 0xFF);
arrayOfByte[7] = (byte)(byte)(int)(auth >> 56 & 0xFF);
arrayOfByte[24] = (byte)0;
arrayOfByte[25] = (byte)0;
arrayOfByte[26] = (byte)0;
arrayOfByte[27] = (byte)2;
return arrayOfByte;
}