Help us understand the problem. What is going on with this article?

Android 9 PieのBiometricPromptをさらっと試した

More than 1 year has passed since last update.

前置き

FingerprintManagerで奮闘した経験を投稿しようと思い復習していましたら、Android Pieではdeprecatedになりました。急遽、復習をやめて予習を始めました。

BiometricPromptとは

ここで紹介されている説明をご覧ください。要するにAndroid Pieからは指紋認証、顔認証、虹彩認証を統合した認証APIということです。iOSのLAContextもFaceIDが利用出来るので、それに近いと思います。
ちなみに私の愛機P20 ProやGalaxy S8は顔認証や虹彩認証を備えていましたが、サードパーティのアプリでは指紋認証しか出来ませんでした。ここが改善され便利になるということですよね:grinning:
それと引き換えに前述のとおりFingerprintManagerにdeprecatedなりました。

準備

こちらで少し試した限りはAndroid Studio 3.1.3では試用出来ないと思います。私はAndroid Studio 3.3 Canary 2で試用してみることにしました。また、SDK/AVDにP(API 28)を予め用意しておきます。
Android Pieが正式公開されたので再確認したところAndroid Studio 3.1.4で動作することを確認しました。

使い方

FingerprintManagerを使用したことがある方なら、すぐにご理解頂けると思います。GitHubにもアップロードしておきます。こちらからどうぞ。
マイムービー.gif

パーミッションを追加します。

AndroidManifest.xml
<uses-permission android:name="android.permission.USE_BIOMETRIC" />

あとはActivityなりFragmentにBiometricPromptをコードを書きます。

MainActivity.kt
package com.devnokiyo.biometricpromptsample

import android.content.DialogInterface
import android.hardware.biometrics.BiometricPrompt
import android.os.Bundle
import android.os.CancellationSignal
import android.widget.Toast
import androidx.appcompat.app.AppCompatActivity

class MainActivity : AppCompatActivity() {

    private lateinit var cancelSignal: CancellationSignal

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        cancelSignal = CancellationSignal()
        val builder = BiometricPrompt.Builder(this)
        builder.setTitle("生体認証します")
        builder.setNegativeButton("キャンセル", mainExecutor, DialogInterface.OnClickListener { dialogInterface, i ->
            cancelSignal.cancel()
        })
        builder.build().authenticate(cancelSignal, mainExecutor, object : BiometricPrompt.AuthenticationCallback() {
            override fun onAuthenticationError(errorCode: Int, errString: CharSequence) {
                when (errorCode) {
                    BiometricPrompt.BIOMETRIC_ERROR_NO_BIOMETRICS ->
                        Toast.makeText(this@MainActivity, "非対応です。", Toast.LENGTH_SHORT).show()
                    else ->
                        Toast.makeText(this@MainActivity, "その他のエラーです。", Toast.LENGTH_SHORT).show()
                }
            }

            override fun onAuthenticationHelp(helpCode: Int, helpString: CharSequence) {
                throw RuntimeException("Stub!")
            }

            override fun onAuthenticationSucceeded(result: BiometricPrompt.AuthenticationResult) {
                Toast.makeText(this@MainActivity, "認証成功です。", Toast.LENGTH_SHORT).show()
            }

            override fun onAuthenticationFailed() {
                Toast.makeText(this@MainActivity, "認証失敗です。", Toast.LENGTH_SHORT).show()
            }
        })
    }
}

所感

FingerprintManagerを利用していたときは、DialogFragmentと併用して開発していました。指紋認証中のダイアログも画面回転に対応したくなってしまったので、いろいろ茨の道を歩みました。しかし、少なくとも現時点ではBiometricPromptは回転には非対応のように見えます。また、認証表示枠の外をタッチすると認証がキャンセルされてしまいます。これを抑制する方法があれば追って調査したいと思います。

終わりに

FingerprintManagerも、まだ利用していきます。奮闘した記事はまた今後書きたいと思います。でもdeprecatedになると興味が薄れていくんですよね:sweat_smile:

devnokiyo
SESからゲーム業界の東証1部上場企業に転職した正社員エンジニアです。Webサイトや稀にモバイルアプリを自社開発してます。少し採用業務も始めました。教材を執筆したりAWSスクールのお手伝いもしてます。犬とデジモノガジェットが好きです。
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away