如何在Android中通过FirebaseUI分别获取用户的名和姓?
如何从Firebase Auth用户中分别获取名和姓
嘿,我来帮你搞定这个问题~ FirebaseUI的currentUser.displayName确实会把名和姓拼接成一个字符串返回,但我们可以根据不同的登录提供商,用更精准的方式拆分或者提取单独的名和姓,下面给你两种可行的方案:
方案一:直接拆分displayName(适合简单场景)
如果你的用户群体里,名字都是「名 姓」这种空格分隔的格式,那直接按空格拆分是最快捷的方式:
val fullName = currentUser?.displayName ?: "" // 用limit=2确保只拆分成名和姓两部分,避免多空格或长名字的问题 val nameParts = fullName.split(" ", limit = 2) val firstName = nameParts.getOrNull(0) ?: "" val lastName = nameParts.getOrNull(1) ?: ""
不过这个方法有局限性:如果用户的名字里包含多个空格(比如「Mary Ann Smith」),或者是非英语系的名字格式(比如姓在前名在后),拆分结果可能不准确。
方案二:从提供商原始信息提取(更精准)
Google、Facebook这类第三方登录提供商,本身会返回用户的名(givenName)和姓(familyName)字段,我们可以通过currentUser.providerData拿到这些原始信息,比拆分displayName靠谱得多。下面是针对你用到的几种登录方式的Kotlin示例:
var firstName = "" var lastName = "" currentUser?.providerData?.forEach { userInfo -> when (userInfo.providerId) { // Google登录:直接提取givenName和familyName "google.com" -> { firstName = userInfo.givenName ?: "" lastName = userInfo.familyName ?: "" } // Facebook登录:同样支持提取givenName和familyName "facebook.com" -> { firstName = userInfo.givenName ?: "" lastName = userInfo.familyName ?: "" } // Twitter登录:默认授权可能不返回单独的名姓,只能拆分displayName "twitter.com" -> { val twitterFullName = userInfo.displayName ?: "" val nameParts = twitterFullName.split(" ", limit = 2) firstName = nameParts.getOrNull(0) ?: "" lastName = nameParts.getOrNull(1) ?: "" } // 邮箱密码登录:FirebaseUI默认只收集全名,只能拆分或额外收集 "password" -> { val emailFullName = userInfo.displayName ?: "" val nameParts = emailFullName.split(" ", limit = 2) firstName = nameParts.getOrNull(0) ?: "" lastName = nameParts.getOrNull(1) ?: "" } } }
额外提醒:
- 对于Google和Facebook登录,
givenName和familyName是官方返回的字段,准确性很高,优先用这个方式。 - Twitter的情况比较特殊,如果需要更精准的名姓信息,你可能需要在Twitter登录流程中请求额外的权限(比如
profile权限),但即使这样,有些用户可能没有完善个人资料,还是得 fallback 到拆分displayName。 - 邮箱登录的用户,如果想彻底解决这个问题,建议在注册流程里单独添加「名」和「姓」的输入框,然后把这些信息存在Firestore或者Realtime Database里,后续直接从数据库读取会更灵活。
内容的提问来源于stack exchange,提问作者Lamberto Basti
相关产品推荐
相关产品推荐

