Android 指紋解鎖
阿新 • • 發佈:2018-11-20
import android.Manifest; import android.content.Context; import android.support.v4.hardware.fingerprint.FingerprintManagerCompat; import android.support.v4.os.CancellationSignal; import android.widget.Toast; import com.tbruyelle.rxpermissions.RxPermissions; import com.xvli.aicash.R; import com.xvli.aicash.widget.dialog.DialogCallback; import com.yanzhenjie.nohttp.Logger; import rx.functions.Action1; /** * @param * @Comments : 指紋解鎖 * @Author : Lampo * @CreateDate : 2018/10/22 10:24 * @ModifiedBy : Lampo * @ModifiedDate : 2018/10/22 10:24 * @Modified : 6.0以上使用前要申請許可權 Manifest.permission.USE_FINGERPRINT */ public class FingerprintUtil { private static FingerprintManagerCompat compat; private static DialogCallback callBack1; private static CancellationSignal mCancellationSignal; /** * 判斷 * * @param context * @return */ public static boolean isFingerprintOK(final Context context) { final boolean[] flag = {true}; try { Class.forName("android.hardware.fingerprint.FingerprintManager"); // 通過反射判斷是否存在該類 } catch (ClassNotFoundException e) { e.printStackTrace(); Toast.makeText(context, "該手機系統版本太低,不支援指紋解鎖功能", Toast.LENGTH_SHORT).show(); flag[0] = false; return false; } RxPermissions.getInstance(context).request(Manifest.permission.USE_FINGERPRINT).subscribe(new Action1<Boolean>() { @Override public void call(Boolean aBoolean) { if (aBoolean) { compat = FingerprintManagerCompat.from(context); if (!compat.hasEnrolledFingerprints()) { Toast.makeText(context, "請檢視指紋硬體是否存在且功能正常", Toast.LENGTH_SHORT).show(); flag[0] = false; } if (!compat.isHardwareDetected()) { Toast.makeText(context, "請至少註冊了一個指紋", Toast.LENGTH_SHORT).show(); flag[0] = false; } } else { Toast.makeText(context, "指紋解鎖許可權申請失敗", Toast.LENGTH_SHORT).show(); flag[0] = false; } } }); return flag[0]; } /** * 開啟並且監聽指紋 * * @param context * @param callBack */ public static void transferFingerprint(final Context context, DialogCallback callBack) { callBack1 = callBack; if (FingerprintUtil.isFingerprintOK(context)) { mCancellationSignal = new CancellationSignal(); compat.authenticate(null, 0, mCancellationSignal, new FingerAuthenticateCallBack(), null); } } /** * 關閉指紋驗證 */ public static void cancelFingerprint() { if (callBack1 != null && mCancellationSignal != null) { mCancellationSignal.cancel(); } } private static class FingerAuthenticateCallBack extends FingerprintManagerCompat.AuthenticationCallback { // 當出現錯誤的時候回撥此函式,比如多次嘗試都失敗了的時候,errString是錯誤資訊 @Override public void onAuthenticationError(int errMsgId, CharSequence errString) { Logger.d("onAuthenticationError: " + "驗證失敗"); if (callBack1 != null) { callBack1.onCancel(); } } // 當指紋驗證失敗的時候會回撥此函式,失敗之後允許多次嘗試,失敗次數過多會停止響應一段時間然後再停止sensor的工作 @Override public void onAuthenticationFailed() { Logger.d("onAuthenticationFailed: " + "驗證失敗"); if (callBack1 != null) { callBack1.onCancel(); } } @Override public void onAuthenticationHelp(int helpMsgId, CharSequence helpString) { } // 當驗證的指紋成功時會回撥此函式,然後不再監聽指紋sensor @Override public void onAuthenticationSucceeded(FingerprintManagerCompat.AuthenticationResult result) { Logger.e("onAuthenticationSucceeded: " + "驗證成功"); if (callBack1 != null) { callBack1.onConfirm(); } } } }