在 Firebase 身份验证后将帐户添加到客户经理 UI

Add Account To Account Manager After Firebase Auth UI

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

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

我已经阅读了 official docs for AccountManager and seen a few tutorials like this one 但不知道如何将它们组合在一起。

我的问题是:

  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) }
}

在我的应用程序 returns 来自 Firebase Auth UI 之后,我询问他的名字并将所有内容存储在 Firestore 上的用户对象中。

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

因为 Firebase 已经为我做了所有这些,所以似乎不需要帐户验证器。 但它是。强烈建议创建一个 Stub Authenticator 和相应的 Authenticator Service(即使您不打算使用它)。可以找到其代码 here in the official Android Documentation.

之后就没什么了。 AccountManager.addAccountExplicitly() 工作正常。为了安全起见,我什至将 Activity 扩展为 AccountAuthenticatorActivity,但发现它的功能没有任何变化 - 所以这样做完全没问题。

至于 accountNameaccountType 的问题。

  • 账户名可以是任何东西。姓名、phone 号码、电子邮件...任何您想要用来识别您帐户的内容。
  • 帐户类型通常应为您的应用程序包名称。

希望对您有所帮助。