缺少功能{name=auth_api_credentials_begin_sign_in,version=6}

2024-02-10

我正在尝试对我的应用程序使用 Google 身份验证方法(一键登录)。然而,当我点击签名按钮后,我遇到了以下问题:

W/GoogleApiManager:com.google.android.gms.internal.auth-api.zbaz 无法执行调用,因为它需要功能(auth_api_credentials_begin_sign_in,6)。 D/btn 点击:缺少功能{name=auth_api_credentials_begin_sign_in, version=6}。

我可以知道我哪里搞砸了吗?

  1. 我正在使用 MsSQL 而不是 firebase。
  2. 我已经创建了 OAuth 2.0 客户端。
  3. 我正在使用 BuildConfig 的 Web 客户端 ID(我有 Web 客户端和 Android) buildConfigField : ("String", "CLIENT_ID", '"1113838514547 -neqok16gfh5b77v6hcg33c03d0khs896.apps.googleusercontent.com"')
  4. 谷歌登录按钮无法与 viewBinding 一起使用,因此我将该特定按钮切换为“findViewById”

下面是代码:

    import android.content.IntentSender
import android.os.Bundle
import android.util.Log
import androidx.activity.result.IntentSenderRequest
import androidx.activity.result.contract.ActivityResultContracts
import androidx.appcompat.app.AppCompatActivity
import com.example.myapplication.databinding.ActivitySignInBinding
import com.google.android.gms.auth.api.identity.BeginSignInRequest
import com.google.android.gms.auth.api.identity.Identity
import com.google.android.gms.auth.api.identity.SignInClient
import com.google.android.gms.common.SignInButton
import com.google.android.gms.common.api.ApiException
import com.google.android.gms.common.api.CommonStatusCodes
import com.google.android.material.snackbar.Snackbar


class MainLoginActivity : AppCompatActivity() {

    private var _binding: ActivitySignInBinding? = null
    private val binding get() = _binding!!

    private var sign_in_button : SignInButton?  = null

    private var oneTapClient: SignInClient? = null
    private var signUpRequest: BeginSignInRequest? = null
    private var signInRequest: BeginSignInRequest? = null

    private val oneTapResult = registerForActivityResult(ActivityResultContracts.StartIntentSenderForResult()){ result ->
        try {
            val credential = oneTapClient?.getSignInCredentialFromIntent(result.data)
            val idToken = credential?.googleIdToken
            when {
                idToken != null -> {
                    // Got an ID token from Google. Use it to authenticate
                    // with your backend.
                    val msg = "idToken: $idToken"
                    Snackbar.make(binding.root, msg, Snackbar.LENGTH_INDEFINITE).show()
                    Log.d("one tap", msg)
                }
                else -> {
                    // Shouldn't happen.
                    Log.d("one tap", "No ID token!")
                    Snackbar.make(binding.root, "No ID token!", Snackbar.LENGTH_INDEFINITE).show()
                }
            }
        } catch (e: ApiException) {
            when (e.statusCode) {
                CommonStatusCodes.CANCELED -> {
                    Log.d("one tap", "One-tap dialog was closed.")
                    // Don't re-prompt the user.
                    Snackbar.make(binding.root, "One-tap dialog was closed.", Snackbar.LENGTH_INDEFINITE).show()
                }
                CommonStatusCodes.NETWORK_ERROR -> {
                    Log.d("one tap", "One-tap encountered a network error.")
                    // Try again or just ignore.
                    Snackbar.make(binding.root, "One-tap encountered a network error.", Snackbar.LENGTH_INDEFINITE).show()
                }
                else -> {
                    Log.d("one tap", "Couldn't get credential from result." +
                            " (${e.localizedMessage})")
                    Snackbar.make(binding.root, "Couldn't get credential from result.\" +\n" +
                            " (${e.localizedMessage})", Snackbar.LENGTH_INDEFINITE).show()
                }
            }
        }
    }

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        _binding = ActivitySignInBinding.inflate(layoutInflater)
        setContentView(binding.root)

