6
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Smart Lock for Passwordsの実装

Last updated at Posted at 2018-07-26

# Smart Lock for Passwordsとは
煩わしいID、パスワード入力を省略してくれる便利な機能です。
実装に関する説明を行っている記事が少ないので投稿します。

実装

プロジェクト

Sampleの Login Activityを使用します
スクリーンショット 2018-07-26 21.58.05.png

gradle

build.gradle(app)
dependencies {
    - 省略 -
    implementation 'com.google.android.gms:play-services-auth:15.0.1'
}

## 保存、読込
Acitityと分離して保存処理、読込処理を別クラスで記載するようにしました

LoginService.kt
class LoginService(private val activity: Activity) {

    companion object {
        const val RC_SAVE = 1
        const val RC_READ = 2
    }

    // 保存、読込時に使用
    private val credentialsClient: CredentialsClient =
        Credentials.getClient(activity, CredentialsOptions.Builder().forceEnableSaveDialog().build())

    // 保存処理
    fun save(email: String, pass: String, finish: () -> Unit) {
        val credential = Credential.Builder(email).setPassword(pass).build()
        credentialsClient.save(credential).addOnCompleteListener {
            if (it.isSuccessful) {
                // 2回目以降の登録
                finish()
                return@addOnCompleteListener
            }
            val e = it.exception
            if (e is ResolvableApiException) {
                // 初回登録
                e.startResolutionForResult(activity, RC_SAVE)
            } else {
                // 登録失敗
                finish()
            }
        }
    }

    // 読込処理
    fun load(finish: (credential: Credential) -> Unit) {
        val request = CredentialRequest.Builder().setPasswordLoginSupported(true).build()
        credentialsClient.request(request).addOnCompleteListener {
            if (it.isSuccessful) {
                // 読込が1件
                finish(it.result.credential)
                return@addOnCompleteListener
            }
            val e = it.exception
            if (e is ResolvableApiException) {
                // 読込件数が複数件
                e.startResolutionForResult(activity, RC_READ)
            } else {
                e?.printStackTrace()
            }
        }
    }

    fun resolveActivityResult(requestCode: Int, resultCode: Int, data: Intent?,
                              finishLoad: (Credential) -> Unit, finishSave: () -> Unit) {
        when (requestCode) {
            RC_READ -> {
                if (resultCode == Activity.RESULT_OK) {
                    data?.getParcelableExtra<Credential>(Credential.EXTRA_KEY)?.let {
                        finishLoad(it)
                    }
                } else {
                    // 読込拒否
                }
            }
            RC_SAVE -> {
                if (resultCode == Activity.RESULT_OK) {
                    // 登録許可
                } else {
                    // 登録拒否
                }
                finishSave()
            }
        }
    }
}

## Activity
email入力欄とpassword入力があるActivityです

MainActivity.kt
class LoginActivity : AppCompatActivity(){

    private lateinit var service: LoginService

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

        service = LoginService(this)

        email_sign_in_button.setOnClickListener {
            service.save(email.text.toString(), password.text.toString()){
                // 保存完了後処理
            }
        }

        service.load {
            email.setText(it.id)
            password.setText(it.password)
        }
    }

    override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
        super.onActivityResult(requestCode, resultCode, data)
        when (requestCode) {
            LoginService.RC_READ, LoginService.RC_SAVE ->
                service.resolveActivityResult(requestCode, resultCode, data, {
                    // 読み込み完了後処理
                    email.setText(it.id)
                    password.setText(it.password)
                }, {
                    // 保存完了後処理
                })
        }
    }
}

動作

初回保存時に確認画面が表示されます

読込時に保存が1件だけの場合、下部よりイカしたポップアップ?が表示されます

読込時に保存が複数件の場合、どのアカウントを使用するかポップアップが表示されます

# その他参考
これらソースはGitHubにもアップしました。

動作の説明についてはクックパッドの記事がわかりやすかったです。
Smart Lock for Passwordsを利用したAndroidアプリログインフロー改善への取り組み

その他メールアドレス一覧を表示してくれるHINTも記載されたサンプルはGoogle Developersにあります。
Smart Lock for Passwords on Android

6
6
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
6
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?