質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

Kotlin

Kotlinは、ジェットブレインズ社のアンドリー・ブレスラフ、ドミトリー・ジェメロフが開発した、 静的型付けのオブジェクト指向プログラミング言語です。

Android Emulator

Android EmulatorはアンドロイドのOSで起動しているアンドロイドのデバイスの機能をシミュレートするソフトウェアです。Emulatorは開発者に複数の違う設定を持ったデバイスを必要とすることなくアプリケーションを開発しテストすることが可能になります。

Q&A

0回答

2611閲覧

BiometricPromptでPINを利用する

stimlocy

総合スコア11

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

Kotlin

Kotlinは、ジェットブレインズ社のアンドリー・ブレスラフ、ドミトリー・ジェメロフが開発した、 静的型付けのオブジェクト指向プログラミング言語です。

Android Emulator

Android EmulatorはアンドロイドのOSで起動しているアンドロイドのデバイスの機能をシミュレートするソフトウェアです。Emulatorは開発者に複数の違う設定を持ったデバイスを必要とすることなくアプリケーションを開発しテストすることが可能になります。

0グッド

0クリップ

投稿2019/12/20 09:20

編集2022/01/12 10:55

BiometricPromptで、指紋認証を利用した本人確認を実装する際
指紋以外の方法でも認証を通過できるように、PIN/Password/Patternを許可したいと考えています。

環境

言語:Kotlin
エミュレータ:Pixel3(API29)

(budild.gradle 一部省略)

gradle

1apply plugin: 'com.android.application' 2apply plugin: 'kotlin-android' 3apply plugin: 'kotlin-android-extensions' 4 5 6android { 7 compileSdkVersion 29 8 buildToolsVersion "29.0.2" 9 defaultConfig { 10 minSdkVersion 27 11 targetSdkVersion 29 12 } 13} 14 15dependencies { 16 implementation fileTree(dir: 'libs', include: ['*.jar']) 17 implementation"org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version" 18 implementation 'androidx.appcompat:appcompat:1.1.0' 19 implementation 'androidx.core:core-ktx:1.1.0' 20 implementation 'androidx.constraintlayout:constraintlayout:1.1.3' 21 testImplementation 'junit:junit:4.12' 22 androidTestImplementation 'androidx.test.ext:junit:1.1.1' 23 androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0' 24 25 implementation 'androidx.biometric:biometric:1.0.0' 26}

実装内容

MainActivity

1class MainActivity : AppCompatActivity() { 2 3 private val status by lazy { findViewById<TextView>(R.id.textView_status) } 4 5 6 override fun onCreate(savedInstanceState: Bundle?) { 7 super.onCreate(savedInstanceState) 8 setContentView(R.layout.activity_main) 9 10 // Android端末に、PIN・指紋認証・パターン認証が設定されているかを確認 11 val keyguardManager = getSystemService(Context.KEYGUARD_SERVICE) as KeyguardManager 12 if (!keyguardManager.isKeyguardSecure) { 13 Toast.makeText(this, "PINとか設定されてないよ", Toast.LENGTH_SHORT).show() 14 } 15 16 findViewById<Button>(R.id.btnAuth).setOnClickListener { 17 val promptInfo = BiometricPrompt.PromptInfo.Builder() 18 .setTitle("タイトル") 19 .setSubtitle("サブタイトル") 20 .setDescription("認証テストに使うよ") 21 .setDeviceCredentialAllowed(true) // Allow Pin/Password/Pattern 22 .build() 23 val handler = Handler() 24 25 BiometricPrompt(this, Executors.newSingleThreadExecutor(), object : BiometricPrompt.AuthenticationCallback(){ 26 override fun onAuthenticationError(errorCode: Int, errString: CharSequence) { 27 super.onAuthenticationError(errorCode, errString) 28 Log.d("LOG", "BiometricPrompt Error : ($errorCode)$errString") 29 handler.post{ status.text = errString } 30 } 31 override fun onAuthenticationSucceeded(result: BiometricPrompt.AuthenticationResult) { 32 super.onAuthenticationSucceeded(result) 33 Log.d("LOG", "BiometricPrompt Succeeded : ${result.cryptoObject}") 34 handler.post{ status.text = result.toString() } 35 } 36 37 override fun onAuthenticationFailed() { 38 super.onAuthenticationFailed() 39 Log.d("LOG", "BiometricPrompt Failed") 40 } 41 }).authenticate(promptInfo) 42 } 43 } 44 45 46 override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { 47 super.onActivityResult(requestCode, resultCode, data) 48 Log.d("LOG", "onActivityResult : $resultCode") 49 } 50}

イメージ説明

Logcat

1D/LOG: BiometricPrompt Error : (5)認証をキャンセルしました

問題

上記の実装でエミュレータ上で起動した場合、Fingerprintでの認証は通過しますが、
PINコードを利用した場合、AuthenticationCallbackではErrorで認証をキャンセルした扱いになります。

従来のKeyguardManagerから、Intentを発行していたみたいに、
onActivityResultに戻ってくるのかと思っても、どうやらそこに入ってきてもいないようです。

BiometricPromptでPINを利用するには、どのようにCallbackを受け取ればよいのでしょうか?

参考

BiometricPrompt.Builder

【Android】BiometricPromptと指紋認証機能の実装方法について

アンドロイドアプリからデバイスロック画面の呼び出し: Confirm Credential

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kakajika

2019/12/20 16:11

BiometricPromptはAndroidXで提供されているものですか?そうであれば、パッケージのバージョンも載せていただいた方が良いと思います。
stimlocy

2019/12/23 00:52

build.gradleを追記しました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問