        sign_in_button = findViewById(R.id.sign_in_button)

        oneTapClient = Identity.getSignInClient(this)
        signUpRequest = BeginSignInRequest.builder()
            .setGoogleIdTokenRequestOptions(
                BeginSignInRequest.GoogleIdTokenRequestOptions.builder()
                    .setSupported(true)
                    // Your server's client ID, not your Android client ID.
                    .setServerClientId(BuildConfig.CLIENT_ID)
                    // Show all accounts on the device.
                    .setFilterByAuthorizedAccounts(false)
                    .build())
            .build()
        signInRequest = BeginSignInRequest.builder()
            .setGoogleIdTokenRequestOptions(
                BeginSignInRequest.GoogleIdTokenRequestOptions.builder()
                    .setSupported(true)
                    // Your server's client ID, not your Android client ID.
                    .setServerClientId(BuildConfig.CLIENT_ID)
                    // Show all accounts on the device.
                    .setFilterByAuthorizedAccounts(true)
                    .build())
            .setAutoSelectEnabled(true)
            .build()


       sign_in_button!!.setOnClickListener{
            displaySignIn()
        }


    }


    private fun displaySignIn(){
        oneTapClient?.beginSignIn(signInRequest!!)
            ?.addOnSuccessListener(this) { result ->
                try {
                    val ib = IntentSenderRequest.Builder(result.pendingIntent.intentSender).build()
                    oneTapResult.launch(ib)
                } catch (e: IntentSender.SendIntentException) {
                    Log.e("btn click", "Couldn't start One Tap UI: ${e.localizedMessage}")
                }
            }
            ?.addOnFailureListener(this) { e ->
                // No Google Accounts found. Just continue presenting the signed-out UI.
                displaySignUp()
                Log.d("btn click", e.localizedMessage!!)
            }
    }

    private fun displaySignUp() {
        oneTapClient?.beginSignIn(signUpRequest!!)
            ?.addOnSuccessListener(this) { result ->
                try {
                    val ib = IntentSenderRequest.Builder(result.pendingIntent.intentSender).build()
                    oneTapResult.launch(ib)
                } catch (e: IntentSender.SendIntentException) {
                    Log.e("btn click", "Couldn't start One Tap UI: ${e.localizedMessage}")
                }
            }
            ?.addOnFailureListener(this) { e ->
                // No Google Accounts found. Just continue presenting the signed-out UI.
                displaySignUp()
                Log.d("btn click", e.localizedMessage!!)
            }
    }

}
  <?xml version="1.0" encoding="utf-8"?>
    <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <com.google.android.gms.common.SignInButton
            android:id="@+id/sign_in_button"
            android:layout_width="129dp"
            android:layout_height="52dp"
            android:layout_marginStart="141dp"
            android:layout_marginTop="252dp"
            android:layout_marginEnd="141dp"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toTopOf="parent" />

</androidx.constraintlayout.widget.ConstraintLayout>

我在这个问题上头撞墙好几天了,终于亚历克斯·马莫 https://medium.com/firebase-developers/how-to-authenticate-to-firebase-using-google-one-tap-in-jetpack-compose-60b30e621d0d帮我解决了。有几件事可能导致此问题。首先,确保以下几点:

  • 用户在模拟器上登录 Google 帐户。
  • SHA-1 和 SHA-256 调试指纹均已添加到正确的项目中。
  • 正确的 google-services.json 文件位于正确的目录中。
  • web_client_id 是您的,并正确传递到必填字段中。

然后,如果没有任何变化,请尝试在真实的 Android 设备。我所说的“真实”是指已经被真人实时使用过的设备,而不仅仅是方便地坐在您旁边的演示物理设备。

如果您的应用程序仍然产生相同的错误,则说明该应用程序还存在其他一些问题,遗憾的是我无法提供帮助。

