如需将 Google 登录集成到您的 Android 应用中,请配置 Google 登录,并在应用的布局中添加用于启动登录流程的按钮。
准备工作
配置 Google API 控制台项目并设置 Android Studio 项目。
配置 Google 登录和 GoogleSignInClient 对象
在登录 activity 的
onCreate
方法中,将 Google 登录配置为请求您的应用所需的用户数据。例如,若要将 Google 登录配置为请求用户的 ID 和基本个人资料信息,请使用DEFAULT_SIGN_IN
参数创建GoogleSignInOptions
对象。如需同时请求用户的电子邮件地址,请使用requestEmail
选项创建GoogleSignInOptions
对象。// Configure sign-in to request the user's ID, email address, and basic // profile. ID and basic profile are included in DEFAULT_SIGN_IN. GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN) .requestEmail() .build();
如果您需要请求额外的范围才能访问 Google API,请使用
requestScopes
指定这些范围。为了提供最佳用户体验,在用户登录时,请仅请求应用正常运行所需的最低级别权限范围。请仅在需要时请求任何其他范围,以便用户在执行操作时看到意见征求界面。请参阅请求附加作用域。然后,在登录 activity 的
onCreate
方法中,使用您指定的选项创建一个GoogleSignInClient
对象。// Build a GoogleSignInClient with the options specified by gso. mGoogleSignInClient = GoogleSignIn.getClient(this, gso);
检查是否有已登录的现有用户
在 activity 的 onStart
方法中,检查用户是否已使用 Google 账号登录您的应用。
// Check for existing Google Sign In account, if the user is already signed in // the GoogleSignInAccount will be non-null. GoogleSignInAccount account = GoogleSignIn.getLastSignedInAccount(this); updateUI(account);
如果 GoogleSignIn.getLastSignedInAccount
返回 GoogleSignInAccount
对象(而非 null
),则表示用户已使用 Google 账号登录您的应用。相应地更新界面,即隐藏登录按钮、启动主要 activity 或执行适合应用的任何操作。
如果 GoogleSignIn.getLastSignedInAccount
返回 null
,则表示用户尚未使用 Google 账号登录您的应用。更新界面以显示 Google 登录按钮。
在应用中添加 Google 登录按钮
在应用的布局中添加
SignInButton
:<com.google.android.gms.common.SignInButton android:id="@+id/sign_in_button" android:layout_width="wrap_content" android:layout_height="wrap_content" />
可选:如果您使用的是默认的登录按钮图形,而不是提供自己的登录按钮素材资源,则可以使用
setSize
方法自定义按钮的大小。// Set the dimensions of the sign-in button. SignInButton signInButton = findViewById(R.id.sign_in_button); signInButton.setSize(SignInButton.SIZE_STANDARD);
在 Android activity 中(例如,在
onCreate
方法中),注册按钮的OnClickListener
,以便用户只需点击该按钮即可登录:findViewById(R.id.sign_in_button).setOnClickListener(this);
启动登录流程
在 activity 的
onClick
方法中,使用getSignInIntent
方法创建登录 intent,然后使用startActivityForResult
启动该 intent,以处理登录按钮点按操作。@Override public void onClick(View v) { switch (v.getId()) { case R.id.sign_in_button: signIn(); break; // ... } }
private void signIn() { Intent signInIntent = mGoogleSignInClient.getSignInIntent(); startActivityForResult(signInIntent, RC_SIGN_IN); }
启动 intent 会提示用户选择用于登录的 Google 账号。如果您请求的作用域超出了
profile
、email
和openid
的范围,系统还会提示用户授予对请求的资源的访问权限。用户登录后,您可以在 activity 的
onActivityResult
方法中为用户获取GoogleSignInAccount
对象。@Override public void onActivityResult(int requestCode, int resultCode, Intent data) { 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. Task<GoogleSignInAccount> task = GoogleSignIn.getSignedInAccountFromIntent(data); handleSignInResult(task); } }
GoogleSignInAccount
对象包含有关已登录用户的信息,如用户的名称。private void handleSignInResult(Task<GoogleSignInAccount> completedTask) { try { GoogleSignInAccount account = completedTask.getResult(ApiException.class); // Signed in successfully, show authenticated UI. updateUI(account); } catch (ApiException e) { // The ApiException status code indicates the detailed failure reason. // Please refer to the GoogleSignInStatusCodes class reference for more information. Log.w(TAG, "signInResult:failed code=" + e.getStatusCode()); updateUI(null); } }
您还可以使用
getEmail
获取用户的电子邮件地址,使用getId
获取用户的 Google ID(供客户端使用),以及使用getIdToken
获取用户的 ID 令牌。如果您需要将当前已登录的用户传送至后端服务器,请将 ID 令牌发送到您的后端服务器并在服务器上验证该令牌。