侧边指纹
主要利用了电容式指纹解锁,它是一种通过测量指纹凹陷处与指纹图案的电容变化来识别指纹的技术。
电容式指纹解锁原理
电容式指纹解锁是使用微型电容器电路阵列收集数据。由于电容器可以存储电荷,将它们连接到指纹解锁按钮表面的导体板上可用于获取指纹细节。当手指放在解锁按钮上的时候,由于人体的导电性,指纹凸起处存储的电荷会略微改变。相反地,指纹凹陷处的空气间隙会使电容器中的电荷保持相对不变。通过记录这些信息,并使用运算放大器来渲染这些变化,最后用模数转换器记录下来。
电容式指纹解锁优缺点
优点是解锁速度相对快,比起光学式屏下指纹,安全性更高,因为理论上光学式屏下指纹用一张图像就能破解,而电容式指纹解锁能避免这个问题。
缺点在于容易误触,经常掏出手机发现指纹验证失败请输入密码解锁的提示。侧边指纹也会导致手机的边框变厚,影响整体的屏占比。
屏下指纹
手机屏下指纹识别方案有光学式指识别和超声波指纹识别两种。光学式指纹识别能兼容OLED软硬屏,超声波指纹识别则更适用于柔性OLED 屏幕,因此OLED屏幕是实现屏下指纹识别方案的前提,充当着指纹识别系统的光源。屏下指纹识别方案对于手机指纹识别区域的亮度要求较高,OLED屏幕能自发光,是理想的光源体,且厚度很薄,能够满足指纹模组的需求。
屏下指纹模组原理
当我们将手指放在手机屏幕上的指纹识别区域时,OLED屏幕通过自发光会照亮指纹,经由屏幕光的反射,将指纹汇集到指纹识别系统,再将采集的指纹图像由光学信号转化为电信号,经过处理芯片分析对比后完成指纹识别。
屏下指纹识别的优缺点
优点:
1. 屏下指纹识别无需按钮即可实现,具有很高的灵活性,解锁快速、方便,还能提升手机的屏占比,使手机更轻薄。
2. 屏下指纹识别准确性高,以智能识别系统读取手指数据,创建指纹三维结构图,在各种情况下都能高效识别。
缺点:
1. 目前屏下指纹识别只支持OLED屏幕,在LCD屏幕的应用还存在一定技术难题。
2. 相比传统指纹解锁,屏下指纹识别的功耗较高,进行指纹识别时,区域亮度会瞬间提高,对于手机电池和处理器的要求较高。
3. 长时间在同一区域进行指纹识别,屏幕高亮可能会使手机屏幕加快老化,出现烧屏现象。
指纹录入流程
Settings里面有3个版本的指纹录入界面,对应的代码目录分别为Settings/src/com/android/settings/biometrics/fingerprint,Settings/src/com/android/settings/biometrics/fingerprint2,Settings/src/com/android/settings/biometrics2。其中后两者为新版界面。
查看代码逻辑,使用的是旧版界面
public boolean onPreferenceTreeClick(Preference pref) {
final String key = pref.getKey();
if (KEY_FINGERPRINT_ADD.equals(key)) {
mIsEnrolling = true;
Intent intent = new Intent();
if (FeatureFlagUtils.isEnabled(getContext(),
FeatureFlagUtils.SETTINGS_BIOMETRICS2_ENROLLMENT)) {
intent.setClassName(SETTINGS_PACKAGE_NAME,
FingerprintEnrollmentActivity.InternalActivity.class.getName());
intent.putExtra(EnrollmentRequest.EXTRA_SKIP_FIND_SENSOR, true);
} else {
intent.setClassName(SETTINGS_PACKAGE_NAME,
FingerprintEnrollEnrolling.class.getName());
}
intent.putExtra(Intent.EXTRA_USER_ID, mUserId);
intent.putExtra(ChooseLockSettingsHelper.EXTRA_KEY_CHALLENGE_TOKEN, mToken);
if (mCalibrator != null) {
intent.putExtras(mCalibrator.getExtrasForNextIntent());
}
startActivityForResult(intent, ADD_FINGERPRINT_REQUEST);
} else if (pref instanceof FingerprintPreference) {
FingerprintPreference fpref = (FingerprintPreference) pref;
final Fingerprint fp = fpref.getFingerprint();
showRenameDialog(fp);
}
return super.onPreferenceTreeClick(pref);
}
public static boolean isEnabled(Context context, String feature) {
// Override precedence:
// Settings.Global -> sys.fflag.override.* -> static list
// Step 1: check if feature flag is set in Settings.Global.
String value;
if (context != null) {
value = Settings.Global.getString(context.getContentResolver(), feature);
if (!TextUtils.isEmpty(value)) {
return Boolean.parseBoolean(value);
}
}
// Step 2: check if feature flag has any override.
// Flag name: [persist.]sys.fflag.override.<feature>
value = SystemProperties.get(*getSystemPropertyPrefix(feature) + feature);
if (!TextUtils.isEmpty(value)) {
return Boolean.parseBoolean(value);
}
// Step 3: check if feature flag has any default value.
value = getAllFeatureFlags().get(feature);
return Boolean.parseBoolean(value);
}
public static Map<String, String> getAllFeatureFlags() {
return DEFAULT_FLAGS;
}
static {
DEFAULT_FLAGS = new HashMap<>();
......
DEFAULT_FLAGS.put(SETTINGS_BIOMETRICS2_FINGERPRINT_SETTINGS, "false");
// TODO: b/298454866 Replace with Trunk Stable Feature Flag
DEFAULT_FLAGS.put(SETTINGS_REMOTEAUTH_ENROLLMENT_SETTINGS, "false");
}
整个指纹录入流程如下,进入指纹录入页面会通过框架间接调用到底层的录入接口,当手指按压识别区域时,底层会通过回调的方式先传递框架,然后传递到Settings。
指纹识别流程
当录入指纹后,进入锁屏界面,可以使用指纹识别,具体流程如下: