因此,对此有很多问题,而且似乎有很多(有些矛盾)文档。
我只是想让用户登录以将分数提交到我的应用程序中的Google Play服务排行榜上。
因此他们按“显示排行榜”,然后我开始登录检查过程:
public void displayLeaderboard()
{
if (checkPlayServices() == true)
{
// First, sign in.
GoogleSignInAccount account = GoogleSignIn.getLastSignedInAccount(this);
if (account == null)
{
// Need to get sign-in client?
if (_googleSignInClient == null)
{
// 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_GAMES_SIGN_IN).build();
_googleSignInClient = GoogleSignIn.getClient(this, gso);
}
Intent signInIntent = _googleSignInClient.getSignInIntent();
startActivityForResult(signInIntent, CALLBACK_SIGN_IN_TO_GOOGLE_ACCOUNT);
}
else
{
actualDisplayLeaderboard(account);
}
}
}
因此onActivityResult()确实捕获了回调,到目前为止效果很好:
protected void onActivityResult(int requestCode, int resultCode, Intent data)
{
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == CALLBACK_SIGN_IN_TO_GOOGLE_ACCOUNT)
{
// Result returned from launching the Intent from GoogleSignInClient.getSignInIntent()
Task<GoogleSignInAccount> task = GoogleSignIn.getSignedInAccountFromIntent(data);
try
{
GoogleSignInAccount account = task.getResult(ApiException.class);
// THIS IS WHERE IT FAILS
// **********************
// Signed in successfully.
// ...
}
catch (ApiException e)
{
// The ApiException status code indicates the detailed failure reason.
// Please refer to the GoogleSignInStatusCodes class reference for more information.
System.out.println("Failed to sign in.");
String message = e.getMessage();
System.out.println(message);
e.printStackTrace();
}
}
}
如上所述,这就是失败的地方。
12-10 17:24:54.877 12571-12571/*.*.* W/System.err: com.google.android.gms.common.api.ApiException: 12501:
12-10 17:24:54.877 12571-12571/*.*.* W/System.err: at com.google.android.gms.common.internal.ApiExceptionUtil.fromStatus(Unknown Source)
12-10 17:24:54.877 12571-12571/*.*.* W/System.err: at com.google.android.gms.auth.api.signin.GoogleSignIn.getSignedInAccountFromIntent(Unknown Source)
12-10 17:24:54.887 12571-12571/org.fortheloss.sticknodespro W/System.err: at *.*.*.AndroidLauncher.onActivityResult(AndroidLauncher.java:1013)
查看登录示例和页首横幅,我的代码看起来完全相同。
我觉得我对所有的Firebase控制台和/或Google Play服务控制台(他们已经知道了,这真是一团糟)都误入歧途了OAUTH和SHA-1东西我不知道自己需要什么,我想要什么不需要,到处都是,仍然无法使用。有些事情是针对“ Web应用程序”的-这不是Web应用程序-无论如何我都有凭据,放在应用程序中,等等-没关系,仍然不起作用。
任何指向正确方向的人都会受到赞赏。
答案 0 :(得分:0)
通常,答案是在发布问题后出现的。
这是解决方法
GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN).requestIdToken(getString(R.string.server_client_id)).requestScopes(Games.SCOPE_GAMES_LITE).build();
R.string.server_client_id
的描述如此处https://developers.google.com/identity/sign-in/android/start-integrating#get_your_backend_servers_oauth_20_client_id
(起初,它带给我的页面是用于我的应用程序的另一个版本的,因此,当我使用该凭据时,它显然不起作用。然后,我意识到我需要创建一个发布版本(使用我的释放密钥库)以使其正常工作。)
示例项目无法显示/提及^
他们甚至没有使用requestIdToken(...)
编辑:原因……尽管几乎在每个类似的StackOverflow答案中都使用了它,但不使用requestIDToken的原因是因为您不应该这样做。适用于Android应用程序。这是因为您应该在Android清单(从Google Play服务控制台链接的应用程序部分获取的app_id)中拥有此功能
<meta-data android:name="com.google.android.gms.games.APP_ID" android:value="@string/app_id" />
<meta-data android:name="com.google.android.gms.version" android:value="@integer/google_play_services_version"/>
如果您不包含Google Play服务,Google Play服务会大吼大叫的话,那将是一个很好的选择...