在Firebase身份验证用户界面后将帐户添加到帐户管理器

时间:2019-06-01 13:03:39

标签: android firebase firebase-authentication firebaseui accountmanager

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

我想实现的是我的应用内联系人列表基本上仅在设备联系人中同时安装了我的应用时加载。就像WhatsApp一样。

我已经读过AccountManager的{​​{3}}并看过一些教程official docs,但无法弄清楚如何将它们放在一起。

我的问题是:

  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上的用户对象中。

1 个答案:

答案 0 :(得分:0)

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

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

此后没有多少。 AccountManager.addAccountExplicitly()可以正常工作。为了安全起见,我甚至将Activity扩展到AccountAuthenticatorActivity,但发现它的运行方式没有变化-因此完全可以这样做。

关于accountNameaccountType的问题。

  • 帐户名称可以是任何名称。名称,电话号码,电子邮件...您要用来标识帐户的任何内容。
  • 帐户类型通常应为您应用的程序包名称。

希望这会有所帮助。