Добавление учетной записи в диспетчер аккаунтов после Firebase Auth UI - PullRequest
1 голос
/ 01 июня 2019

Я пытаюсь использовать подход WhatsApp к спискам контактов, в котором я просто синхронизирую контакты своего приложения с контактами устройств.Я использую Firebase в качестве своей платформы аутентификации и базы данных (Firestore).Я использую пользовательский интерфейс Firebase Auth для аутентификации телефонных номеров.

Чего я хотел бы добиться, так это того, что мой список контактов в приложении загружается в основном ТОЛЬКО для контактов с моего устройства, только если на этих контактах также установлено мое приложение.Как и в WhatsApp.

Я уже прочитал официальные документы для AccountManager и видел несколько учебных пособий , подобных этому , но не могу понять, как его поставить.все вместе.

У меня есть следующие вопросы:

  1. Какова роль AccountAuthenticator и для каких целей разработчик будет использоватьЭто?Нужен ли AccountAuthenticator для моего случая использования?Мне просто нужно сделать AccountManager.addAccountExplicitly() и все?

  2. Если мне нужен весь API, как мне настроить его с помощью Firebase Auth UI?Пользовательский интерфейс Auth уже обрабатывает поток входа и все, и я уже храню пользовательский объект в 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, яспросите его имя и сохраните все в пользовательском объекте в Firestore.

1 Ответ

0 голосов
/ 07 июня 2019

Кажется, что Account Authenticator предназначен для того, чтобы быть интерфейсом между вашим приложением и вашим сервером каждый раз, когда пользователь входит в систему. Он служит для получения новых токенов и управления учетными данными пользователя на вашем сервере.

Поскольку Firebase уже делает все это для меня, может показаться, что аутентификатор аккаунта не требуется. Но это . Настоятельно рекомендуется создать Stub Authenticator и соответствующую службу аутентификации (даже если вы не собираетесь ее использовать). Код, для которого можно найти здесь, в официальной документации Android .

Не так много после этого. AccountManager.addAccountExplicitly() работает просто отлично. Чтобы быть в безопасности, я даже расширил действие до AccountAuthenticatorActivity и не нашел никаких изменений в его функционировании - так что это вполне нормально.

Что касается вопроса accountName и accountType.

  • Имя учетной записи может быть любым. Имя, номер телефона, адрес электронной почты ... По какому адресу вы хотите идентифицировать свою учетную запись.
  • Тип учетной записи, как правило, должен соответствовать имени пакета вашего приложения.

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...