问题描述
我正在尝试为我开发的应用程序设置一个 Google OneTap 登录按钮(我没有使用 Firebase 登录),参考此来源: https://developers.google.com/identity/one-tap/android/get-started
我已在 Cloud Console 上创建了 OAuth 和 Web 凭据。为了生成 OAuth Id,我采用了 Android Studio 在登录报告中提供的 SHA1(我采用了开发 SHA-1,但无论如何它们都是一样的)。
我已将来自 WebAuth 的客户端 ID(不是来自 OAuth 的 Android id)添加到 R.string.default_web_client_id
。
当我使用 Firebase RTDB 存储一些数据时,我也在那里设置了这个 SHA-1。 Manifest、Cloud Console 和 Firebase Console 中的项目名称相同。我从 Firebase 下载了“google-services.json”并将其放在应用程序根目录中。在 Firebase 上,我还设置了有效的服务电子邮件。
这是我在登录活动中实现 OneTap 的方式:
class LoginActivity : AppCompatActivity() {
...
private lateinit var oneTapClient: SignInClient
private lateinit var signUpRequest: BeginSignInRequest
...
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
...
oneTapClient = Identity.getSignInClient(this)
signUpRequest = BeginSignInRequest.builder()
.setPasswordRequestOptions(BeginSignInRequest.PasswordRequestOptions.builder()
.setSupported(false)
.build())
.setGoogleIdTokenRequestOptions(BeginSignInRequest.GoogleIdTokenRequestOptions.builder()
.setSupported(true)
// Your server's client ID,not your Android client ID.
.setServerClientId(getString(R.string.default_web_client_id))
// Only show accounts prevIoUsly used to sign in.
.setFilterByAuthorizedAccounts(false)
.build())
// Automatically sign in when exactly one credential is retrieved.
.setAutoSelectEnabled(false)
.build()
}
// THIS CALLED FROM FRAGMENT WHEN GOOGLE BUTTON IS CLICKED
fun onGoogleClick() {
when (GoogleApiAvailability().isGooglePlayServicesAvailable(applicationContext)) {
0 -> {
beginGoogleSignIn()
}
1 -> {
toaster.show("Google services required")
}
2 -> {
toaster.show("Google services update required")
}
}
}
private fun beginGoogleSignIn() {
val tag = "$atag-beginGoogleSignIn"
oneTapClient.beginSignIn(signUpRequest)
.addOnSuccessListener(this) { result ->
try {
startIntentSenderForResult(
result.pendingIntent.intentSender,library.GOOGLE_SIGNIN_REQUEST_CODE,null,0)
} catch (e: IntentSender.SendIntentException) {
logg.d(atag,"Couldn't start One Tap UI: ${e.localizedMessage}")
}
}
.addOnFailureListener(this) { e ->
// No Google Accounts found. Just continue presenting the signed-out UI.
toaster.show("Please sign in to your google account on your phone")
logg.d(tag,e.localizedMessage)
}
}
override fun onActivityResult(requestCode: Int,resultCode: Int,data: Intent?) {
val tag = "$atag-onActivityResult"
super.onActivityResult(requestCode,resultCode,data)
// Result returned from launching the Intent from GoogleSignInClient.getSignInIntent(...);
if (requestCode == library.GOOGLE_SIGNIN_REQUEST_CODE) {
try {
val credential = oneTapClient.getSignInCredentialFromIntent(data)
token = credential.googleIdToken
when {
token != null -> {
// Got an ID token from Google. Use it to authenticate
// with your backend.
login = credential.id
name = credential.displayName
avatarUrl = credential.profilePictureUri.toString()
tryToLogin()
}
else -> {
// Shouldn't happen.
logg.d(atag,"No ID token!")
}
}
} catch (e: ApiException) {
when (e.statusCode) {
CommonStatusCodes.CANCELED -> {
toaster.show("Please sign in to your google account on your phone")
logg.d(tag,"One-tap dialog was closed.")
// Don't re-prompt the user.
}
CommonStatusCodes.NETWORK_ERROR -> {
logg.d(tag,"One-tap encountered a network error.")
// Try again or just ignore.
}
else -> {
logg.d(tag,"Couldn't get credential from result." +
" (${e.localizedMessage})")
}
}
}
}
}
}
主要问题是在某些 AVD 上运行良好,在其他 AVD id 上出现错误:
16: Cannot find a matching credential.
但是在此 AVD 上,Google 服务是最新的,并且用户已登录 Google Play
在真实设备上,我收到此错误:
10: Caller not whitelisted to call this API.
此处的 Google 服务也是最新的,并且用户已登录 Play 商店。
我在任何地方都使用了真实的 Gmail 地址。
有什么问题?
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)