늘모자란, 개발 :: [Android] FINGERPRINT_ERROR_CANCELED(errMsgId 5) 발생과 수정

늘모자란, 개발

지문인식 기능을 개발할 일이 있어서 개발을 완료했는데, 뒤늦게 다른 기기에서 동작을 안하는걸 발견했다.
분명히 테스트 기기 (Galaxy S6) 에서는 잘됐었는데, Pixel 및 Galaxy S8+ 에서는 동작을 하지 않는게 의아했다.
정확히는, 아예 안되는건 아니고 앱전환 화면으로 들어간다던지 해서 액티비티가 pause 후 resume 되면 멀쩡하게 동작하는걸 발견해서,
결국 로그를 찍어보게 되었는데 다음과 같은 에러가 발생하고 있었다

5, 지문 인식 작업이 취소되었습니다.


5가 뭔지 찾아보니까 FINGERPRINT_ERROR_CANCELED 로 정의되어 있었다.
단순히 FingerprintManager를 호출했을뿐인데 에러가 발생해서, onError 때문에 지문인증을 할 수 없게 되지만, 이상하게 resume 되면 매니저가 정상 동작하는게 좀 어이가 없기도 하고..

그래서 검색을 좀 해봤는데 이 글을 발견할 수 있었다.
@Override
    public void onAuthenticationError(int errMsgId, CharSequence errString) {
        if ( errMsgId == FingerprintManager.FINGERPRINT_ERROR_CANCELED) {
            stopListening();
            restartListeningToFingerprint();
        }
}


코드는 별 달리 읽을것도 없고, 에러메세지 5번이 발생할 경우 Listening 을 멈추고 재시작하라고 되어있다.
즉 Android 구현상에 문제가 있다는건데... 왜 내 Galaxy S6 에서는 문제가 없었을까? 하니 링크된 구글 이슈트래커에서 내용을 발견할 수 있었다

This issue is not reproducible on all devices. The Samsung Galaxy S6 doesn't return this error whereas the Pixel XL emulator does.


그냥 적혀있는 댓글이라 100% 이렇다! 할 수는 없지만 일단 나같은 사람이 더 있다는거에 위안을 삼고..
이제 본격적으로 고쳐보자. 별로 고칠 내용도 없다.

상기 예문의 코드에서는 에러가 발생시 재시작 하라고 되어 있는데 정확히는 CancellationSignal 를 건드려야 한다.
CryptoObject를 저장해놨다가 다시 Listening 을 시작하고 하는 식으로 구현해봤으나 별 효과가 없고, 그냥 이 글에 나와 있는것 처럼 다음과 같이 작성하는게 직빵이다

@Override
    public void onAuthenticationError(int errMsgId, CharSequence errString) {
        if ( errMsgId == FingerprintManager.FINGERPRINT_ERROR_CANCELED) {
            return;
        }
}
2018/07/17 09:22 2018/07/17 09:22