android API 23時新增的功能,指紋識別
主要類:FingerpringManager
在API28后,F(xiàn)ingerpringManager被遺棄,使用BiometricPrompt,此時授權(quán)識別的彈窗不能自定義,
只能使用官方統(tǒng)一彈窗,只能設(shè)置各個授權(quán)文案。各個開發(fā)商內(nèi)部實(shí)現(xiàn)可能不一致。
通過只是使用指紋識別,直接使用官方api即可,但出于安全或業(yè)務(wù)場景需求,很多都需要去檢測生物庫信息是否變更,
如指紋庫在重新指紋識別前是否發(fā)生變更,這個官方api就沒有提供方法,需要我們自己實(shí)現(xiàn)。
檢測指紋庫是否發(fā)生變更
參考:
通過檢測密鑰查看是否變更(http://www.itdecent.cn/p/dbb1a43cfb21)
在API28以前,指紋庫信息時可以通過反射獲取,獲取的信息有指紋id、groupId、指紋名稱、指紋個數(shù)、設(shè)備id等等,
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
Log.d(TAG, "getFingerPrintInfo: ");
FingerprintManager fingerprintManager = (FingerprintManager) getCurrentActivity().getSystemService(Context.FINGERPRINT_SERVICE);
try{
Class clz = Class.forName("android.hardware.fingerprint.FingerprintManager");
Method method = clz.getDeclaredMethod("getEnrolledFingerprints", new Class[]{});
method.setAccessible(true);
Object obj = method.invoke(fingerprintManager, null);
if (obj != null) {
Log.e(TAG, "objStr:" + JsonUtils.toJson(obj));
List<FingerprintBean> list = (List<FingerprintBean>) JsonUtils.fromJson(objStr, new TypeToken<List<FingerprintBean>>(){}.getType());
}
}catch (Exception e) {
e.printStackTrace();
}
}
而FingerprintBean是這樣的:
public class FingerprintBean implements Serializable {
private static final long serialVersionUID = 1L;
private long mDeviceId;
private long mFingerId;
private long mGroupId;
private String mName;
}
最理想的方式是我們反射獲取到這些指紋庫信息,然后將這些信息保存到本地,每次調(diào)用指紋識別時,獲取當(dāng)前指紋庫信息與之前的指紋庫信息比較,
只有不同即可判定指紋庫信息變更,
但在實(shí)際操作中,發(fā)現(xiàn)在手機(jī)上獲取到的指紋id只是簡單的1、2、3即指紋庫里的排列順序,而指紋名稱是可以隨意更改,groupId、deviceId都為0,
如果使用這些信息去校驗(yàn),錯誤率太高。
還有一種方式即是上面參考鏈接中的,
檢測指紋庫密鑰信息是否變更
但在上面鏈接那種方法中,有幾個問題:
1、增加、刪除指紋無法檢測
2、使用修改指紋的手指識別后才能檢測出修改
于是將反射、密鑰檢測兩者結(jié)合,
先反射獲取指紋庫信息,只是比較指紋庫指紋個數(shù),先判斷指紋個數(shù)是否發(fā)生變更,就可知道指紋庫信息變更了
如果指紋個數(shù)沒有變更,再來校驗(yàn)密鑰是否發(fā)生變化