如何实现 google 签到
How to implement google sign in
我在我的 android 应用程序中实现了 google 登录 api。一切都很好,直到最近。我遇到的挑战之一是 client_id 重新生成。最近打开更多错误的是 google 登录在构建的 release.apk 中不起作用。
经过两天的调试,我决定创建一个新的演示项目来重新开始这个过程。它不会作为任务 return false
for task.isSuccessful
.
也许我遗漏了什么。
const val RC_SIGN_IN = 0
class MainActivity : AppCompatActivity() {
lateinit var observer:StartActivityForResults
private lateinit var mGoogleSignInClient:GoogleSignInClient
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
observer = StartActivityForResults(activityResultRegistry)
lifecycle.addObserver(observer)
val gso = GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
.requestEmail()
.build()
mGoogleSignInClient = GoogleSignIn.getClient(this, gso);
sign_in_button.setOnClickListener{
signIn()
}
}
private fun signIn() {
val signInIntent = mGoogleSignInClient.signInIntent
startActivityForResult(signInIntent, RC_SIGN_IN)
}
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
super.onActivityResult(requestCode, resultCode, data)
// Result returned from launching the Intent from GoogleSignInClient.getSignInIntent(...);
if (requestCode == RC_SIGN_IN) {
// The Task returned from this call is always completed, no need to attach
// a listener.
val task = Auth.GoogleSignInApi.getSignInResultFromIntent(data)
task?.isSuccess
Toast.makeText(this, "Success", Toast.LENGTH_LONG).show()
}
else{
Log.i("title", "OKCODE ${Activity.RESULT_OK} RESULTCODE ${resultCode}")
}
}
}
不确定这是否回答了您的问题,但我遇到了一个类似的问题,即签名在调试版本中有效,但不适用于发布版本。
在 Firebase 控制台中,如果您启用了 Google 登录,系统将提示您输入构建的 SHA-1 密钥。现在,我的情况是我获得了用于调试密钥库的 SHA-1 密钥,但在发布 key-store.
时没有这样做
试试,
keytool -list -v
-alias -keystore <path-to-production-keystore
并在您的 Firebase 控制台上输入它。
使用 FirebaseUI
轻松将 sign-in 添加到您的 Android 应用
如果您还没有,请将 Firebase 添加到您的 Android 项目中。
将 FirebaseUI 的依赖项添加到您的 app-level build.gradle 文件
dependencies {
// ...
implementation 'com.firebaseui:firebase-ui-auth:6.2.0'
}
在 Firebase 控制台中,打开身份验证部分并启用您想要支持的 sign-in 方法。一些 sign-in 方法需要额外的信息,通常可以在服务的开发者控制台中找到。
如果您支持 Google Sign-in 并且尚未指定应用的 SHA-1 指纹,请从 Firebase 控制台的“设置”页面执行此操作
// Choose authentication providers
val providers = arrayListOf(
AuthUI.IdpConfig.EmailBuilder().build(),
AuthUI.IdpConfig.PhoneBuilder().build(),
AuthUI.IdpConfig.GoogleBuilder().build(),
AuthUI.IdpConfig.FacebookBuilder().build(),
AuthUI.IdpConfig.TwitterBuilder().build())
// Create and launch sign-in intent
startActivityForResult(
AuthUI.getInstance()
.createSignInIntentBuilder()
.setAvailableProviders(providers)
.build(),
RC_SIGN_IN)
当 sign-in 流程完成后,您将在 onActivityResult 中收到结果:
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
super.onActivityResult(requestCode, resultCode, data)
if (requestCode == RC_SIGN_IN) {
val response = IdpResponse.fromResultIntent(data)
if (resultCode == Activity.RESULT_OK) {
// Successfully signed in
val user = FirebaseAuth.getInstance().currentUser
// ...
} else {
// Sign in failed. If response is null the user canceled the
// sign-in flow using the back button. Otherwise check
// response.getError().getErrorCode() and handle the error.
// ...
}
}
}
我在我的 android 应用程序中实现了 google 登录 api。一切都很好,直到最近。我遇到的挑战之一是 client_id 重新生成。最近打开更多错误的是 google 登录在构建的 release.apk 中不起作用。
经过两天的调试,我决定创建一个新的演示项目来重新开始这个过程。它不会作为任务 return false
for task.isSuccessful
.
也许我遗漏了什么。
const val RC_SIGN_IN = 0
class MainActivity : AppCompatActivity() {
lateinit var observer:StartActivityForResults
private lateinit var mGoogleSignInClient:GoogleSignInClient
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
observer = StartActivityForResults(activityResultRegistry)
lifecycle.addObserver(observer)
val gso = GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
.requestEmail()
.build()
mGoogleSignInClient = GoogleSignIn.getClient(this, gso);
sign_in_button.setOnClickListener{
signIn()
}
}
private fun signIn() {
val signInIntent = mGoogleSignInClient.signInIntent
startActivityForResult(signInIntent, RC_SIGN_IN)
}
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
super.onActivityResult(requestCode, resultCode, data)
// Result returned from launching the Intent from GoogleSignInClient.getSignInIntent(...);
if (requestCode == RC_SIGN_IN) {
// The Task returned from this call is always completed, no need to attach
// a listener.
val task = Auth.GoogleSignInApi.getSignInResultFromIntent(data)
task?.isSuccess
Toast.makeText(this, "Success", Toast.LENGTH_LONG).show()
}
else{
Log.i("title", "OKCODE ${Activity.RESULT_OK} RESULTCODE ${resultCode}")
}
}
}
不确定这是否回答了您的问题,但我遇到了一个类似的问题,即签名在调试版本中有效,但不适用于发布版本。
在 Firebase 控制台中,如果您启用了 Google 登录,系统将提示您输入构建的 SHA-1 密钥。现在,我的情况是我获得了用于调试密钥库的 SHA-1 密钥,但在发布 key-store.
时没有这样做试试,
keytool -list -v
-alias -keystore <path-to-production-keystore
并在您的 Firebase 控制台上输入它。
使用 FirebaseUI
轻松将 sign-in 添加到您的 Android 应用如果您还没有,请将 Firebase 添加到您的 Android 项目中。
将 FirebaseUI 的依赖项添加到您的 app-level build.gradle 文件
dependencies {
// ...
implementation 'com.firebaseui:firebase-ui-auth:6.2.0'
}
在 Firebase 控制台中,打开身份验证部分并启用您想要支持的 sign-in 方法。一些 sign-in 方法需要额外的信息,通常可以在服务的开发者控制台中找到。
如果您支持 Google Sign-in 并且尚未指定应用的 SHA-1 指纹,请从 Firebase 控制台的“设置”页面执行此操作
// Choose authentication providers
val providers = arrayListOf(
AuthUI.IdpConfig.EmailBuilder().build(),
AuthUI.IdpConfig.PhoneBuilder().build(),
AuthUI.IdpConfig.GoogleBuilder().build(),
AuthUI.IdpConfig.FacebookBuilder().build(),
AuthUI.IdpConfig.TwitterBuilder().build())
// Create and launch sign-in intent
startActivityForResult(
AuthUI.getInstance()
.createSignInIntentBuilder()
.setAvailableProviders(providers)
.build(),
RC_SIGN_IN)
当 sign-in 流程完成后,您将在 onActivityResult 中收到结果:
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
super.onActivityResult(requestCode, resultCode, data)
if (requestCode == RC_SIGN_IN) {
val response = IdpResponse.fromResultIntent(data)
if (resultCode == Activity.RESULT_OK) {
// Successfully signed in
val user = FirebaseAuth.getInstance().currentUser
// ...
} else {
// Sign in failed. If response is null the user canceled the
// sign-in flow using the back button. Otherwise check
// response.getError().getErrorCode() and handle the error.
// ...
}
}
}