Skip to content

Commit ac4ed9b

Browse files
committed
未添加指纹,回调给开发者自行处理
1 parent 817f739 commit ac4ed9b

18 files changed

Lines changed: 110 additions & 55 deletions

File tree

.idea/gradle.xml

Lines changed: 0 additions & 3 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

.idea/misc.xml

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

biometricprompt/src/main/java/com/hailong/biometricprompt/fingerprint/FingerprintAndrM.java

Lines changed: 29 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,17 @@
11
package com.hailong.biometricprompt.fingerprint;
22

33
import android.app.Activity;
4-
import android.app.AlertDialog;
5-
import android.content.DialogInterface;
6-
import android.content.Intent;
4+
import android.content.Context;
5+
import android.hardware.fingerprint.FingerprintManager;
76
import android.os.Build;
8-
import android.provider.Settings;
97

108
import androidx.annotation.RequiresApi;
119
import androidx.core.hardware.fingerprint.FingerprintManagerCompat;
1210
import androidx.core.os.CancellationSignal;
1311

1412
import com.hailong.biometricprompt.R;
1513
import com.hailong.biometricprompt.fingerprint.bean.VerificationDialogStyleBean;
14+
import com.hailong.biometricprompt.uitls.CipherHelper;
1615

1716
/**
1817
* Android M == 6.0
@@ -39,33 +38,16 @@ public class FingerprintAndrM implements IFingerprint {
3938

4039
@Override
4140
public void authenticate(Activity context, VerificationDialogStyleBean bean, FingerprintCallback callback) {
41+
42+
//判断指纹识别是否可用
43+
if (!canAuthenticate(context, callback))
44+
return;
45+
4246
this.context = context;
4347
this.fingerprintCallback = callback;
4448
//Android 6.0 指纹管理 实例化
4549
fingerprintManagerCompat = FingerprintManagerCompat.from(context);
46-
//硬件是否支持指纹识别
47-
if (!fingerprintManagerCompat.isHardwareDetected()) {
48-
callback.onError(context.getString(R.string.biometricprompt_verify_error_no_hardware));
49-
return;
50-
}
51-
//是否已添加指纹
52-
if (!fingerprintManagerCompat.hasEnrolledFingerprints()) {
53-
AlertDialog.Builder lertDialogBuilder = new AlertDialog.Builder(context);
54-
lertDialogBuilder.setTitle(context.getString(R.string.biometricprompt_tip))
55-
.setMessage(context.getString(R.string.biometricprompt_finger_add))
56-
.setCancelable(false)
57-
.setNegativeButton(context.getString(R.string.biometricprompt_finger_add_confirm), ((DialogInterface dialog, int which) -> {
58-
Intent intent = new Intent(Settings.ACTION_FINGERPRINT_ENROLL);
59-
context.startActivity(intent);
60-
}
61-
))
62-
.setPositiveButton(context.getString(R.string.biometricprompt_cancel), ((DialogInterface dialog, int which) -> {
63-
dialog.dismiss();
64-
}
65-
))
66-
.create().show();
67-
return;
68-
}
50+
6951
//取消扫描,每次取消后需要重新创建新示例
7052
cancellationSignal = new CancellationSignal();
7153
cancellationSignal.setOnCancelListener(() -> fingerprintDialog.dismiss());
@@ -149,5 +131,25 @@ public void onAuthenticationFailed() {
149131
}
150132
};
151133

134+
/*
135+
* 在 Android Q,Google 提供了 Api BiometricManager.canAuthenticate() 用来检测指纹识别硬件是否可用及是否添加指纹
136+
* 不过尚未开放,标记为"Stub"(存根)
137+
* 所以暂时还是需要使用 Andorid 6.0 的 Api 进行判断
138+
* */
139+
private boolean canAuthenticate(Context context, FingerprintCallback fingerprintCallback) {
140+
/*
141+
* 硬件是否支持指纹识别
142+
* */
143+
if (!FingerprintManagerCompat.from(context).isHardwareDetected()) {
144+
fingerprintCallback.onError(FingerprintManager.FINGERPRINT_ERROR_HW_NOT_PRESENT, context.getString(R.string.biometricprompt_verify_error_no_hardware));
145+
return false;
146+
}
147+
//是否已添加指纹
148+
if (!FingerprintManagerCompat.from(context).hasEnrolledFingerprints()) {
149+
fingerprintCallback.onNoneEnrolled();
150+
return false;
151+
}
152+
return true;
153+
}
152154

