Android Google Plus 登录问题。 handleSignInResult 返回 False
Posted
技术标签:
【中文标题】Android Google Plus 登录问题。 handleSignInResult 返回 False【英文标题】:Android Google Plus sign in issue. handleSignInResult returns False 【发布时间】:2016-05-02 16:48:27 【问题描述】:我在集成 Google+ 登录功能时遇到了一些问题。到目前为止,我已经集成了所有必要的 G+ 登录 API 模块和代码,这些模块和代码运行良好,在使用 debug.keystore 的 keytool 生成 SHA1 并将 SHA1 粘贴到谷歌云后,生成并将 google-services.json 放置在 /app 中开发人员控制台,但现在我只面临一个小故障,因为很多天/几周,即当我尝试进行设备调试时,每当我点击“G+登录”时,我在 LogCat 中收到以下错误:
E/GMPM:getGoogleAppId 失败,状态为:10
E/GMPM:无法上传。应用测量已禁用。
D/SignInActivity:handleSignInResult:false
此 handleSignInResult 一直返回 False,无法登录以进一步获取数据。如果你们中的任何人曾经遇到过这种情况,请在这里帮助我。这个小障碍非常令人抓狂。
谢谢大家。
【问题讨论】:
尝试使用 Google 示例进行 g+ 登录。代码保持不变。您需要做的就是生成 google-services.json。在棉花糖运行时检索用户的电子邮件也需要权限 @Raghunandan 感谢您的回复,我已经使用了示例并且一切正常,前往开发者控制台为 G+ 登录和 GCM 生成通用 google-services.json 并将其放在 /app目录,当我在我的设备上测试它并尝试登录时,屏幕会在几秒钟内淡入淡出,它仍然在 LogCat 中给出 handleSignInResult:false 而我从示例中复制了代码,并根据我的要求并遵循 Google+ 登录集成教程中提供的所有必要步骤。 我不明白这个为 G+ 生成通用 google-services.json。需要根据应用名和包名重新生成文件。 @Raghunandan 我的意思是,我正在使用 Google 的 2 个 API,1)GCM API 和 2)G+ 登录 API。所以早些时候我只需要 GCM 推送通知,它工作得很好。现在根据新要求,我想将 G+ 登录集成到同一个应用程序中,并再次生成一个新的 google-services.json,它同时具有 GCM 和 G+ 登录的配置,下载它,粘贴新下载的 google-services .json 到 app/ 目录。代码运行良好,应用程序运行而不会崩溃,但是当我单击“G+ 登录”时,应用程序会在 LogCat 中抛出:D/SignInActivity:handleSignInResult:false 我遇到了同样的问题,解决方案很愚蠢。我不知道我关闭了互联网连接并试图调试应用程序。该错误非常具有误导性且不清楚,因为我刚刚收到错误代码 12501,而没有任何关于没有网络连接的信息。希望它可以帮助别人。 【参考方案1】:您使用的是 Plus.API 还是 Auth.GOOGLE_SIGN_IN_API?后者是最新改版的。在这里查看: https://developers.google.com/identity/sign-in/android/sign-in
如果您使用的是 Auth.GOOGLE_SIGN_IN_API:
在onActivityResult中,使用类似下面的代码可以得到一个状态码,由GoogleSignInStatusCodes定义:https://developers.google.com/android/reference/com/google/android/gms/auth/api/signin/GoogleSignInStatusCodes
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data)
super.onActivityResult(requestCode, resultCode, data);
// Result returned from launching the Intent from GoogleSignInApi.getSignInIntent(...);
if (requestCode == RC_SIGN_IN)
GoogleSignInResult result = Auth.GoogleSignInApi.getSignInResultFromIntent(data);
int statusCode = result.getStatus().getStatusCode();
最常见的问题是缺少正确的 OAuth2 客户端注册。 (不幸的是,目前状态码是 INTERNAL_ERROR 8,这没有帮助。)看看这个线程: Occured an INTERNAL_ERROR when requestEmail from GoogleSignInOptions Android
【讨论】:
嗨@Isabella,我正在使用后者,根据文档,我已经逐步遵循它们并实现了所有内容。现在,当我尝试在我的设备上登录时,该应用程序要求选择帐户,当我选择登录帐户时,设备屏幕会变暗几秒钟以尝试登录,然后什么也没有发生。当我检查 LogCat 时,我得到了同样的错误:E/GMPM: getGoogleAppId failed with status: 10
E/GMPM: Uploading is not possible. App measurement disabled.
D/SignInActivity: handleSignInResult:false
内联更新了答案
对我来说,除了新帐户外一切正常,当我添加新的谷歌帐户时,什么都不会发生......成功时我有时可以看到半透明覆盖,然后如果我点击标志它会自动退出在按钮 agian 这次发生自动登录...我的问题是为什么添加新帐户后无法恢复操作
@Bytecode 你能粘贴你的 GoogleSignInOptions 吗?支持添加新帐户的方案,我无法重现。
@IsabellaChen GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN) .requestEmail() .requestIdToken("xxxxx") .build();【参考方案2】:
请确保您在创建google-services.json
文件时应用了SHA-1
调试密钥。
【讨论】:
阿汉我会记住这一点的。到目前为止,我已经删除了 Google 登录,并计划在我的应用的下一个版本中添加它:) 如您所愿,但请记住应用 SHA-1 密钥以及两个客户端 ID 以使用 FCM 启用 google 身份验证 是的,如果有任何问题会发布,谢谢:)【参考方案3】:正如 Sudhanshu Gaur 在this post 中指出的那样,首先尝试使用与create your json configuration file 相同的密钥生成签名的apk。然后将其安装在您的设备上,看看它是否有效。原因是当您单击“运行”时,Android Studio 不会签署您的 apk。 我被困在完全相同的问题上,这个修复对我来说很好。
【讨论】:
阿汉,没错,发现集成登录非常混乱。但我想我最终会以某种方式设法整合。我面临的问题是当我必须在一个表单上集成 FB 登录和 G+ 登录时。也许这与我是一名中级 android 程序员有关。感谢您的努力,尽管指出:)【参考方案4】:如果您在 firebase 中添加所有 SHA-1 指纹仍然会出现错误。那么(我遇到了这个问题。在此步骤之后它已解决。)尝试以下步骤:
1.转到Google Console API credentials页面。
2.单击左侧选项卡中的凭据。
3. 已经存在两个默认的 Android 和 Web OAuth 客户端 ID。您必须创建 一个 Android 客户端 和一个 Web 2.0 客户端。
4.转到Firebase。在项目设置中,下载 google-services.json 并粘贴到应用文件夹中。
(一切都很好,但您仍然无法登录 google,这意味着可能是 OAuth 问题。所以请确保创建 Android 和 Web 客户端 ID。最后在凭证页面中,您有 2 个 Android 客户端和两个 Web 客户端 ID。)
【讨论】:
在我的情况下,我正在更新一个项目,由于某种原因,SHA-1 发生了变化。然后我将新的添加到 Firebase 控制台的允许列表中,它正在工作。谢谢。【参考方案5】:您需要在您的应用上提供签名证书的 SHA-1 哈希
示例:
已注册的 SHA-1:
CF:4A:A1:0A:BC:84:F2:31:28:C3:BA:A7:A3:A2:36:10:5F:1D:3E:CB 并下载您创建的配置文件..并替换为 *yourproject/app/google-service.json
//获取google-service.json文件教程 https://developers.google.com/identity/sign-in/android/start-integrating
//如何获取SHA-1 https://developers.google.com/android/guides/client-auth
【讨论】:
【参考方案6】:请检查您添加的 SHA-1 密钥是调试还是发布,根据您的密钥其工作相对于它。 我有同样的问题拿铁我知道我使用了版本 SHA-1 并且我正在调试测试然后它会得到错误的结果。 谢谢
【讨论】:
【参考方案7】:先生成调试密钥:
keytool -exportcert -list -v \
-alias androiddebugkey -keystore ~/.android/debug.keystore
然后将 SHA1 粘贴到指纹部分的 Firebase 或 Google 项目设置中。
【讨论】:
【参考方案8】:package com.google.samples.quickstart.signin;
import android.content.Intent;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.View;
import android.widget.TextView;
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.common.SignInButton;
import com.google.android.gms.common.api.ApiException;
import com.google.android.gms.tasks.OnCompleteListener;
import com.google.android.gms.tasks.Task;
/**
* Activity to demonstrate basic retrieval of the Google user's ID, email address, and basic
* profile.
*/
public class SignInActivity extends AppCompatActivity implements
View.OnClickListener
private static final String TAG = "SignInActivity";
private static final int RC_SIGN_IN = 9001;
private GoogleSignInClient mGoogleSignInClient;
private TextView mStatusTextView;
@Override
protected void onCreate(Bundle savedInstanceState)
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main_DEMO);
// Views
mStatusTextView = findViewById(R.id.status);
// Button listeners
findViewById(R.id.sign_in_button).setOnClickListener(this);
findViewById(R.id.sign_out_button).setOnClickListener(this);
findViewById(R.id.disconnect_button).setOnClickListener(this);
// [START configure_signin]
// 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();
// [END configure_signin]
// [START build_client]
// Build a GoogleSignInClient with the options specified by gso.
mGoogleSignInClient = GoogleSignIn.getClient(this, gso);
// [END build_client]
// [START customize_button]
// Set the dimensions of the sign-in button.
SignInButton signInButton = findViewById(R.id.sign_in_button);
signInButton.setSize(SignInButton.SIZE_STANDARD);
signInButton.setColorScheme(SignInButton.COLOR_LIGHT);
// [END customize_button]
@Override
public void onStart()
super.onStart();
// [START on_start_sign_in]
// 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);
// [END on_start_sign_in]
// [START onActivityResult]
@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);
// [END onActivityResult]
// [START handleSignInResult]
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);
// [END handleSignInResult]
// [START signIn]
private void signIn()
Intent signInIntent = mGoogleSignInClient.getSignInIntent();
startActivityForResult(signInIntent, RC_SIGN_IN);
/* Intent sign = mGoogleSignInClient.getSignInIntent ();
startActivityForResult ( sign, RC_SIGN_IN );*/
// [END signIn]
// [START signOut]
private void signOut()
mGoogleSignInClient.signOut()
.addOnCompleteListener(this, new OnCompleteListener<Void>()
@Override
public void onComplete(@NonNull Task<Void> task)
// [START_EXCLUDE]
updateUI(null);
// [END_EXCLUDE]
);
// [END signOut]
// [START revokeAccess]
private void revokeAccess()
mGoogleSignInClient.revokeAccess()
.addOnCompleteListener(this, new OnCompleteListener<Void>()
@Override
public void onComplete(@NonNull Task<Void> task)
// [START_EXCLUDE]
updateUI(null);
// [END_EXCLUDE]
);
// [END revokeAccess]
private void updateUI(@Nullable GoogleSignInAccount account)
if (account != null)
mStatusTextView.setText(getString(R.string.signed_in_fmt, account.getDisplayName()));
findViewById(R.id.sign_in_button).setVisibility(View.GONE);
findViewById(R.id.sign_out_and_disconnect).setVisibility(View.VISIBLE);
else
mStatusTextView.setText(R.string.signed_out);
findViewById(R.id.sign_in_button).setVisibility(View.VISIBLE);
findViewById(R.id.sign_out_and_disconnect).setVisibility(View.GONE);
@Override
public void onClick(View v)
switch (v.getId())
case R.id.sign_in_button:
signIn();
break;
case R.id.sign_out_button:
signOut();
break;
case R.id.disconnect_button:
revokeAccess();
break;
【讨论】:
强烈建议您添加一些关于您的答案的信息。以上是关于Android Google Plus 登录问题。 handleSignInResult 返回 False的主要内容,如果未能解决你的问题,请参考以下文章
无法使用 Google Plus 登录,出现 com.google.android.gms.common.api.ApiException: 10:
如何从 google plus 帐户中注销 google plus 在 android 中的集成
如何在我的 Android 应用程序中集成 google+ 登录?