FingerprintDialog.java
4.81 KB
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
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
package com.polysoft.nafmii.fragment.dialog;
import android.annotation.TargetApi;
import android.app.KeyguardManager;
import android.hardware.fingerprint.FingerprintManager;
import android.os.Bundle;
import android.os.CancellationSignal;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.fragment.app.DialogFragment;
import androidx.fragment.app.FragmentManager;
import com.polysoft.nafmii.bean.Result;
import com.polysoft.nafmii.utils.CtxUtils;
import com.polysoft.nafmii.utils.ToastUtils;
import com.whaty.nafmii.R;
import java.util.Objects;
@TargetApi(23)
public class FingerprintDialog extends DialogFragment {
private FingerprintManager mFingerprintMgr;
private CancellationSignal mCancellationSignal;
private TextView errorMsg;
private AuthBackListener mAuthBackListener;
public static void show(FragmentManager manager, AuthBackListener listener) {
FingerprintDialog dialog = new FingerprintDialog();
dialog.setAuthBackListener(listener);
if (dialog.isSupportFingerprint()) {
dialog.show(manager, "Fingerprint");
}
}
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
super.setStyle(DialogFragment.STYLE_NORMAL, android.R.style.Theme_Material_Light_Dialog);
super.setCancelable(false);
this.mFingerprintMgr = CtxUtils.getSystemService(FingerprintManager.class);
}
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fingerprint_dialog, container, false);
this.errorMsg = view.findViewById(R.id.error_msg);
view.findViewById(R.id.cancel).setOnClickListener((v) -> cancel());
return view;
}
@Override
public void onResume() {
super.onResume();
this.start();
}
@Override
public void onPause() {
super.onPause();
this.stop();
}
public void setAuthBackListener(AuthBackListener listener) {
this.mAuthBackListener = listener;
}
private void start() {
this.mCancellationSignal = new CancellationSignal();
mFingerprintMgr.authenticate(null, this.mCancellationSignal, 0, new AuthBackImpl(), null);
}
private void stop() {
if (null != this.mCancellationSignal) {
this.mCancellationSignal.cancel();
this.mCancellationSignal = null;
}
}
private void cancel() {
this.closeBack(Result.success("cancel"));
}
private void success() {
this.closeBack(Result.success("ok"));
}
private void error(String error) {
this.closeBack(Result.fail(error));
}
private void closeBack(Result result) {
super.dismiss();
if (null != this.mAuthBackListener) {
this.mAuthBackListener.onAuthBack(result);
}
}
@Override
public void show(@NonNull FragmentManager manager, @Nullable String tag) {
super.show(manager, tag);
}
private boolean isSupportFingerprint() {
FingerprintManager fingerprintMgr = CtxUtils.getSystemService(FingerprintManager.class);
if (null != fingerprintMgr && !fingerprintMgr.isHardwareDetected()) {
this.error("您的手机不支持指纹功能");
return false;
}
KeyguardManager keyMgr = CtxUtils.getSystemService(KeyguardManager.class);
if (keyMgr != null && !keyMgr.isKeyguardSecure()) {
this.error("您还未设置锁屏,请先设置锁屏并添加一个指纹");
return false;
}
if (null != fingerprintMgr && !fingerprintMgr.hasEnrolledFingerprints()) {
this.error("您至少需要在系统设置中添加一个指纹");
return false;
}
return true;
}
private class AuthBackImpl extends FingerprintManager.AuthenticationCallback {
@Override
public void onAuthenticationError(int errorCode, CharSequence errString) {
errorMsg.setText(errString);
}
@Override
public void onAuthenticationHelp(int helpCode, CharSequence helpString) {
errorMsg.setText(helpString);
}
@Override
public void onAuthenticationSucceeded(FingerprintManager.AuthenticationResult result) {
ToastUtils.showLong("认证成功");
success();
}
@Override
public void onAuthenticationFailed() {
errorMsg.setText("指纹认证失败,请再试一次");
}
}
public interface AuthBackListener {
void onAuthBack(Result result);
}
}