153155
}

biometricprompt/src/main/java/com/hailong/biometricprompt/fingerprint/FingerprintAndrP.java

Lines changed: 33 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,19 @@
11
package com.hailong.biometricprompt.fingerprint;
22

33
import android.app.Activity;
4-
import android.content.DialogInterface;
4+
import android.content.Context;
55
import android.hardware.biometrics.BiometricPrompt;
6+
import android.hardware.fingerprint.FingerprintManager;
67
import android.os.Build;
78
import android.os.CancellationSignal;
89
import android.text.TextUtils;
9-
import android.util.Log;
1010

1111
import androidx.annotation.RequiresApi;
12+
import androidx.core.hardware.fingerprint.FingerprintManagerCompat;
1213

1314
import com.hailong.biometricprompt.R;
1415
import com.hailong.biometricprompt.fingerprint.bean.VerificationDialogStyleBean;
15-
16-
import java.util.concurrent.Executor;
16+
import com.hailong.biometricprompt.uitls.CipherHelper;
1717

1818
/**
1919
* Android P == 9.0
@@ -33,6 +33,11 @@ public class FingerprintAndrP implements IFingerprint {
3333

3434
@Override
3535
public void authenticate(Activity context, VerificationDialogStyleBean verificationDialogStyleBean, FingerprintCallback callback) {
36+
37+
//判断指纹识别是否可用
38+
if (!canAuthenticate(context, callback))
39+
return;
40+
3641
this.fingerprintCallback = callback;
3742

3843
/*
@@ -100,15 +105,15 @@ public void onAuthenticationError(int errorCode, CharSequence errString) {
100105
fingerprintCallback.onCancel();
101106
return;
102107
}
103-
fingerprintCallback.onError(errString.toString());
108+
fingerprintCallback.onError(errorCode, errString.toString());
104109
}
105110
}
106111

107112
@Override
108113
public void onAuthenticationHelp(int helpCode, CharSequence helpString) {
109114
super.onAuthenticationHelp(helpCode, helpString);
110115
if (fingerprintCallback != null)
111-
fingerprintCallback.onError(helpString.toString());
116+
fingerprintCallback.onError(helpCode, helpString.toString());
112117
}
113118

114119
@Override
@@ -126,4 +131,26 @@ public void onAuthenticationFailed() {
126131
}
127132
};
128133

134+
/*
135+
* 在 Android Q,Google 提供了 Api BiometricManager.canAuthenticate() 用来检测指纹识别硬件是否可用及是否添加指纹
136+
* 不过尚未开放,标记为"Stub"(存根)
137+
* 所以暂时还是需要使用 Andorid 6.0 的 Api 进行判断
138+
* */
139+
private boolean canAuthenticate(Context context, FingerprintCallback fingerprintCallback) {
140+
141+
/*
142+
* 硬件是否支持指纹识别
143+
* */
144+
if (!FingerprintManagerCompat.from(context).isHardwareDetected()) {
145+
fingerprintCallback.onError(FingerprintManager.FINGERPRINT_ERROR_HW_NOT_PRESENT, context.getString(R.string.biometricprompt_verify_error_no_hardware));
146+
return false;
147+
}
148+
//是否已添加指纹
149+
if (!FingerprintManagerCompat.from(context).hasEnrolledFingerprints()) {
150+
fingerprintCallback.onNoneEnrolled();
151+
return false;
152+
}
153+
return true;
154+
}
155+
129156
}

biometricprompt/src/main/java/com/hailong/biometricprompt/fingerprint/FingerprintCallback.java

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,10 +25,15 @@ public interface FingerprintCallback {
2525
*/
2626
void onCancel();
2727

28+
/**
29+
* 未添加指纹
30+
*/
31+
void onNoneEnrolled();
32+
2833
/**
2934
* 异常,验证中的异常信息都显示在dialog上,验证前的异常信息通过此回调通知调用者
3035
*
3136
* @param errorMsg
3237
*/
33-
void onError(String errorMsg);
38+
void onError(int msgId, String errorMsg);
3439
}

biometricprompt/src/main/java/com/hailong/biometricprompt/fingerprint/FingerprintVerifyManager.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
import android.app.AlertDialog;
55
import android.content.DialogInterface;
66
import android.content.Intent;
7+
import android.hardware.fingerprint.FingerprintManager;
78
import android.provider.Settings;
89

