Android10以下の生体認証の動き
Android10以下でDeviceCredentialsやBiometricAuth(いわゆる画面ロック解除ね)を使う場合、SDK内部の動きとしては、IntentでOSの機能に飛ばしている。
結果はonActivityResultに返ってくるので、従来は固有のRequestCodeをつけて結果の判別をしていた。
AndroidXライブラリの登場
その後、AndroidXライブラリの登場によってOSバージョンごとの実装をしなくても良くなった。
ところが今度は「タスク復帰も生体認証から戻ってきたときも、アプリの状態として同じ判定を受ける」という別の問題が発生。
さらに、RequestCodeは起動の都度変わっていた。
困りどころ
ActivityのonStart,onResumeでタスク復帰時の処理をしていたので大いに困った。
今回は、onActivityResultで画面ロック解除成功(RESULT_OK)を通った時のonStartだけ、「生体認証成功時の処理」にしたい。
解決策
LifecycleCoroutineScopeを使う。
この記事が参考になった。
https://qiita.com/HanaleiMoon/items/4735f977b9ef1be8bde2
サンプルコード
Android10以下では、onActivityResult(Depricatedですが)に結果が渡ってくるので、onActivityResultで「RESULT_OK,処理成功」をキャッチしたら、このあと呼ばれるonStartでlifecycleScope.launchWhenStarted{}内に書いた処理が走る(== onResumeが呼ばれる前に走る)、という流れにしていきます。
@Deprecated("Deprecated in Java")
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
super.onActivityResult(requestCode, resultCode, data)
activityResultCode = resultCode
lifecycleScope.launchWhenStarted {
if (resultCode == -1) {//生体認証がとおったら == RESULT_OK == -1
//次回onResumeの時に生体認証を走らせない
mainViewModel.disableBiometric()
}
}
}
ちなみに
AppLifecycleを噛ませる方法でも結果一緒でした。
あれは同一パッケージ内のActivity遷移でonResumeを通らないもので、今回はOSの機能に飛ばしているせいかガッツリ通っていた。
onActivityResultがDeprecatedなのは一旦見逃してください...