Я пытаюсь использовать подход WhatsApp к спискам контактов, в котором я просто синхронизирую контакты своего приложения с контактами устройств.Я использую Firebase в качестве своей платформы аутентификации и базы данных (Firestore).Я использую пользовательский интерфейс Firebase Auth для аутентификации телефонных номеров.
Чего я хотел бы добиться, так это того, что мой список контактов в приложении загружается в основном ТОЛЬКО для контактов с моего устройства, только если на этих контактах также установлено мое приложение.Как и в WhatsApp.
Я уже прочитал официальные документы для AccountManager
и видел несколько учебных пособий , подобных этому , но не могу понять, как его поставить.все вместе.
У меня есть следующие вопросы:
Какова роль AccountAuthenticator
и для каких целей разработчик будет использоватьЭто?Нужен ли AccountAuthenticator
для моего случая использования?Мне просто нужно сделать AccountManager.addAccountExplicitly()
и все?
Если мне нужен весь API, как мне настроить его с помощью Firebase Auth UI?Пользовательский интерфейс Auth уже обрабатывает поток входа и все, и я уже храню пользовательский объект в Firestore.
В 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.