Android 6.0 지문 인식 개발 사례 상세 설명

6164 단어 Android지문 인식
Android 6.0 지문 인식 개발 사례 상세 설명
최근 안 드 로 이 드 지문 관련 기능 을 하고 있 으 며 구 글 은 안 드 로 이 드 6.0 이상 버 전에 서 지문 인식 을 공식 적 으로 지원 했다.당시 FingerprintManager 와 Fingerprint Manager Compat 두 가지 사이 에 갈등 이 있 었 는데 그 중에서 FingerprintManager 를 사용 하면 com.android.support:appcompat-v7 패 키 지 를 도입 해 야 했 고 가방 의 크기 를 고려 하여 v4 호 환 패키지 Fingerprint Manager Compat 를 사용 하기 로 결정 했다.
주로 실 현 된 도구 류 FingerprintUtil:핸드폰 이 지문 인식 방법 을 지원 하 는 지 검증 합 니 다.callFingerPrintVerify()는 핸드폰 하드웨어 가 지원 하 는 지 검증 합 니 다(6.0 이상).지문 이 입력 되 었 는 지 확인 한 다음 에 잠 금 화면 비밀 번 호 를 열 었 는 지 확인 합 니 다.식별 에 성공 하면 실 패 는 해당 하 는 리 셋 처 리 를 할 수 있 습 니 다.
인 스 턴 스 코드:

 public class FingerprintUtil{

 private FingerprintManagerCompat mFingerprintManager;
 private KeyguardManager mKeyManager;
 private CancellationSignal mCancellationSignal;
 private Activity mActivity;

 public FingerprintUtil(Context ctx) {
  mActivity = (Activity) ctx;
  mFingerprintManager = FingerprintManagerCompat.from(mActivity);
  mKeyManager = (KeyguardManager) mActivity.getSystemService(Context.KEYGUARD_SERVICE);

 }

 public void callFingerPrintVerify(final IFingerprintResultListener listener) {
  if (!isHardwareDetected()) {
   return;
  }
  if (!isHasEnrolledFingerprints()) {
   if (listener != null) {
    listener.onNoEnroll();
   }
   return;
  }
  if (!isKeyguardSecure()) {
   if (listener != null) {
    listener.onInSecurity();
   }
   return;
  }
  if (listener != null) {
   listener.onSupport();
  }

  if (listener != null) {
   listener.onAuthenticateStart();
  }
  if (mCancellationSignal == null) {
   mCancellationSignal = new CancellationSignal();
  }
  try {
   mFingerprintManager.authenticate(null, 0, mCancellationSignal, new FingerprintManagerCompat.AuthenticationCallback() {
    //         onAuthenticationError,         ,        ,     。
    @Override
    public void onAuthenticationError(int errMsgId, CharSequence errString) {
     if (listener != null)
      listener.onAuthenticateError(errMsgId, errString);
    }

    //          ,     4      onAuthenticationFailed, 5  onAuthenticationError
    @Override
    public void onAuthenticationFailed() {
     if (listener != null)
      listener.onAuthenticateFailed();
    }

    @Override
    public void onAuthenticationHelp(int helpMsgId, CharSequence helpString) {
     if (listener != null)
      listener.onAuthenticateHelp(helpMsgId, helpString);

    }

    //               ,        sensor
    @Override
    public void onAuthenticationSucceeded(FingerprintManagerCompat.AuthenticationResult result) {
     if (listener != null)
      listener.onAuthenticateSucceeded(result);
    }

   }, null);
  } catch (Exception e) {
   e.printStackTrace();
  }
 }

 /**
  *       ,            ,                   false
  *
  * @return
  */
 private boolean isHasEnrolledFingerprints() {
  try {
   return mFingerprintManager.hasEnrolledFingerprints();
  } catch (Exception e) {
   return false;
  }
 }

 /**
  *            
  *
  * @return
  */
 public boolean isHardwareDetected() {
  try {
   return mFingerprintManager.isHardwareDetected();
  } catch (Exception e) {
   return false;
  }
 }

 /**
  *           
  *
  * @return
  */
 private boolean isKeyguardSecure() {
  try {
   return mKeyManager.isKeyguardSecure();
  } catch (Exception e) {
   return false;
  }

 }

 /**
  *         
  */
 public interface IFingerprintResultListener {
  void onInSecurity();

  void onNoEnroll();

  void onSupport();

  void onAuthenticateStart();

  void onAuthenticateError(int errMsgId, CharSequence errString);

  void onAuthenticateFailed();

  void onAuthenticateHelp(int helpMsgId, CharSequence helpString);

  void onAuthenticateSucceeded(FingerprintManagerCompat.AuthenticationResult result);

 }

 public void cancelAuthenticate() {
  if (mCancellationSignal != null) {
   mCancellationSignal.cancel();
   mCancellationSignal = null;
  }
 }


 public void onDestroy() {
  cancelAuthenticate();
  mKeyManager = null;
  mFingerprintManager = null;

 }

일부 자 료 를 참고 하여 검증 을 하여 결론 을 얻 었 다.
1.지문 인식 에 실패 하면 onAuthenticationFailed()방법 을 사용 합 니 다.이때 지문 센서 가 닫 히 지 않 았 습 니 다.구 글 네 이 티 브 시스템 은 우리 에 게 5 번 의 재 시도 기 회 를 주 었 습 니 다.즉,onAuthenticationFailed()방법 을 4 번 연속 호출 한 후에 다섯 번 째 는 onAuthenticateError(int errMsgId,CharSequence errString)방법 을 사용 합 니 다.이때 errMsgId==7.
2.다시 권한 을 부여 할 때마다 검사 하지 않 아 도 취소 할 때 onAuthenticateError(int errMsgId,CharSequence errString)방법 을 사용 합 니 다.그 중에서 errMsgId==5,
3.시스템 이 onAuthenticationError()와 onAuthenticationSucceeded()를 호출 하면 센서 가 닫 힙 니 다.우리 가 다시 권한 을 부여 하고 authenticate()방법 을 다시 호출 해 야 지문 인식 기능 을 계속 사용 할 수 있 습 니 다.
4.안 드 로 이 드 6.0 이하 시스템 을 호 환 할 경우 Fingerprint Manager Compat 를 사용 하지 마 세 요.M 이하 의 시스템 버 전 입 니 다.Fingerprint Manager Compat 는 핸드폰 에 지문 인식 모듈 이 있 든 없 든 지문 인식 이 없다 고 생각 하고 FingerprintManager 로 할 수 있 습 니 다.
5.보안 요 소 를 고려 하여 authenticate(Crypto Object crypto,CancellationSignal cancel,int flags,AuthenticationCallback callback,Handler handler)에 Crypto Object 를 추가 하 는 것 이 좋 습 니 다.crypto 는 암호 화 된 대상 입 니 다.지문 스캐너 는 이 대상 을 사용 하여 인증 결과 의 합 법성 을 판단 합 니 다.이 대상 은 null 일 수 있 습 니 다.그러나 이렇게 되면 app 이 무조건 신뢰 인증 결 과 를 의미 합 니 다.이 과정 은 공격 을 받 을 수 있 고 데이터 가 변 경 될 수 있 습 니 다.이것 은 app 이 이런 상황 에서 반드시 부담 해 야 할 위험 입 니 다.따라서 이 매개 변 수 를 null 로 설정 하지 않 는 것 을 권장 합 니 다.이 종류의 실례 화 는 좀 번 거 롭 습 니 다.주로 javax 의 security 인 터 페 이 스 를 사용 하여 이 루어 집 니 다.
 읽 어 주 셔 서 감사합니다. 여러분 에 게 도움 이 되 기 를 바 랍 니 다.본 사이트 에 대한 여러분 의 지지 에 감 사 드 립 니 다!

좋은 웹페이지 즐겨찾기