Hôm nay mình xin hướng tạo một ứng dụng đơn giản để xem cảm biến vân tay hoạt đông như thế nào!
- Chuẩn bị một máy Android chạy hệ điều hành 6.0 trở lên và đương nhiên có hỗ trợ cảm biến vân tay.
- Nếu không có thiết bị thật thì ta có thể sử dụng máy ảo ủa Android Studio
+ Tạo một máy ảo API 23, mở nó lên.
+ Vào Settings -> Security -> Fingerprint
Để setup một fingerprint

Ở màn hình này, đương nhiên ta không thể dùng tay chạm lên đó được :D
ta sẽ dùng lệnh để giả lập hành động chạm vào cảm biến.
adb -e emu finger touchfinger_id là 1 dãy số id, vd: adb -e emu finger touch 123456
Sau khi đó nhận id, ta chọn Done. Nếu máy chưa cài password thì nó sẽ bắt cài rồi mới setup fingerprint.
Vậy là chúng ta đã chuẩn bị xong máy Android để test ứng dụng.
- Bây giờ chúng ta tạo mới một project
trong file manifest.xml, ta thêm quyền:
<uses-permission android:name="android.permission.USE_FINGERPRINT" />
package com.androidtmc.fingerprint; import android.annotation.TargetApi; import android.app.Activity; import android.app.KeyguardManager; import android.hardware.fingerprint.FingerprintManager; import android.os.Build; import android.os.CancellationSignal; import android.security.keystore.KeyGenParameterSpec; import android.security.keystore.KeyProperties; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.view.View; import android.widget.Button; import android.widget.TextView; import android.widget.Toast; import java.security.Signature; @SuppressWarnings("ResourceType") public class MainActivity extends AppCompatActivity { private Signature signature; private KeyguardManager keyguardManager; private FingerprintManager mFingerprintManager; private Button btnListen; @TargetApi(Build.VERSION_CODES.M) @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //create key signature = CreateKeyHelper.create(this); //check has ready set fingerprint on device keyguardManager = (KeyguardManager) getSystemService(Activity.KEYGUARD_SERVICE); mFingerprintManager = (FingerprintManager) getSystemService(Activity.FINGERPRINT_SERVICE); TextView tvMessage = (TextView) findViewById(R.id.tvMessage); btnListen = (Button) findViewById(R.id.btnListen); if(!mFingerprintManager.isHardwareDetected()) tvMessage.setText("This device is not support!"); if(!keyguardManager.isKeyguardSecure()){ tvMessage.setText("Secure lock screen hasn't set up.\n" + "\" + \"Go to 'Settings -> Security -> Fingerprint' to set up a fingerprint"); } else if(!mFingerprintManager.hasEnrolledFingerprints()){ tvMessage.setText("Go to 'Settings -> Security -> Fingerprint' and register at least one fingerprint"); } else{ tvMessage.setText("Please put your finger on device's finger sensor"); listenTouchSenor(); } btnListen.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { listenTouchSenor(); } }); } @TargetApi(Build.VERSION_CODES.M) public void listenTouchSenor(){ //listen action user touch on finger sensor FingerprintManager.CryptoObject cryptObject = new FingerprintManager.CryptoObject(signature); CancellationSignal cancellationSignal = new CancellationSignal(); FingerprintManager fingerprintManager = this.getSystemService(FingerprintManager.class); fingerprintManager.authenticate(cryptObject, cancellationSignal, 0, new FingerprintManager.AuthenticationCallback() { @Override public void onAuthenticationError(int errorCode, CharSequence errString) { super.onAuthenticationError(errorCode, errString); Toast.makeText(MainActivity.this, "Error: "+errString.toString(), Toast.LENGTH_SHORT).show(); } @Override public void onAuthenticationHelp(int helpCode, CharSequence helpString) { super.onAuthenticationHelp(helpCode, helpString); } @Override public void onAuthenticationSucceeded(FingerprintManager.AuthenticationResult result) { super.onAuthenticationSucceeded(result); btnListen.setVisibility(View.VISIBLE); Toast.makeText(MainActivity.this, "Success: "+result.toString(), Toast.LENGTH_SHORT).show(); } @Override public void onAuthenticationFailed() { super.onAuthenticationFailed(); Toast.makeText(MainActivity.this, "fail ", Toast.LENGTH_SHORT).show(); } }, null); } }
package com.androidtmc.fingerprint; import android.annotation.TargetApi; import android.content.Context; import android.os.Build; import android.security.KeyPairGeneratorSpec; import android.security.keystore.KeyGenParameterSpec; import android.security.keystore.KeyProperties; import java.io.IOException; import java.math.BigInteger; import java.security.InvalidAlgorithmParameterException; import java.security.InvalidKeyException; import java.security.KeyPairGenerator; import java.security.KeyStore; import java.security.KeyStoreException; import java.security.NoSuchAlgorithmException; import java.security.NoSuchProviderException; import java.security.PrivateKey; import java.security.Signature; import java.security.UnrecoverableKeyException; import java.security.cert.CertificateException; import java.security.spec.ECGenParameterSpec; import java.util.Calendar; import javax.security.auth.x500.X500Principal; /** * Created by cuong on 20/01/2016. */ public class CreateKeyHelper { private static final String KEY_NAME = "my_key"; @TargetApi(Build.VERSION_CODES.M) public static Signature create(Context context){ KeyPairGenerator keyPairGenerator = null; try { keyPairGenerator = KeyPairGenerator.getInstance(KeyProperties.KEY_ALGORITHM_EC, "AndroidKeyStore"); } catch (NoSuchAlgorithmException e) { e.printStackTrace(); } catch (NoSuchProviderException e) { e.printStackTrace(); } try { Calendar start = Calendar.getInstance(); Calendar end = Calendar.getInstance(); end.add(Calendar.YEAR, 1); KeyPairGeneratorSpec spec = new KeyPairGeneratorSpec.Builder(context) .setAlias(KEY_NAME) .setSubject(new X500Principal("CN=HealthECard Name, O=Minh Cuong")) .setSerialNumber(BigInteger.ONE) .setStartDate(start.getTime()) .setEndDate(end.getTime()) .build(); keyPairGenerator.initialize(spec); } catch (InvalidAlgorithmParameterException e) { e.printStackTrace(); } keyPairGenerator.generateKeyPair(); Signature signature = null; try { signature = Signature.getInstance("SHA256withRSA");//command for linux: keytool -list -v -keystore ~/.android/debug.keystore -alias androiddebugkey -storepass android -keypass android } catch (NoSuchAlgorithmException e) { e.printStackTrace(); } KeyStore keyStore = null; try { keyStore = KeyStore.getInstance("AndroidKeyStore"); } catch (KeyStoreException e) { e.printStackTrace(); } try { keyStore.load(null); } catch (IOException e) { e.printStackTrace(); } catch (NoSuchAlgorithmException e) { e.printStackTrace(); } catch (CertificateException e) { e.printStackTrace(); } PrivateKey key = null; try { key = (PrivateKey) keyStore.getKey(KEY_NAME, null); } catch (KeyStoreException e) { e.printStackTrace(); } catch (NoSuchAlgorithmException e) { e.printStackTrace(); } catch (UnrecoverableKeyException e) { e.printStackTrace(); } try { signature.initSign(key); } catch (InvalidKeyException e) { e.printStackTrace(); } return signature; } }
Download SourceCode