LoginSignup
0
0

Android10以下と11以上で生体認証の挙動が違う件

Last updated at Posted at 2023-05-25

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が呼ばれる前に走る)、という流れにしていきます。

MainActivity.kt
@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なのは一旦見逃してください...

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0