반응형
공감 및 댓글은 포스팅 하는데 아주아주 큰 힘이 됩니다!! 포스팅 내용이 찾아주신 분들께 도움이 되길 바라며 더 깔끔하고 좋은 포스팅을 만들어 나가겠습니다^^
|
이번 포스팅에서는
안드로이드 API23 마쉬멜로우 버전에서 추가된
지문인식 기능을 추가하는 방법에 대해 알아보겠습니다.
먼저 디바이스 자체에서 지문인식기능이 있어야 가능합니다.
그리고 지문을 등록해 놓은 상태여야 하죠.
앱 내에서 지문을 추가할 수는 없고,
기존에 설정 -> 보안에서 지문을 등록해 놓았을 때 사용 가능합니다.
가장 먼저 manifest.xml 에 permission을 추가해 주어야 합니다.
1 | <uses-permission android:name="android.permission.USE_FINGERPRINT"/> | cs |
그리고 아래 클래스를 만들어 주세요.
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 | import android.annotation.TargetApi; import android.content.Context; import android.content.Intent; import android.hardware.fingerprint.FingerprintManager; import android.os.Build; import android.os.CancellationSignal; import android.os.Handler; import android.support.v7.app.AppCompatActivity; import android.widget.ImageView; import android.widget.Toast; /* * Created by 15U560 on 2017-12-06. */ @TargetApi(Build.VERSION_CODES.M) public class FingerPrintHandler extends FingerprintManager.AuthenticationCallback { private Context appContext; public FingerPrintHandler(Context context) { this.appContext = context; } public void startAuth(FingerprintManager manager, FingerprintManager.CryptoObject cryptoObject) { CancellationSignal cancellationSignal = new CancellationSignal(); manager.authenticate(cryptoObject, cancellationSignal, 0, this, null); } @Override public void onAuthenticationError(int errMsgId, CharSequence errString) { Toast.makeText(appContext, "Authentication error\n" + errString, Toast.LENGTH_LONG).show(); } @Override public void onAuthenticationHelp(int helpMsgId, CharSequence helpString) { Toast.makeText(appContext, "Authentication help\n" + helpString, Toast.LENGTH_LONG).show(); } @Override public void onAuthenticationFailed() { Toast.makeText(appContext, "등록되지 않은 지문입니다." , Toast.LENGTH_LONG).show(); } @Override public void onAuthenticationSucceeded( FingerprintManager.AuthenticationResult result) { Toast.makeText(appContext, "Authentication success\n" + errString, Toast.LENGTH_LONG).show(); } } | cs |
그리고 지문인식을 실행할 액티비티를 만들어주고,
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 | import android.annotation.TargetApi; import android.databinding.DataBindingUtil; import android.hardware.fingerprint.FingerprintManager; import android.os.Build; import android.os.Bundle; import android.security.keystore.KeyGenParameterSpec; import android.security.keystore.KeyPermanentlyInvalidatedException; import android.security.keystore.KeyProperties; import android.support.annotation.Nullable; import java.io.IOException; import java.security.InvalidAlgorithmParameterException; import java.security.InvalidKeyException; import java.security.KeyStore; import java.security.KeyStoreException; import java.security.NoSuchAlgorithmException; import java.security.NoSuchProviderException; import java.security.UnrecoverableKeyException; import java.security.cert.CertificateException; import javax.crypto.Cipher; import javax.crypto.KeyGenerator; import javax.crypto.NoSuchPaddingException; import javax.crypto.SecretKey; import altong.mon.amtalk.BaseActivity; import altong.mon.amtalk.FingerPrintHandler; import altong.mon.amtalk.R; import altong.mon.amtalk.databinding.ActivityFingerprintBinding; /* * Created by 15U560 on 2017-12-06. */ @TargetApi(Build.VERSION_CODES.M) public class FingerPrintActivity extends BaseActivity { private static final String TAG = FingerPrintActivity.class.getSimpleName(); private FingerprintManager manager; private KeyStore keyStore; private KeyGenerator keyGenerator; private static final String KEY_NAME = "example_key"; private Cipher cipher; private FingerprintManager.CryptoObject cryptoObject; ActivityFingerprintBinding binding; @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); binding = DataBindingUtil.setContentView(this, R.layout.activity_fingerprint); manager = (FingerprintManager)getSystemService(FINGERPRINT_SERVICE); //KeyguardManager keyguardManager = (KeyguardManager) getSystemService(KEYGUARD_SERVICE); generateKey(); if (cipherInit()) { cryptoObject = new FingerprintManager.CryptoObject(cipher); FingerPrintHandler helper = new FingerPrintHandler(this, this, binding.fingerPrintImgView); helper.startAuth(manager, cryptoObject); } } @TargetApi(Build.VERSION_CODES.M) protected void generateKey() { try { keyStore = KeyStore.getInstance("AndroidKeyStore"); } catch (Exception e) { e.printStackTrace(); } try { keyGenerator = KeyGenerator.getInstance( KeyProperties.KEY_ALGORITHM_AES, "AndroidKeyStore"); } catch (NoSuchAlgorithmException | NoSuchProviderException e) { throw new RuntimeException( "Failed to get KeyGenerator instance", e); } try { keyStore.load(null); keyGenerator.init(new KeyGenParameterSpec.Builder(KEY_NAME, KeyProperties.PURPOSE_ENCRYPT | KeyProperties.PURPOSE_DECRYPT) .setBlockModes(KeyProperties.BLOCK_MODE_CBC) .setUserAuthenticationRequired(true) .setEncryptionPaddings( KeyProperties.ENCRYPTION_PADDING_PKCS7) .build()); keyGenerator.generateKey(); } catch (NoSuchAlgorithmException | InvalidAlgorithmParameterException | CertificateException | IOException e) { throw new RuntimeException(e); } } @TargetApi(Build.VERSION_CODES.M) public boolean cipherInit() { try { cipher = Cipher.getInstance( KeyProperties.KEY_ALGORITHM_AES + "/" + KeyProperties.BLOCK_MODE_CBC + "/" + KeyProperties.ENCRYPTION_PADDING_PKCS7); } catch (NoSuchAlgorithmException | NoSuchPaddingException e) { throw new RuntimeException("Failed to get Cipher", e); } try { keyStore.load(null); SecretKey key = (SecretKey) keyStore.getKey(KEY_NAME, null); cipher.init(Cipher.ENCRYPT_MODE, key); return true; } catch (KeyPermanentlyInvalidatedException e) { return false; } catch (KeyStoreException | CertificateException | UnrecoverableKeyException | IOException | NoSuchAlgorithmException | InvalidKeyException e) { throw new RuntimeException("Failed to init Cipher", e); } } } | cs |
그리고 이제 실행해서 지문 인식 센서에 지문을 인식 시켜 보시면,
성공, 실패 등의 토스트 메시지가 나올거에요.
layout은 각자 하시고 싶으신대로 진행하시면 됩니다.
저는 현재 만들고 있는 채팅 앱에 처음 들어갈 때 지문인식으로 보안을 해제하는
카카오톡과 같은 방법으로 만들어 보았습니다.
추후에 비밀번호도 넣을 수 있게 하려 합니다.
영상입니다.
이상입니다.
감사합니다~
반응형
'안드로이드' 카테고리의 다른 글
안드로이드 다이얼로그 라이브러리 소개! Android Dialog Library - afollestad/material-dialogs (0) | 2018.03.23 |
---|---|
안드로이드 Volley http 라이브러리 사용 예제! (0) | 2018.01.05 |
안드로이드 네이버 아이디 로그인[2] : 유저 이름, 프로필 이미지, 별명, 이메일 등 개인정보 불러오기 (4) | 2017.12.06 |
안드로이드 ImageView 완전 동그랗게 만드는 방법 ( 라이브러리 없이 ) (16) | 2017.12.05 |
안드로이드 스튜디오에서 나인패치(9-patch) 이미지 만들고 영역설정하기 (0) | 2017.12.04 |