Android:Google 登录 - “DEFAULT_SIGN_IN”和“DEFAULT_GAMES_SIGN_IN”之间的区别

Posted

技术标签:

【中文标题】Android:Google 登录 - “DEFAULT_SIGN_IN”和“DEFAULT_GAMES_SIGN_IN”之间的区别【英文标题】:Android: Google Sign In - difference between 'DEFAULT_SIGN_IN' and 'DEFAULT_GAMES_SIGN_IN' 【发布时间】:2018-08-07 15:17:51 【问题描述】:

我正在尝试在我的 androidStudio 应用中实现 Google 登录。我正在使用它:

GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN).requestEmail().requestServerAuthCode(clientID).build();

我已从 API 控制台将我的客户端 ID 正确设置为 Web 应用程序客户端 ID,并且 SHA1 肯定设置正确。

当我更改为这个时(使用 DEFAULT_GAMES_SIGN_IN 代替):

GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_GAMES_SIGN_IN).requestEmail().requestServerAuthCode(clientID).build();

我收到一条错误消息,消息为 null,状态码为 12501。

DEFAULT_GAMES_SIGN_IN 和 DEFAULT_SIGN_IN 有什么区别?我需要为游戏登录做一些不同的事情吗?

这是我所有的代码:

import android.content.Intent;
import android.support.annotation.NonNull;
import android.support.v7.app.AlertDialog;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.TextView;
import com.google.android.gms.auth.api.Auth;
import com.google.android.gms.auth.api.signin.GoogleSignIn;
import com.google.android.gms.auth.api.signin.GoogleSignInAccount;
import com.google.android.gms.auth.api.signin.GoogleSignInClient;
import com.google.android.gms.auth.api.signin.GoogleSignInOptions;
import com.google.android.gms.auth.api.signin.GoogleSignInResult;
import com.google.android.gms.common.api.GoogleApiClient;
import com.google.android.gms.tasks.OnCompleteListener;
import com.google.android.gms.tasks.Task;

public class MainActivity extends AppCompatActivity 

GoogleSignInClient mGoogleSignInClient;
String clientID;
int RC_SIGN_IN = 9001;

@Override
protected void onCreate(Bundle savedInstanceState) 
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    clientID = getString(R.string.client_id);

    GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_GAMES_SIGN_IN).requestEmail().requestServerAuthCode(clientID).build();

    mGoogleSignInClient = GoogleSignIn.getClient(this, gso);

    signInSilently();



private void signInSilently()
    mGoogleSignInClient.silentSignIn().addOnCompleteListener(this, new OnCompleteListener<GoogleSignInAccount>() 
        @Override
        public void onComplete(@NonNull Task<GoogleSignInAccount> task) 
            if(task.isSuccessful())
                GoogleSignInAccount signedInAccount = task.getResult();
                setText(signedInAccount.getEmail(), signedInAccount.getDisplayName());
            else
                interactiveSignIn();
            
        
    );


private void interactiveSignIn()
    Intent i = mGoogleSignInClient.getSignInIntent();
    startActivityForResult(i, RC_SIGN_IN);


@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) 
    super.onActivityResult(requestCode, resultCode, data);
    if(requestCode == RC_SIGN_IN)
        GoogleSignInResult result = Auth.GoogleSignInApi.getSignInResultFromIntent(data);
        if(result.isSuccess())
            GoogleSignInAccount signedInAccount = result.getSignInAccount();
            setText(signedInAccount.getEmail(), signedInAccount.getDisplayName());
        else
            String message = "ERROR: " + result.getStatus().getStatusMessage() + " - CODE: " + result.getStatus().getStatusCode();
            showAlert(message);
        
    


void showAlert(String message)
    new AlertDialog.Builder(this).setMessage(message).setNeutralButton("OK", null).show();


void setText(String email, String name)
    TextView tv = (TextView) findViewById(R.id.Test_TextView);

    tv.setText("EMAIL: " + email + "   NAME: " + name);

【问题讨论】:

如果您检查此blog,以下是DEFAULT_GAMES_SIGN_IN 的实施方式。 GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_GAMES_SIGN_IN).requestEmail().build();。检查这是否有效。 【参考方案1】:

一个区别是 DEFAULT_GAMES_SIGN_IN 请求 Games.SCOPE_GAMES_LITE 范围。

这是在您的应用程序中使用 Google Play Games api 所必需的。

(注意:我不能 100% 确定它是 lite 范围。它可能会请求 Games.SCOPE_GAMES。但是,文档中 SCOPE_GAMES 上的search 会显示已弃用的接口,其新的替代品都需要 SCOPE_GAMES_LITE)

但是,要登录 Google Play 游戏,您的应用必须设置有 Google Play 游戏服务。

具体操作方法请参考官方guide。

第一次请仔细按照说明操作,因为任何小错误都会导致登录失败。

设置完成后,您可能需要查看游戏专用登录guide。

【讨论】:

以上是关于Android:Google 登录 - “DEFAULT_SIGN_IN”和“DEFAULT_GAMES_SIGN_IN”之间的区别的主要内容,如果未能解决你的问题,请参考以下文章

测试 Google 登录 Android

如何在 Xamarin.Android 应用上集成新的 Google 登录?

Android 无效 ID 令牌的 Google 登录

android应用集成google登录

Android Google Login 登录错误,android 构建系统

Android Google登录例外