Tutorial Fingerprint - Sử dụng cảm biến vân tay



Kể từ phiên bản 6.0, Android đã hỗ trợ thêm chức năng bảo mật bằng vân tay.
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 touch 
finger_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" />

MainActivity.java
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





SHARE

GivesTech

  • Image
  • Image
  • Image
  • Image
  • Image
    Blogger Comment
    Facebook Comment

0 nhận xét:

Đăng nhận xét