如果您的应用程序在真实设备上正常运行,则意味着您的模拟器设置不正确。尝试启动一个新的模拟器并通过新设备配置流程(对我来说,它被称为“设置您的设备”,并且可以作为可操作的通知栏按钮使用)。与简单地在 Android 设备上登录 Google 帐户相比,这是一个单独/不同的过程。完成后,等待十分钟并重新启动以获得良好的效果。这解决了我的问题。

希望这可以帮助!

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

缺少功能{name=auth_api_credentials_begin_sign_in,version=6} 的相关文章

  • 作用域函数 apply/with/run/also/let:它们的名字从何而来?

    有很多博客文章 例如this https dzone com articles examining kotlins also apply let run and with intentions 关于标准库函数的用法apply with ru
  • LiveData无法观察到变化

    我正在更新一个ViewModel 中 DialogFragment 的 LiveData 值 但无法获取Fragment中的值 视图模型 class OtpViewModel private val otpUseCase OtpUseCas
  • kotlin中的三元运算符[重复]

    这个问题在这里已经有答案了 我可以用java写 int i 10 String s i 10 Ten Empty 即使我可以将它传递到方法参数中 callSomeMethod i 10 Ten Empty 如何将其转换为 kotlin 在
  • 喷气背包组合中的波纹效果无法正常工作

    我正在研究jetpack compose中的连锁反应 我提供了我的颜色 单击视图后 它会在一段时间后显示不同类型的颜色 在按下状态时显示为深灰色 binding itemComposable setContent Column modifi
  • Kotlin 1.6.0 的 proguard / R8 删除了数据类元数据

    我有一个包含一些数据类的包 我尝试使用 Kotlin 反射在运行时访问构造函数clazz primaryConstructor 一切都按预期工作 但是当我启用 R8 时 数据类元数据被删除 例如当我检查是否KClass isData它返回
  • Ktor 如何处理空响应

    我使用 Ktor 和这样的线路myentity client get url 从 API 响应获取并反序列化我的实体 当 API 返回某些内容时它工作正常 但是一旦 API 没有任何可返回的内容并发送 HTTP 204 响应 它就会失败并显
  • 在 Kotlin 中实现返回 Collection 的 Java 方法

    我将 Kotlin 与 Spring Security 结合使用 实现该方法时 public interface UserDetails extends Serializable Collection
  • Kotlin 中的单例类

    我想知道如何在 Kotlin 中创建一个单例类 以便我的 Util 类在每次应用程序执行时仅实例化一次 但是 当我将 Java 类转换为 kotlin 时 生成了以下代码 它是否正确 companion object private var
  • 从 DecorView@2da7146[MyActivity] 中找不到 ViewTreeLifecycleOwner

    从撰写更新后alpha 11 to alpha 12 or beta 01 每当我打开具有撰写视图的活动或片段时 我都会遇到此崩溃 我在用AppCompatActivity它实现了LifecycleOwner 所以这非常奇怪 java la
  • Moshi 无法解析 nullable

    你好 希望你能帮助我 使用 kotlin Retrofit2 moshi 我从 https api spacexdata com v3 launches 获取数据并解析它 一切都很顺利 我得到的属性如下 flight number miss
  • Jetpack 中的波浪框组成

    有没有办法用Canvas制作一个顶部有波浪形的盒子 我想知道这个效果是否可以直接用Canvas来实现 不需要有滚动动画 不太清楚你为什么在谈论Canvas 要裁剪这样的视图 您可以使用自定义Shape并将其应用到您的视图中Modifier
  • 在viewpager2中禁用动画

    我有 viewpager2 和扩展 FragmentStateAdapter 的适配器 我希望用户仅通过单击选项卡布局即可转到另一个页面 我已禁用此 viewpager2 的用户输入 但是当我单击选项卡时 有页面之间快速滑动的动画 但我只想
  • 如何将 Android Room 数据库中的 Not Null 表列迁移为 Null

    我是 Android 房间库的新手 我需要将 Not Null 列迁移到 Null 但房间迁移只允许在 ALTER 表查询中添加或重命名 如何执行列迁移查询 Entity tableName vehicle detail data clas
  • 如何使用 Google 的 GithubBrowserSample 方法在片段之间共享视图模型?

    我对 Android 架构组件的使用非常陌生 因此我决定使用 GithubBrowserSample 来构建我的应用程序来实现我的许多用例 但我有一个问题 我不知道使用这种方法在片段之间共享视图模型的正确方法是什么 我想共享视图模型 因为我
  • GoogleSignIn ios 附加到谷歌表格

    我目前正在开发一个 iOS 应用程序 该应用程序需要写入登录用户拥有的 Google 工作表 要登录我正在使用的用户GoogleSignInpod 并附加到我正在使用的谷歌表GoogleAPIClientForREST Sheets pod
  • JetPack Compose - 卡中行中的weight() 不起作用

    创建 Android 应用程序时 我将一些可组合项放在卡片的一行中 如下所示 但它没有按我的预期工作 我添加 weight 1f 的可组合项不再显示 data class Test val title String val text Str
  • 如何将依赖 ThreadLocal 的代码与 Kotlin 协程一起使用

    一些 JVM 框架使用ThreadLocal存储应用程序的调用上下文 例如SLF4j MDC https logback qos ch manual mdc html 事务管理器 安全管理器等 然而 Kotlin 协程是在不同的线程上调度的
  • 在 Android Studio 中运行单个 .kt 文件

    我在 Android Studio 中创建了一个 Scratch Kotlin 文件 我只想运行这个 scrap kt 文件并获取输出 我摆弄了运行配置 但无法理解主类中将包含什么 If you create a top level fun
  • kotlin 从数组中获取随机字符串

    刚接触 kotlin 有不少问题和解答 大部分是 Java 方面的 在遵循文档并针对大量 SO 进行验证之后问题和答案 https stackoverflow com questions 6726963 random string from
  • 在 Jetpack Compose 中启动动画矢量 Drawable

    我有一个动画矢量可绘制R drawable my anim 我想在 Jetpack Compose 中展示并开始 可绘制对象显示 渲染正确 但动画未启动 这是撰写视图 Composable fun SplashView Surface mo

