kotlin 缺少功能{名称=auth_api_credentials_开始_sign_in,版本=6}

vecaoik1  于 2022-11-16  发布在  Kotlin
关注(0)|答案(4)|浏览(360)

我正在尝试使用Google身份验证方法(一次点击登录)来验证我的应用程序。然而,在我点击了登录按钮后,我遇到了以下问题:
使用Google应用程序管理器:zbaz无法执行调用,因为它需要功能(auth_api_credentials_开始_sign_in,6)。单击:缺少功能{名称=auth_api_credentials_begin_sign_in,版本=6}。
我能知道我哪里搞砸了吗?
1.我使用的是MsSQL而不是firebase。
1.我已经创建了OAuth 2.0客户端。
1.我正在为BuildConfig使用Web客户端ID(我同时拥有Web客户端和Android)buildConfigField:(“字符串”、“客户标识”、“1113838514547 -neqok16gfh5b77v6hcg33c03d0khs896.apps.googleusercontent.com”)
1.谷歌登录按钮不能与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>
vatpfxk5

vatpfxk51#

这个问题让我头疼了好几天,最后Alex Mamo帮我解决了这个问题。有几个因素可能导致了这个问题。首先,确保以下几点:

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

然后,如果没有任何变化,尝试在真实的的Android设备上运行该应用。我所说的真正的Android设备是指已经被真人使用了一段时间的设备,而不仅仅是一个方便地放在你旁边的演示物理设备。
如果您的应用程序仍然产生同样的错误,那么应用程序还有一些其他问题,不幸的是我无法帮助解决。
如果您的应用程序在真实的设备上正常运行,则表示您的仿真器未正确设置。请尝试启动新的仿真器并执行新设备配置过程(对我来说,它被称为“设置你的设备”,它作为一个可操作的通知栏按钮提供)。这是一个独立/不同的过程,而不是简单地在你的Android设备上登录谷歌帐户。一旦完成,等待十分钟,并重新启动良好的措施。这解决了我的问题。
希望这对你有帮助!

roejwanj

roejwanj2#

我在尝试使用我的Android Studio模拟器登录时遇到了同样的错误。问题是与一些插件的版本不兼容。
损坏的项目构建级别:

id 'com.android.application' version '7.1.3' apply false
id 'com.android.library' version '7.1.3' apply false

修复:

id 'com.android.application' version '7.1.2' apply false
id 'com.android.library' version '7.1.2' apply false

另外,重新下载google-services.json文件,应该可以解决问题。
编辑:再次得到了这个问题,我发现这是一个API和模拟器版本不兼容的问题。安装一个API 31(而不是32)的模拟器肯定解决了这个问题。

mgdq6dx1

mgdq6dx13#

除了Endian Tribe在回答中提到的要求外,我还必须确保以下几点,以便消除我的模拟器上的错误:

  • 使用Google Play系统映像(Google API映像对我不起作用)。
  • 设定锁屏模式或PIN。
  • 应用任何待定的系统更新(通过Android 12上的 * 设置-〉安全-〉安全/Google Play系统更新 * 进行)。

不确定是否所有3个步骤都是必需的,但这就是我的诀窍。

wsxa1bj1

wsxa1bj14#

在我的情况下,我有正确的firebase设置(测试之前,它在同一模拟器上工作)。
此外,我已经做了所有的步骤与授权在谷歌的设备上,设置PIN和检查系统和Google Play更新。什么都没有改变。
为了解决这个问题,我必须在模拟器上的Google应用程序中手动clear data。然后在我的应用程序中进行验证。

相关问题