public class BioFingerprintActivity extends DeviceCVMKeyguardActivity {
private static String TAG = BioFingerprintActivity.class.getName();
private PaymentBusinessService paymentBusinessService;
private DeviceCVMVerifier deviceCVMVerifier;
private CancellationSignal cancellationSignal;
private TextView message;
private boolean isBioFPVerificationStarted = false;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_bio_fingerprint_2);
unlockAndWake();
Bundle extras = getIntent().getExtras();
// バンドルで渡された cvm オブジェクトを取得する
CHVerificationMethod cvm = (CHVerificationMethod) extras.getSerializable(Tags.CVM);
message = (TextView) findViewById(R.id.message);
paymentBusinessService = PaymentBusinessManager.getPaymentBusinessService();
PaymentService paymentService = paymentBusinessService.getActivatedPaymentService();
// cvm オブジェクトのおかげで 'DeviceCVMVerifier' のインスタンスを取得する
deviceCVMVerifier = (DeviceCVMVerifier) paymentService.getCHVerifier(cvm);
// 対応するリスナーを設定する
deviceCVMVerifier.setDeviceCVMVerifyListener(new DeviceCVMVerifyListener() {
@Override
public void onVerifySuccess() {
// 検証は成功しました!
message.setText("");
BioFingerprintActivity.this.finish();
}
@Override
public void onVerifyError(int errorCode, CharSequence charSequence) {
Log.d(TAG, "BioFingerprintActivity:error :" + errorCode);
// ロックスクリーンモードでトリガーされた特殊なケース
// FINGERPRINT_ERROR_CANCELED エラーが発生する
if (errorCode == FingerprintManager.FINGERPRINT_ERROR_CANCELED) {
Log.d(TAG, "restart Fp");
if (cancellationSignal != null)
cancellationSignal.cancel();
isBioFPVerificationStarted=true;
cancellationSignal = new CancellationSignal();
DeviceCVMVerifierInput input = new DeviceCVMVerifierInput(cancellationSignal);
deviceCVMVerifier.startAuthentication(input);
}
// エラーコードの通常の処理
else {
message.setText(charSequence + ". もう一度お試しください...");
if(errorCode == FingerprintManager.FINGERPRINT_ERROR_LOCKOUT) {
confirmCredential("キーガードで検証", "試行回数が多すぎます。PIN / パターン / パスワードで検証してください");
}
}
}
@Override
public void onVerifyFailed() {
message.setText("指紋を認識できませんでした。もう一度お試しください。");
}
@Override
public void onVerifyHelp(int i, CharSequence charSequence) {
message.setText(charSequence + ". もう一度お試しください。");
}
});
deviceCVMVerifier.setKeyguardActivity(this);
cancellationSignal = new CancellationSignal();
// 画面がオンでロック解除されているときに認証を開始する
if (DeviceUtil.isDeviceScreenOn(getApplicationContext())) {
Log.d(TAG, "Starting Fingerprint authentication");
DeviceCVMVerifierInput input = new DeviceCVMVerifierInput(cancellationSignal);
deviceCVMVerifier.startAuthentication(input);
} else {
Log.d(TAG, "Screen is de-activated, skipping Fingerprint authentication");
}
}
/* 指紋検証が失敗した場合、次のコールバックを実装して
キーガード検証へフォールバックすることが可能です。
**/
public void onKeyguardFallback(View v) {
Log.d(TAG, "onKeyguardFallback");
// deviceCVMVerifier.startAuthentication(input) を呼び出す
}
@Override
public void onCancel(View v) {
Log.d(TAG, "Cancel authentication");
cancelTransaction("取引はキャンセルされました。");
}
@Override
public void onBackPressed() {
Log.d(TAG, "onBackPressed()");
cancelTransaction("取引はキャンセルされました。");
}
/*
指紋生体認証をキャンセルした後、Payment サービスは無効化されるべきです
**/
private void cancelTransaction(String message) {
if (cancellationSignal != null) {
cancellationSignal.cancel();
}
PaymentBusinessManager.getPaymentBusinessService().deactivate();
}
}