随机推荐

  • ViewPager 上的 onClick 未触发

    我在 a 上设置了一个点击侦听器ViewPager 但 onClick 事件永远不会被调用 我猜触摸事件检测ViewPager很干扰 但我不知道如何解决它 有人可以帮忙吗 Thanks mViewPager setOnClickListen
  • 生成数字序列[重复]

    这个问题在这里已经有答案了 我想在 asp net mvc2 中创建序列号 那么数字应该从 0 to 1000 我尝试如下 var seq Enumerable Range 1 1000 ViewData OrderNo seq In vi
  • 如何设置 Apache mod_rewrite 以重定向除一个子文件夹之外的所有子文件夹

    我刚刚创建了一个新网站 并准备从当前的网络服务器切换到新的网络服务器 当前的网络服务器将更名为 www2 新的网络服务器将被称为 www 我想将所有流量从 www2 重定向到 wwwexcept对于一个目录 我的目录结构如下所示 var w
  • 我们可以只提供@2x 图像吗?

    我们知道我们应该为 iphone ipad 应用程序提供正常尺寸的图像和 2x 尺寸的图像 但为一张图像提供双倍尺寸是一件无聊的事情 我做了一些测试 如果只有 2x图像 如果需要 系统会自动将 2x图像缩小到正常大小 所以在这种情况下 非视
  • Tensorflow - LSTM - “张量”对象不可迭代

    您好 我正在对 lstm rnn 单元使用以下函数 def LSTM RNN X istate weights biases Function returns a tensorflow LSTM RNN artificial neural
  • 以编程方式设置 LinearLayout 的重力

    我已按照说明为 Unity 制作新的 AdMob 插件 广告显示正确 但底部位置有问题 它们显示在屏幕顶部 我已将重力设置为底部 对于 FrameLayout 但横幅广告再次显示在屏幕顶部 我没有任何带有 LinearLayout Fram
  • 具体图和需要更有创意的解决方案

    有向图 V a E b 给出 每个顶点都有特定的权重 我们想要每个顶点 1 a 找到从该顶点可以到达的具有最大权重的顶点 更新 1 Paul 在 O b a log a 中准备了一个很好的答案 但是我 搜索 O a b 算法 如果有 有没有
  • 占位符 CSS 调用问题

    通常我们使用这个想法 不同的类用逗号分隔 测试 test1 但是这里只要我们单独调用类就可以正常工作 为什么会出现这个问题 演示在这里http jsfiddle net 6AR8n http jsfiddle net 6AR8n seper
  • 在 docker 中运行的 Postgres 数据库一直挂起

    我正在使用 postgres docker 映像 在使用 docker 映像中运行的数据库几个月后 现在我得到的行为是 在一段时间后 它们只是挂起 我可以执行bin bash但根本不能用 postgres 做任何事情 命令不会返回 容器也无
  • Alfresco 社区企业功能对比

    我见过这个问题 https stackoverflow com questions 5256425 what is the difference between alfresco community edition and alfresco
  • Flutter 上传列表到 Google Firestore

    我想将我的 flutter 测试应用程序中的列表添加到我的 Google Firestore 这是我的方法 它添加了所有数据 void postToFireStore String mediaUrl String location Stri
  • 交错电子邮件地址数组,避免具有相同域的项目连续

    我正在寻找一种在 C 中对电子邮件地址数组进行排序的有效方法 以避免具有相同域的项目连续 数组内的电子邮件地址已经是不同的 并且全部都是小写 Example 给定一个包含以下条目的数组 email protected cdn cgi l e
  • 如何更改数据表中排序箭头的颜色

    我在用DataTables我需要将排序箭头的颜色从默认 紫色 更改为其他颜色 我正在尝试的代码正在更改整个标题行颜色 而我只需要图标 是否还有其他课程 因为下面的代码对我没有帮助 CSS table dataTable thead sort
  • 如何显示/设置矩阵输入的行名称(shinyIncubator)

    我可以使用创建一个矩阵matrixInput功能 df lt data frame matrix c 0 0 1 2 colnames df lt c Input1 Input2 rownames df lt c rown1 matrixI
  • Bug 报告者:getDisplayMedia 的替代品?

    我正在尝试在我的网站上实现错误报告器 我的目标是用户能够在解决问题时以声音描述问题并记录浏览器选项卡 错误报告将只是一个视频文件 可以通过电子邮件发送给我 看来提议的navigator mediaDevices getDisplayMedi
  • 使用 Selenium Webdriver 获取 div 内的项目列表

    假设我有以下内容 div class facetContainerDiv div div div
  • 为什么 Microsoft Graph 需要 $select 和 $expand=extensions?

    在 Graph Explorer 中 当我验证并使用 获取开放扩展 示例时 它会针对此端点执行 GET https graph microsoft com v1 0 me select id displayName mail mobileP
  • 禁用 Tensorflow 调试信息

    我所说的调试信息是指 TensorFlow 在我的终端中显示的有关加载的库和找到的设备等的信息 而不是 Python 错误 I tensorflow stream executor dso loader cc 105 successfull
  • 如何让 hg log 显示我时区的提交时间戳

    hg log默认情况下显示提交时区的提交时间戳 是否可以使其显示特定时区的时间戳 理想情况下 解决方案不需要任何外部工具 hg log template date localdate rfc822date n 因此 您获取日期 将其转换为本
  • 缺少功能{name=auth_api_credentials_begin_sign_in,version=6}

    我正在尝试对我的应用程序使用 Google 身份验证方法 一键登录 然而 当我点击签名按钮后 我遇到了以下问题 W GoogleApiManager com google android gms internal auth api zbaz