編輯:關於android開發
安卓指紋認證使用智能手機觸摸傳感器對用戶進行身份驗證。Android Marshmallow(棉花糖)提供了一套API,使用戶很容易使用觸摸傳感器。在Android Marshmallow之前訪問觸摸傳感器的方法不是標准的。
本文地址:http://wuyudong.com/2016/12/15/3146.html,轉載請注明出處。
使用安卓指紋認證有幾個好處:
1、更快更容易使用
2、安全:指紋可以識別你的身份唯一
3、在線交易更加的容易
在使用android指紋識別之前你必須遵循一些步驟,可能看起來真的很復雜,但本文將教你你一步一步實現。
結果就像下圖顯示的那樣:
就如上面所說,指紋認證過程有以下幾個步驟:
就是這些了,下面來實現上面的步驟!
在開始的時候,先得開啟觸摸傳感器與身份認證的權限,在清單文件 Manifest.xml 中添加:
<uses-permission android:name="android.permission.USE_FINGERPRINT" />
現在是時候創建main activity 類來處理所有的認證步驟了.
第一步是確認鎖屏是否是安全的,這個可以使用 KeyguardManager 和FingerprintManager 來解決。 我們可以通過使用 getSystemService 類獲取它們的實例:
// Keyguard Manager KeyguardManager keyguardManager = (KeyguardManager) getSystemService(KEYGUARD_SERVICE); // Fingerprint Manager fingerprintManager = (FingerprintManager) getSystemService(FINGERPRINT_SERVICE);
現在,我們的認證應用可以檢查是否所有的安全判斷都滿足:
private boolean checkFinger() { // Keyguard Manager KeyguardManager keyguardManager = (KeyguardManager) getSystemService(KEYGUARD_SERVICE); // Fingerprint Manager fingerprintManager = (FingerprintManager) getSystemService(FINGERPRINT_SERVICE); try { // Check if the fingerprint sensor is present if (!fingerprintManager.isHardwareDetected()) { // Update the UI with a message message.setText("Fingerprint authentication not supported"); return false; } if (!fingerprintManager.hasEnrolledFingerprints()) { message.setText("No fingerprint configured."); return false; } if (!keyguardManager.isKeyguardSecure()) { message.setText("Secure lock screen not enabled"); return false; } } catch(SecurityException se) { se.printStackTrace(); } return true; }
注意到應用程序驗證了至少有一個指紋已經注冊否則認證過程將不會開始,下面的圖片展示了如果沒有發現注冊指紋提示一個錯誤信息
如果一切就緒,一切判斷情況都滿足,認證應用產生密鑰並訪問Android store.
接下來的步驟就是訪問Android keystore 並產生密鑰來加密數據,應用程序在一個叫 generateKey() 的方法中單獨完成.
// Get the reference to the key store keyStore = KeyStore.getInstance("AndroidKeyStore");
接著必須獲得密鑰生成器的引用:
// Key generator to generate the key keyGenerator = KeyGenerator.getInstance(KeyProperties.KEY_ALGORITHM_AES, "AndroidKeyStore");
最後,我們必須初始化密鑰生成器:
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();
注意到我們特別指出密鑰的使用: 加密和解密並且認證需要使用密鑰,最後應用程序生成了密鑰 (最後一行).
上面的代碼完整的方法如下:
private void generateKey() throws FingerprintException { try { // Get the reference to the key store keyStore = KeyStore.getInstance("AndroidKeyStore"); // Key generator to generate the key keyGenerator = KeyGenerator.getInstance(KeyProperties.KEY_ALGORITHM_AES, "AndroidKeyStore"); 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(KeyStoreException | NoSuchAlgorithmException | NoSuchProviderException | InvalidAlgorithmParameterException | CertificateException | IOException exc) { exc.printStackTrace(); throw new FingerprintException(exc); } }
一旦密鑰准備好了,最後步驟就是使用之前生成的密鑰來創建Android Cipher ,代碼很簡單:
private Cipher generateCipher() throws FingerprintException { try { Cipher cipher = Cipher.getInstance(KeyProperties.KEY_ALGORITHM_AES + "/" + KeyProperties.BLOCK_MODE_CBC + "/" + KeyProperties.ENCRYPTION_PADDING_PKCS7); SecretKey key = (SecretKey) keyStore.getKey(KEY_NAME, null); cipher.init(Cipher.ENCRYPT_MODE, key); return cipher; } catch (NoSuchAlgorithmException | NoSuchPaddingException | InvalidKeyException | UnrecoverableKeyException | KeyStoreException exc) { exc.printStackTrace(); throw new FingerprintException(exc); } }
是時候將前面的方法組合起來創建我們的 Android 指紋識別app,這個app很簡單只有一個 MainClass
調用上面所示的方法開始認證處理.
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); message = (TextView) findViewById(R.id.fingerStatus); Button btn = (Button) findViewById(R.id.authBtn); final FingerprintHandler fph = new FingerprintHandler(message); if (!checkFinger()) { btn.setEnabled(false); } else { // We are ready to set up the cipher and the key try { generateKey(); Cipher cipher = generateCipher(); cryptoObject = new FingerprintManager.CryptoObject(cipher); } catch(FingerprintException fpe) { // Handle exception btn.setEnabled(false); } } btn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { message.setText("Swipe your finger"); fph.doAuth(fingerprintManager, cryptoObject); } }); }
有幾點需要注意的,首先,Android app 創建一個 CryptoObject
對象來處理認證過程,接著,app 一個button,當用戶點擊它的時候認證過程開始,當上面的初始化判斷條件不滿足的時候這個 button 被隱藏。需要注意的最重要的事情是新類調用FingerprintHandler
. 這個類是個接收認證處理事件的回調類,此外, 此類啟動認證過程的doauth方法.
最後一步是創建一個回調類,這樣我們可以接收事件消息並能夠知道什麼時候認證成功或者除了一些問題,這個類繼承自 FingerprintManager.AuthenticationCallback.
public class FingerprintHandler extends FingerprintManager.AuthenticationCallback { private TextView tv; public FingerprintHandler(TextView tv) { this.tv = tv; } @Override public void onAuthenticationError(int errorCode, CharSequence errString) { super.onAuthenticationError(errorCode, errString); tv.setText("Auth error"); } @Override public void onAuthenticationHelp(int helpCode, CharSequence helpString) { super.onAuthenticationHelp(helpCode, helpString); } @Override public void onAuthenticationSucceeded(FingerprintManager.AuthenticationResult result) { super.onAuthenticationSucceeded(result); tv.setText("auth ok"); tv.setTextColor(tv.getContext().getResources(). getColor(android.R.color.holo_green_light)); } @Override public void onAuthenticationFailed() { super.onAuthenticationFailed(); } public void doAuth(FingerprintManager manager, FingerprintManager.CryptoObject obj) { CancellationSignal signal = new CancellationSignal(); try { manager.authenticate(obj, signal, 0, this, null); } catch(SecurityException sce) {} } }
有一些重要的方法需要注意,首先,doAuth 開啟認證處理,這個方法包含 CryptoObject 對象,一個取消信號和回調監聽器。下面的圖片顯示了app 的響應動作:
這種情況下,用戶使用android指紋認證完成了認證。
要測試這個app,如果有可能使用具有傳感器的真機來進行,然而你還可以在模擬器上進行測試app,在使用app之前,你必須配置igure the fingerprint accessing to the Security menu. 當系統要求你的指紋的時候你必須使用adb 命令模擬指紋接觸:
adb -e emu finger touch id(like 1,2, ecc.)
最後,當你的指紋搞定,你將得到下面的提示:
最後希望你掌握了android 的指紋識別 api 並知道怎樣開發一款指紋識別 app 例子,enjoy
安卓應用的界面編程(4),安卓界面編程第三組UI組件:ImageView及其子類 主要功能是顯示圖片,任何Drawable對象都可使用ImageView來顯
Android MediaPlayer的生命周期,androidmediaplayerMediaPlayer的狀態轉換圖也表征了它的生命周期,如下: 這張
Android開發Tips(3) 1. UIAutomatorViewer 自動化測試是Android測試的趨勢, 穩定\復用, 最常用的工具就是Espresso. 使用
Android客戶端性能優化(魅族資深工程師毫無保留奉獻) 本文由魅族科技有限公司資深Android開發工程師degao(嵌入式企鵝圈原創團隊成員)撰寫,是degao