我正在尝试使用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>
4条答案
按热度按时间vatpfxk51#
这个问题让我头疼了好几天,最后Alex Mamo帮我解决了这个问题。有几个因素可能导致了这个问题。首先,确保以下几点:
然后,如果没有任何变化,尝试在真实的的Android设备上运行该应用。我所说的真正的Android设备是指已经被真人使用了一段时间的设备,而不仅仅是一个方便地放在你旁边的演示物理设备。
如果您的应用程序仍然产生同样的错误,那么应用程序还有一些其他问题,不幸的是我无法帮助解决。
如果您的应用程序在真实的设备上正常运行,则表示您的仿真器未正确设置。请尝试启动新的仿真器并执行新设备配置过程(对我来说,它被称为“设置你的设备”,它作为一个可操作的通知栏按钮提供)。这是一个独立/不同的过程,而不是简单地在你的Android设备上登录谷歌帐户。一旦完成,等待十分钟,并重新启动良好的措施。这解决了我的问题。
希望这对你有帮助!
roejwanj2#
我在尝试使用我的Android Studio模拟器登录时遇到了同样的错误。问题是与一些插件的版本不兼容。
损坏的项目构建级别:
修复:
另外,重新下载
google-services.json
文件,应该可以解决问题。编辑:再次得到了这个问题,我发现这是一个API和模拟器版本不兼容的问题。安装一个API 31(而不是32)的模拟器肯定解决了这个问题。
mgdq6dx13#
除了Endian Tribe在回答中提到的要求外,我还必须确保以下几点,以便消除我的模拟器上的错误:
不确定是否所有3个步骤都是必需的,但这就是我的诀窍。
wsxa1bj14#
在我的情况下,我有正确的firebase设置(测试之前,它在同一模拟器上工作)。
此外,我已经做了所有的步骤与授权在谷歌的设备上,设置PIN和检查系统和Google Play更新。什么都没有改变。
为了解决这个问题,我必须在模拟器上的
Google
应用程序中手动clear data
。然后在我的应用程序中进行验证。