Google Identity 服务 (GIS) 是一组新的 API,采用易于开发者实现的软件包为用户提供轻松安全的登录和注册服务。本文档详细介绍了新的 Google 登录 API(GIS 的一部分),该 API 可用于在用户点按“使用 Google 帐号登录”按钮时启动登录或注册流程。此 API 可以代替现有的 Google 登录 API 用于登录流程。
仅当用户明确显示使用 Google 帐号登录的意图时,您才应使用此 API。例如,当用户点击您应用中的“使用 Google 帐号登录”按钮时,便可使用此 API。
您不应使用此 API 来提示用户在应用启动时登录,或为了响应其他触发器(例如将商品添加到购物车)而提示用户登录。对于这些用例,请使用一键登录和注册。
当您使用新 API 启动 Google 登录流程时,它会显示以下界面:
准备工作
配置 Google API 控制台项目并设置 Android Studio 项目。
发出登录请求
如需使用 Identity API 启动 Google 登录流程,请构建一个 GetSignInRequest
对象。然后,对 SignInClient
对象调用 getSignInIntent
。此调用是异步的,如果成功,它将提供一个 PendingIntent
来启动对话框。
private static final int REQUEST_CODE_GOOGLE_SIGN_IN = 1; /* unique request id */
private void signIn() {
GetSignInIntentRequest request =
GetSignInIntentRequest.builder()
.setServerClientId(getString(R.string.server_client_id))
.build();
Identity.getSignInClient(activity)
.getSignInIntent(request)
.addOnSuccessListener(
result -> {
try {
startIntentSenderForResult(
result.getIntentSender(),
REQUEST_CODE_GOOGLE_SIGN_IN,
/* fillInIntent= */ null,
/* flagsMask= */ 0,
/* flagsValue= */ 0,
/* extraFlags= */ 0,
/* options= */ null);
} catch (IntentSender.SendIntentException e) {
Log.e(TAG, "Google Sign-in failed");
}
})
.addOnFailureListener(
e -> {
Log.e(TAG, "Google Sign-in failed", e);
});
}
处理登录结果
在 onActivityResult
中,检索 SignInCredential
。从 getSignInCredentialFromIntent
返回的 SignInCredential
对象包含有关有效登录的信息。如果用户由于某种原因而未能登录,系统会抛出 ApiException
。
@Override
public void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if(resultCode == Activity.RESULT_OK) {
if (requestCode == REQUEST_CODE_GOOGLE_SIGN_IN) {
try {
SignInCredential credential = Identity.getSignInClient(this).getSignInCredentialFromIntent(data);
// Signed in successfully - show authenticated UI
updateUI(credential);
} catch (ApiException e) {
// The ApiException status code indicates the detailed failure reason.
}
}
}
}
private ActivityResultLauncher<IntentSenderRequest> loginResultHandler = registerForActivityResult(new ActivityResultContracts.StartIntentSenderForResult(), result -> {
// handle intent result here
});
成功登录的结果始终返回用户的全名、电子邮件地址和个人资料照片网址。如果您需要更多信息,可以将用户引导至完整的个人资料信息流程。