在 Firebase Auth 中,如何检测匿名用户是否已升级为例如Facebook的用户?

2024-03-26

我的 Android 应用程序中有一个单例,在应用程序启动时启动,它监听身份验证状态更改,如下所示:

fun listenForAuthChanges() {
    if (authStateListener != null) {
        FirebaseAuth.getInstance().removeAuthStateListener(authStateListener!!)
    }
    authStateListener = FirebaseAuth.AuthStateListener { auth ->
        val user = auth.currentUser
        writeStatusToFirebase()
        if (user != null) {
            Log.debug("User : ${user.uid} -> ${user.loginType}")
        } else {
            Log.debug("User : signed out")
            loginAnonymously()
        }
    }
    FirebaseAuth.getInstance().addAuthStateListener(authStateListener!!)
}

这非常有效,可以检测用户是否注销或登录。正如您在上面的代码中使用 loginAnonymously() 看到的,当没有用户登录时,我会自动匿名登录。然而,这一切就像一个魅力......当我调用 Firebase-UI 登录并且用户通过 Facebook 登录时,不会调用身份验证状态侦听器。

我发现 FirebaseUI 实际上不会创建新用户,而是将匿名用户升级为 Facebook 用户(在 Firebase Auth 控制台中检查并通过在 Android studio 控制台中使用断点)。这实际上就是我想要的行为。

所以我猜测,结论是Auth状态监听器没有被调用是因为用户的uid没有改变?

但是,我确实需要一种可靠的方法来检测此事件(意味着用户从匿名升级到例如 Facebook)。

最好的方法是什么?

注意:我知道可以检测用户使用哪个身份验证提供程序(id)进行身份验证。 这是我为此使用的一些代码:

val FirebaseUser.loginType: LoginType

get() {
    if (isAnonymous) {
        return LoginType.Anonymous
    }
loop@ for (userInfo in providerData) {
    when (userInfo.providerId) {
        EmailAuthProvider.PROVIDER_ID -> return LoginType.Email
        GoogleAuthProvider.PROVIDER_ID -> return LoginType.Google
        FacebookAuthProvider.PROVIDER_ID -> return LoginType.Facebook
        else -> continue@loop
    }
}
return LoginType.Unknown

}

这不是我的问题,我的问题是:如何检测用户已经upgraded从匿名到例如Facebook?


如何检测用户已从匿名升级为例如Facebook?

当匿名用户第一次登录时,将身份验证类型保存在数据库中:

Firestore-root
  |
  --- users (collection)
        |
        --- uid
             |
             --- type: "anonymous"

