Android指紋識別

??常用開發(fā)工具類和自定義view,無恥的求個star:
??https://github.com/AbrahamCaiJin/CommonUtilLibrary
??最近開始做項目的時候,需要用到Android中的指紋識別,剛開始實在是有點懵逼,主要是別人給的意見讓我把思路給堵住了,現(xiàn)在回過頭來看看,其實也是意見很簡單的事,不過最開始是因為Android6.0才剛出來沒多久,對于指紋識別沒有過多的介紹。也有哥們問過我通過指紋識別來進行登錄,支付等操作,其實都是一樣的。有指紋識別的手機可以通知指紋來實現(xiàn),沒有的就換一種思路嘛,判斷一下,采用原始的輸入密碼也是一樣的?,F(xiàn)在把自己的一些收獲記錄下來,希望能夠幫助到其他人。不了解指紋識別的可以先看看這兩篇博客,對于你理解指紋識別是有幫助的。
http://blog.csdn.net/baniel01/article/details/51991764
http://blog.csdn.net/u011468824/article/details/51437795
在此對兩位博主表示感謝。還有在我做指紋識別的時候?qū)ξ規(guī)椭囊晃煌?,也非常感謝。
主要代碼記錄如下:

import android.Manifest; 
import android.app.KeyguardManager; 
import android.content.Context; 
import android.content.Intent; 
import android.content.pm.PackageManager; 
import android.hardware.fingerprint.FingerprintManager; 
import android.os.Bundle; 
import android.os.CancellationSignal; 
import android.support.v4.app.ActivityCompat; 
import android.support.v4.app.FragmentActivity; 
import android.util.Log; 
import android.view.View; 
import android.widget.Button; 
import android.widget.Toast;

public class MainActivity extends FragmentActivity { 
FingerprintManager manager; 
KeyguardManager mKeyManager; 
private final static int REQUEST_CODE_CONFIRM_DEVICE_CREDENTIALS = 0; 
private final static String TAG = “finger_log”;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    manager = (FingerprintManager) this.getSystemService(Context.FINGERPRINT_SERVICE);
    mKeyManager = (KeyguardManager) this.getSystemService(Context.KEYGUARD_SERVICE);
    Button btn_finger = (Button) findViewById(R.id.btn_activity_main_finger);
    btn_finger.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            if (isFinger()) {
                Toast.makeText(MainActivity.this, "請進行指紋識別", Toast.LENGTH_LONG).show();
                Log(TAG, "keyi");
                startListening(null);
            }
        }
    });
}

public boolean isFinger() {
    if (!manager.isHardwareDetected()) {
        Toast.makeText(this, "沒有指紋識別模塊", Toast.LENGTH_SHORT).show();
        return false;
    }
    if (!mKeyManager.isKeyguardSecure()) {
        Toast.makeText(this, "沒有開啟鎖屏密碼", Toast.LENGTH_SHORT).show();
        return false;
    }
    if (!manager.hasEnrolledFingerprints()) {
        Toast.makeText(this, "沒有錄入指紋", Toast.LENGTH_SHORT).show();
        return false;
    }
    return true;
}

CancellationSignal mCancellationSignal = new CancellationSignal();
//回調(diào)方法
FingerprintManager.AuthenticationCallback mSelfCancelled = new FingerprintManager.AuthenticationCallback() {
    @Override
    public void onAuthenticationError(int errorCode, CharSequence errString) {
        //但多次指紋密碼驗證錯誤后,進入此方法;并且,不能短時間內(nèi)調(diào)用指紋驗證
        Toast.makeText(MainActivity.this, errString, Toast.LENGTH_SHORT).show();
        showAuthenticationScreen();
    }
    @Override
    public void onAuthenticationHelp(int helpCode, CharSequence helpString) {

        Toast.makeText(MainActivity.this, helpString, Toast.LENGTH_SHORT).show();
    }
    @Override
    public void onAuthenticationSucceeded(FingerprintManager.AuthenticationResult result) {
        Toast.makeText(MainActivity.this, "指紋識別成功", Toast.LENGTH_SHORT).show();
    }
    @Override
    public void onAuthenticationFailed() {
        Toast.makeText(MainActivity.this, "指紋識別失敗", Toast.LENGTH_SHORT).show();
    }
};
public void startListening(FingerprintManager.CryptoObject cryptoObject) {
    //android studio 上,沒有這個會報錯
    if (ActivityCompat.checkSelfPermission(this, Manifest.permission.USE_FINGERPRINT) != PackageManager.PERMISSION_GRANTED) {
        Toast.makeText(this, "沒有指紋識別權(quán)限", Toast.LENGTH_SHORT).show();
        return;
    }
    manager.authenticate(cryptoObject, mCancellationSignal, 0, mSelfCancelled, null);

}

private void showAuthenticationScreen() {
    Intent intent = mKeyManager.createConfirmDeviceCredentialIntent("finger", "測試指紋識別");
    if (intent != null) {
        startActivityForResult(intent, REQUEST_CODE_CONFIRM_DEVICE_CREDENTIALS);
    }
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (requestCode == REQUEST_CODE_CONFIRM_DEVICE_CREDENTIALS) {
        // Challenge completed, proceed with using cipher
        if (resultCode == RESULT_OK) {
            Toast.makeText(this, "識別成功", Toast.LENGTH_SHORT).show();
        } else {
            Toast.makeText(this, "識別失敗", Toast.LENGTH_SHORT).show();
        }
    }
}
private void Log(String tag, String msg) {
    Log.d(tag, msg);
}
} 

??有人可能會想了,這應(yīng)該只能在6.0以上的手機才能用吧,不是的,因為6.0以前也有指紋識別的手機,不過現(xiàn)在android生產(chǎn)廠商太多了,機制不一樣可能會遇到不同的問題,我是這樣解決的。首先第一種,只支持6.0以上的指紋識別的手機,就是在調(diào)用指紋識別的時候先判斷一下sdk。但是這對于大多數(shù)是不太現(xiàn)實的,至少現(xiàn)在是這樣,第二種就是實現(xiàn)指紋識別的時候可以采用FingerprintManagerCompat這個類來實現(xiàn),這個是v4包的可以兼容6.0以下的,但是在6.0以上不知道是不是有問題,有興趣的可以去了解一下。還有最后一種解決的方式,就是在調(diào)用指紋識別的時候,可以采用反射的方式來判斷手機是否支持指紋識別,或者說手機是否支持指紋識別的類
Class.forName(“android.hardware.fingerprint.FingerprintManager”);
這個就是上面提到的網(wǎng)友幫我想到的辦法,這樣基本上所有的手機就可以正常使用了。

更多詳細內(nèi)容:http://blog.csdn.net/u014727709/article/details/53325732

最后附上下載地址,有需要的可以前去
http://download.csdn.net/detail/u014727709/9692836

歡迎start,歡迎評論,歡迎指正

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容