910
import androidx.annotation.ColorInt;
@@ -28,7 +29,7 @@ public FingerprintVerifyManager(Builder builder) {
2829
} else if (AndrVersionUtil.isAboveAndrM()) {
2930
fingerprint = FingerprintAndrM.newInstance();
3031
} else {//Android 6.0 以下官方未开放指纹识别,某些机型自行支持的情况暂不做处理
31-
builder.callback.onError(builder.context.getString(R.string.biometricprompt_verify_error_below_m));
32+
builder.callback.onError(FingerprintManager.FINGERPRINT_ERROR_HW_NOT_PRESENT, builder.context.getString(R.string.biometricprompt_verify_error_below_m));
3233
return;
3334
}
3435
/**

biometricprompt/src/main/java/com/hailong/biometricprompt/fingerprint/CipherHelper.java renamed to biometricprompt/src/main/java/com/hailong/biometricprompt/uitls/CipherHelper.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package com.hailong.biometricprompt.fingerprint;
1+
package com.hailong.biometricprompt.uitls;
22

33
import android.hardware.biometrics.BiometricPrompt;
44
import android.os.Build;
Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,11 @@
11
<resources>
22
<string name="biometricprompt_tip">Tip</string>
33
<string name="biometricprompt_fingerprint_verification">Fingerprint Verification</string>
4-
<string name="biometricprompt_finger_add">Please add fingerprints first.</string>
5-
<string name="biometricprompt_finger_add_confirm">Confirm</string>
6-
<string name="biometricprompt_cancel">Cancel</string>
74
<string name="biometricprompt_verify_fingerprint">Please verify your fingerprints.</string>
85
<string name="biometricprompt_verify_usepwd">Enter password</string>
96
<string name="biometricprompt_verify_success">Verification success</string>
107
<string name="biometricprompt_verify_failed">Verification failure</string>
118
<string name="biometricprompt_verify_error_below_m">Fingerprint recognition support not available below Android 6.0. </string>
129
<string name="biometricprompt_verify_error_no_hardware">This device does not support fingerprint recognition. </string>
10+
<string name="biometricprompt_cancel">Cancel</string>
1311
</resources>
Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,11 @@
11
<resources>
22
<string name="biometricprompt_tip">提&#160;示</string>
33
<string name="biometricprompt_fingerprint_verification">指纹验证</string>
4-
<string name="biometricprompt_finger_add">请先添加指纹</string>
5-
<string name="biometricprompt_finger_add_confirm">确认添加</string>
6-
<string name="biometricprompt_cancel">取&#160;消</string>
74
<string name="biometricprompt_verify_fingerprint">请验证您的指纹</string>
85
<string name="biometricprompt_verify_usepwd">密码验证</string>
96
<string name="biometricprompt_verify_success">验证成功</string>
107
<string name="biometricprompt_verify_failed">验证失败</string>
118
<string name="biometricprompt_verify_error_below_m">Android 6.0 以下不提供指纹识别支持</string>
129
<string name="biometricprompt_verify_error_no_hardware">此设备不支持指纹识别</string>
10+
<string name="biometricprompt_cancel">取&#160;消</string>
1311
</resources>
Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,11 @@
11
<resources>
22
<string name="biometricprompt_tip">提&#160;示</string>
33
<string name="biometricprompt_fingerprint_verification">指纹验证</string>
4-
<string name="biometricprompt_finger_add">请先添加指纹</string>
5-
<string name="biometricprompt_finger_add_confirm">确认添加</string>
6-
<string name="biometricprompt_cancel">取&#160;消</string>
74
<string name="biometricprompt_verify_fingerprint">请验证您的指纹</string>
85
<string name="biometricprompt_verify_usepwd">密码验证</string>
96
<string name="biometricprompt_verify_success">验证成功</string>
107
<string name="biometricprompt_verify_failed">验证失败</string>
118
<string name="biometricprompt_verify_error_below_m">Android 6.0 以下不提供指纹识别支持</string>
129
<string name="biometricprompt_verify_error_no_hardware">此设备不支持指纹识别</string>
10+
<string name="biometricprompt_cancel">取&#160;消</string>
1311
</resources>

0 commit comments

Comments
 (0)