当用户更改身份验证类型时,您只需更改type数据库中的字段保存“Facebook”而不是“匿名”。这是可能的,因为uid无论提供者 ID 是什么,都将始终相同。要在操作发生时收到通知,只需在type财产,您将收到实时通知。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 Firebase Auth 中,如何检测匿名用户是否已升级为例如Facebook的用户? 的相关文章

  • 当应用程序停止使用 Sencha Touch 2.2 和 Phonegap 时,LocalStorage 存储不会保留在 Android 手机上

    这在我的浏览器中工作正常 但是当我在手机上安装该应用程序并使用它时 它看起来很好 直到我强制它停止并重新打开该应用程序 然后我的所有记录都消失了 我正在使用 2 2 和 Phonegap 任何帮助将非常感激 这是我的商店 Ext defin
  • 要在进程中运行 dex,Gradle 守护进程需要更大的堆。目前有 910 MB

    实际上主要错误是 java exe完成非零退出值 1 首先我告诉你安装 studio 后遇到的每个问题 三天前 我刚刚安装了 android studio 并创建了新项目 1 首先它抛出错误 插件太旧 请更新到更新的版本 在谷歌上搜索后我改
  • 在 doInBackground 方法中启动活动

    在下面的代码中 我从互联网下载 json 并希望显示在列表中 如果列表为空 则转到另一个活动 但其他活动未启动 没有错误 但没有启动活动 感谢您的帮助 package ir mohammadi android nightly import
  • 在android中以编程方式创建布局 - 问题

    我正在使用以下代码动态创建 FrameLayout mylayout java FrameLayout layout new FrameLayout this FrameLayout LayoutParams layoutparams ne
  • 无法解析配置“:app:debugRuntimeClasspath”的所有文件。问题

    我的 android studio 遇到了下一个问题 导致 org gradle api internal artifacts ivyservice DefaultLenientConfiguration ArtifactResolveEx
  • 无法调整 Android React Native 模块中线性布局子项的大小

    完整代码在这里 https github com sbaar ResizableLLRN 这里有关于 java 中正确行为和 React Native 中错误行为的视频 https drive google com file d 0Bxl2
  • 创建用于 Android 库分发的 JAR

    我正在开发一个 android 库 并希望导出一个 JAR 文件 我可以分发该文件供其他人在他们的应用程序中使用 我不想分发源代码 因为它包含有关发布到我的网络服务器的详细信息 我尝试使用在 bin 目录中创建的 JAR 文件并将该 jar
  • GCM(Google 云消息传递)是否需要 Google 帐户?

    我需要编写一个简单的应用程序来获取推送通知 我使用 GCM 它使用 Google Play 服务来获取信息 我的问题是 要访问 GCM 是否需要 Google 帐户 我可以使用其他电子邮件帐户来识别设备吗 有没有其他方法可以获取另一个电子邮
  • EditText 不显示当前输入(Android 4)

    我的 Android 应用程序包含一个EditText http developer android com reference android widget EditText html查看可以在其中键入一些短消息 单行 按键盘的DONE键
  • SDK 管理器中缺少 Google Play 服务

    我想在我的应用程序中使用 Google 地图 我想在 SDK 管理器中安装 Google Play 服务 但是当我转到 SDK 管理器时 我没有看到 Google Play 服务 为什么 我该如何安装这个 我可以独立于 SDK Manage
  • Android Youtube API 可用吗? [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 有适用于 Android 的 YouTube API 吗 如果不是 除了通过网络浏览器之外 如何从 Yo
  • Android 简单 TextView 动画

    我有一个 TextView 我想倒计时 3 2 1 发生了事情 为了使其更有趣 我希望每个数字都以完全不透明开始 然后淡出至透明 有没有一种简单的方法可以做到这一点 尝试这样的事情 private void countDown final
  • 如何为工具栏上的溢出菜单中的菜单项设置字体

    我想更改项目的默认字体溢出菜单并设置自定义字体 我尝试添加一个工厂LayoutInflater并在onCreateView 方法我改变了TextView的字体 但这没有用 这是代码 在 onCreateOptionsMenu 内 getLa
  • Webview 中的 Java 空指针异常

    我试图搜索这个问题 但这个错误看起来与这个错误 https stackoverflow com questions 21866459 android nullpointerexception on webview 我的 google pla
  • Android EditText 不起作用,android:imeOptions="actionNext" android:inputType="phone"

    我已经尝试过了 只有删除android inputType phone 键盘回车可以跳转到下一个EditText 不知道大家之间是否有过一些冲突android imeOptions actionNext and android inputT
  • 如何在Webview中保存用户名和密码

    目前 我还在学习Android开发的过程中 所以如果我的这个问题对你来说不太容易理解 请原谅 我创建了一个 Android 应用程序 它使用 RecyclerView 显示一组列表 当用户单击列表中的每个名称时 它会将它们重定向到一组不同的
  • Android - 保持用户登录状态

    我正在尝试使用 PHP 和 MySQLi for Android 进行登录 我不明白的是如何保持用户登录状态 我看到一个简单的教程 其中有人使用 SQLite 来保护信息 但我不知道这是否真的安全 如何保存用户信息以保持用户登录状态 谢谢
  • Android Windows:它们何时以及如何创建?

    我已经阅读了标准的 Windows 相关文档并翻阅了 一堆源代码 试图理解 Android 如何以及何时 窗口已创建 我相信我已经拥抱它并愿意 对其进行验证或更正 据我所知 只有两种方法可以获得 Window 对象的句柄 1 Activit
  • Android进程调度

    我试图更好地理解 以便在创建 Android 应用程序 服务时确定潜在的互操作性问题对可靠性的影响 我想弄清楚进程优先级是如何确定的 服务和活动之间优先级的差异以及调度程序是否以不同方式对待它们的优先级 基本上 我试图深入了解某个活动或服务
  • 如何检测文本是否可读?

    我想知道是否有一种方法可以告诉给定的文本是人类可读的 我所说的人类可读的意思是 它有一些含义 格式就像某人写的文章 或者至少是由软件翻译器生成的供人类阅读的文章 这是背景故事 最近我正在制作一个应用程序 允许用户将短文本上传到数据库 在部署

随机推荐