Android 指纹解锁

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();
            }
        }
    }
}

猜你喜欢

转载自blog.csdn.net/u014434239/article/details/84246072