Android R 指纹录入流程
android指纹录入的入口在设置界面。设置特殊锁屏(Pattern, Pin, Password)之后可以录入指纹。
1.FingerprintEnrollIntroduction.java
首先会看到一个引导界面就是 FingerprintEnrollIntroduction类(图1)。
// packages\apps\Settings\src\com\android\settings\biometrics\fingerprint\FingerprintEnrollIntroduction.java
public class FingerprintEnrollIntroduction extends BiometricEnrollIntroduction {
private static final String TAG = "FingerprintIntro";
private FingerprintManager mFingerprintManager;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mFingerprintManager = Utils.getFingerprintManagerOrNull(this);
mFooterBarMixin = getLayout().getMixin(FooterBarMixin.class);
//添加skip按钮 点击后调用onCancelButtonClick方法
mFooterBarMixin.setSecondaryButton(
new FooterButton.Builder(this)
.setText(R.string.security_settings_face_enroll_introduction_cancel)
.setListener(this::onCancelButtonClick)
.setButtonType(FooterButton.ButtonType.SKIP)
.setTheme(R.style.SudGlifButton_Secondary)
.build()
);
//添加下一步按钮 这个点击后调用onNextButtonClick方法
mFooterBarMixin.setPrimaryButton(
new FooterButton.Builder(this)
.setText(R.string.wizard_next)
.setListener(this::onNextButtonClick)
.setButtonType(FooterButton.ButtonType.NEXT)
.setTheme(R.style.SudGlifButton_Primary)
.build()
);
}
}
onNextButtonClick 和 onCancelButtonClick 是在BiometricEnrollIntroduction 中定义。
// packages\apps\Settings\src\com\android\settings\biometrics\BiometricEnrollIntroduction.java
public abstract class BiometricEnrollIntroduction extends BiometricEnrollBase
implements LinkSpan.OnClickListener {
@Override
protected void onNextButtonClick(View view) {
mNextClicked = true;
// 判断是否达到最大录入指纹数量
if (checkMaxEnrolled() == 0) {
// Lock thingy is already set up, launch directly to the next page
// 没达到上限
launchNextEnrollingActivity(mToken);
} else {
setResult(RESULT_FINISHED);
finish();
}
}
// 点击后退出
protected void onCancelButtonClick(View view) {
finish();
}
//启动下个录入环节的Activity
private void launchNextEnrollingActivity(byte[] token) {
// getEnrollingIntent()是一个抽象方法 被子类实现
Intent intent = getEnrollingIntent();
if (token != null) {
intent.putExtra(ChooseLockSettingsHelper.EXTRA_KEY_CHALLENGE_TOKEN, token);
}
if (mUserId != UserHandle.USER_NULL) {
intent.putExtra(Intent.EXTRA_USER_ID, mUserId);
}
intent.putExtra(EXTRA_FROM_SETTINGS_SUMMARY, mFromSettingsSummary);
startActivityForResult(intent, BIOMETRIC_FIND_SENSOR_REQUEST);
}
}
getEnrollingIntent()在其子类 FingerprintEnrollIntroduction中实现
@Override
protected Intent getEnrollingIntent() {
return new Intent(this, FingerprintEnrollFindSensor.class);
}
启动FingerprintEnrollFindSensor这个Activity
2.FingerprintEnrollFindSensor.java
这个Activity就是图2界面所显示的Activity。
//packages\apps\Settings\src\com\android\settings\biometrics\fingerprint\FingerprintEnrollFindSensor.java
public class FingerprintEnrollFindSensor extends BiometricEnrollBase {
@Nullable
private FingerprintFindSensorAnimation mAnimation;
private FingerprintEnrollSidecar mSidecar;
private boolean mNextClicked;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(getContentView());
mFooterBarMixin = getLayout().getMixin(FooterBarMixin.class);
mFooterBarMixin.setSecondaryButton(
new FooterButton.Builder(this)
.setText(R.string.skip_label)
.setListener(this::onSkipButtonClick)
.setButtonType(FooterButton.ButtonType.SKIP)
.setTheme(R.style.SudGlifButton_Secondary)
.build()
);
setHeaderText(R.string.security_settings_fingerprint_enroll_find_sensor_title);
// 监听指纹器件
startLookingForFingerprint(); // already confirmed, so start looking for fingerprint
View animationView = findViewById(R.id.fingerprint_sensor_location_animation);
if (animationView instanceof FingerprintFindSensorAnimation) {
mAnimation = (FingerprintFindSensorAnimation) animationView;
} else {
mAnimation = null;
}
}
private void startLookingForFingerprint() {
mSidecar = (FingerprintEnrollSidecar) getSupportFragmentManager().findFragmentByTag(
FingerprintEnrollEnrolling.TAG_SIDECAR);
if (mSidecar == null) {
mSidecar = new FingerprintEnrollSidecar();
getSupportFragmentManager().beginTransaction()
.add(mSidecar, FingerprintEnrollEnrolling.TAG_SIDECAR)
.commitAllowingStateLoss();