首页 > 解决方案 > 在 Firebase Auth UI 之后将帐户添加到帐户管理器

问题描述

我正在尝试采用 WhatsApp 的方法来处理联系人列表,我只是将我的应用程序的联系人与设备联系人同步。我使用 Firebase 作为我的身份验证平台和数据库 (Firestore)。我正在使用 Firebase Auth UI 进行电话号码身份验证。

我想要实现的是我的应用内联系人列表基本上只加载我的设备联系人,前提是这些联系人也安装了我的应用程序。就像 WhatsApp 一样。

我已经阅读了官方文档AccountManager并看过一些类似的教程,但无法弄清楚如何将它们放在一起。

我的问题是:

  1. 究竟是什么角色AccountAuthenticator以及开发人员将出于什么目的使用它?AccountAuthenticator我的用例需要一个吗?我只需要这样做AccountManager.addAccountExplicitly()吗?

  2. 如果我确实需要整个 API,如何使用 Firebase Auth UI 进行设置?Auth UI 已经在处理登录流程和所有内容,并且我已经在 Firestore 中存储了一个用户对象。

  3. AccountManager.addAccountExplicitly(accountName, accountType)中,帐户名称应该是什么,帐户类型应该是什么?举个例子。

这是我当前的 Firebase 身份验证代码:

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_launch)
    tilName.visibility = View.GONE
    btnSignIn.visibility = View.GONE
    Handler().postDelayed({
        if (auth.currentUser == null) startActivityForResult(
            AuthUI.getInstance().createSignInIntentBuilder()
                .setAvailableProviders(listOf(AuthUI.IdpConfig.PhoneBuilder().build()))
                .setTheme(R.style.LauncherTheme).build(), rcSignIn
        )
        else startActivity(Intent(this, MainActivity::class.java))
    }, 1000)
}

override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
    super.onActivityResult(requestCode, resultCode, data)
    if (requestCode == rcSignIn) {
        val response = IdpResponse.fromResultIntent(data)
        if (resultCode == Activity.RESULT_OK) {
            val user = auth.currentUser!!
            tilName.visibility = View.VISIBLE
            btnSignIn.visibility = View.VISIBLE
            btnSignIn.setOnClickListener {
                if (etName.text!!.isNotEmpty()) user.updateProfile(
                    UserProfileChangeRequest.Builder().setDisplayName(etName.text.toString()).build()
                ).addOnSuccessListener { addUser(user) }.addOnFailureListener {
                    Log.e("Update User Profile", "Failed To Update User Profile", it)
                } else snackBar("You haven't provided a valid name in the Text Field")
            }
        } else Log.i("User Sign In", "Sign-In Process Failed", response?.error!!)
    }
}

private fun addUser(user: FirebaseUser) {
    pbSigningUp.visibility = View.VISIBLE
    FirebaseInstanceId.getInstance().instanceId.addOnSuccessListener {
        Log.i("Get FCM Token", "Device Token Retrieved Successfully: ${it.token}")
        db.collection("users").document(user.uid).set(User(user.displayName!!, user.phoneNumber!!, it.token))
            .addOnSuccessListener {
                Log.i("Add User", "New User Added Successfully: ${user.uid}")
                startActivity(Intent(this, MainActivity::class.java))
            }.addOnFailureListener { e -> Log.e("Add User Failed", "Failed To Add New User", e) }
    }.addOnFailureListener { Log.e("Device FCM Token", "Failed To Retrieve Device Token", it) }
}

在我的应用程序从 Firebase Auth UI 返回后,我询问他的姓名并将所有内容存储在 Firestore 上的用户对象中。

标签: androidfirebasefirebase-authenticationfirebaseuiaccountmanager

解决方案


每次用户登录时,Account Authenticator 似乎都是您的应用程序和服务器之间的接口。它的目的是获取新的 Auth-Tokens 并使用您的服务器管理用户凭据。

由于 Firebase 已经为我完成了所有这些工作,因此似乎不需要帐户身份验证器。但它是。强烈建议创建Stub Authenticator和相应的 Authenticator Service(即使您不打算使用它)。可以在官方 Android 文档中找到其代码。

之后就没什么了。AccountManager.addAccountExplicitly()工作得很好。为了安全起见,我什至将 Activity 扩展到AccountAuthenticatorActivity并发现它的运行方式没有任何变化 - 所以这样做完全没问题。

至于accountNameaccountType去的问题。

  • 帐户名称可以是任何内容。姓名、电话号码、电子邮件......无论您想通过什么来识别您的帐户。
  • 帐户类型通常应该是您的应用程序包名称。

希望这可以帮助。


推荐阅读