??常用開發(fā)工具類和自定義view召夹,無恥的求個star:
??https://github.com/AbrahamCaiJin/CommonUtilLibrary
??最近開始做項目的時候跪楞,需要用到Android中的指紋識別浙踢,剛開始實在是有點懵逼甲葬,主要是別人給的意見讓我把思路給堵住了类少,現(xiàn)在回過頭來看看缀匕,其實也是意見很簡單的事艺蝴,不過最開始是因為Android6.0才剛出來沒多久腿准,對于指紋識別沒有過多的介紹贺嫂。也有哥們問過我通過指紋識別來進行登錄滓鸠,支付等操作,其實都是一樣的第喳。有指紋識別的手機可以通知指紋來實現(xiàn)糜俗,沒有的就換一種思路嘛,判斷一下曲饱,采用原始的輸入密碼也是一樣的∮颇ǎ現(xiàn)在把自己的一些收獲記錄下來,希望能夠幫助到其他人扩淀。不了解指紋識別的可以先看看這兩篇博客锌钮,對于你理解指紋識別是有幫助的。
http://blog.csdn.net/baniel01/article/details/51991764
http://blog.csdn.net/u011468824/article/details/51437795
在此對兩位博主表示感謝引矩。還有在我做指紋識別的時候?qū)ξ規(guī)椭囊晃煌辛呵穑卜浅8兄x。
主要代碼記錄如下:
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媒怯,歡迎評論,歡迎指正