[英]Getting 'Error authenticating with Google: unknown' exception when trying to signin with google after installing app from play store. See details
I have integrated Google signin in my app.我在我的应用程序中集成了 Google 登录。
When I'm testing the app on my device by directly installing it from android studio, Google signin is working fine.当我通过直接从 android studio 安装来测试我的设备上的应用程序时,Google 登录工作正常。
But, after publishing a beta version of my app and then installing it from play store, when I'm trying to signin with Google, I'm getting the following error: ' Error authenticating with Google: unknown
'.但是,在发布我的应用程序的 Beta 版并从 Play 商店安装它之后,当我尝试使用 Google 登录时,出现以下错误:“ Error authenticating with Google: unknown
”。
Here's my code:这是我的代码:
// in onCreate()
googleLoginButton = (SignInButton) findViewById(R.id.google_login_button);
googleLoginButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
mGoogleLoginClicked = true;
if (!mGoogleApiClient.isConnecting()) {
if (mGoogleConnectionResult != null) {
resolveSignInError();
} else if (mGoogleApiClient.isConnected()) {
getGoogleOAuthTokenAndLogin();
} else {
/* connect API now */
Log.d(TAG, "Trying to connect to Google API");
mGoogleApiClient.connect();
}
}
}
});
/* Setup the Google API object to allow Google+ logins */
mGoogleApiClient = new GoogleApiClient.Builder(this)
.addConnectionCallbacks(this)
.addOnConnectionFailedListener(this)
.addApi(Plus.API)
.addScope(Plus.SCOPE_PLUS_LOGIN)
.addScope(Plus.SCOPE_PLUS_PROFILE)
.addScope(new Scope("https://www.googleapis.com/auth/userinfo.email"))
.build();
// in onActivityResult()
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
Map<String, String> options = new HashMap<String, String>();
if (requestCode == RC_GOOGLE_LOGIN) {
/* This was a request by the Google API */
if (resultCode != RESULT_OK) {
mGoogleLoginClicked = false;
}
mGoogleIntentInProgress = false;
if (!mGoogleApiClient.isConnecting()) {
mGoogleApiClient.connect();
}
} else {
/* Otherwise, it's probably the request by the Facebook login button, keep track of the session */
mFacebookCallbackManager.onActivityResult(requestCode, resultCode, data);
}
}
// rest of the code:
private void resolveSignInError() {
if (mGoogleConnectionResult.hasResolution()) {
try {
mGoogleIntentInProgress = true;
mGoogleConnectionResult.startResolutionForResult(this, RC_GOOGLE_LOGIN);
} catch (IntentSender.SendIntentException e) {
// The intent was canceled before it was sent. Return to the default
// state and attempt to connect to get an updated ConnectionResult.
mGoogleIntentInProgress = false;
mGoogleApiClient.connect();
}
}
}
private void getGoogleOAuthTokenAndLogin() {
/* Get OAuth token in Background */
AsyncTask<Void, Void, String> task = new AsyncTask<Void, Void, String>() {
String errorMessage = null;
@Override
protected String doInBackground(Void... params) {
String token = null;
try {
String scope = "oauth2:https://www.googleapis.com/auth/plus.login";
// logcat showing error on this line -> token = GoogleAuthUtil.getToken(SignupScreenActivity.this, Plus.AccountApi.getAccountName(mGoogleApiClient), scope);
} catch (IOException transientEx) {
/* Network or server error */
Log.e(TAG, "Error authenticating with Google: " + transientEx);
errorMessage = "Network error: " + transientEx.getMessage();
} catch (UserRecoverableAuthException e) {
Log.w(TAG, "Recoverable Google OAuth error: " + e.toString());
/* We probably need to ask for permissions, so start the intent if there is none pending */
if (!mGoogleIntentInProgress) {
mGoogleIntentInProgress = true;
Intent recover = e.getIntent();
startActivityForResult(recover, RC_GOOGLE_LOGIN);
}
} catch (GoogleAuthException authEx) {
/* The call is not ever expected to succeed assuming you have already verified that
* Google Play services is installed. */
Log.e(TAG, "Error authenticating with Google: " + authEx.getMessage(), authEx);
errorMessage = "Error authenticating with Google: " + authEx.getMessage();
}
return token;
}
@Override
protected void onPostExecute(String token) {
mGoogleLoginClicked = false;
if (token != null) {
progressDialog = ProgressDialog.show(SignupScreenActivity.this, "",
"Logging in with google...", true);
progressDialog.show();
/* Successfully got OAuth token, now login with Google */
ref.authWithOAuthToken("google", token, new Firebase.AuthResultHandler() {
@Override
public void onAuthenticated(AuthData authData) {
Intent mainActivityIntent = new Intent(SignupScreenActivity.this, MainActivity.class);
mainActivityIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
mainActivityIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
startActivity(mainActivityIntent);
progressDialog.hide();
}
@Override
public void onAuthenticationError(FirebaseError firebaseError) {
Toast.makeText(getBaseContext(), firebaseError.getMessage(), Toast.LENGTH_LONG).show();
progressDialog.hide();
}
});
} else if (errorMessage != null) {
Toast.makeText(getBaseContext(), errorMessage, Toast.LENGTH_LONG).show();
}
}
};
task.execute();
}
@Override
public void onConnected(final Bundle bundle) {
/* Connected with Google API, use this to authenticate with Firebase */
getGoogleOAuthTokenAndLogin();
}
@Override
public void onConnectionFailed(ConnectionResult result) {
if (!mGoogleIntentInProgress) {
/* Store the ConnectionResult so that we can use it later when the user clicks on the Google+ login button */
mGoogleConnectionResult = result;
if (mGoogleLoginClicked) {
/* The user has already clicked login so we attempt to resolve all errors until the user is signed in,
* or they cancel. */
resolveSignInError();
} else {
Log.e(TAG, result.toString());
}
}
}
@Override
public void onConnectionSuspended(int i) {
// ignore
}
logcat
details: logcat
详细信息:
Error authenticating with Google: Unknown
com.google.android.gms.auth.GoogleAuthException: Unknown
at com.google.android.gms.auth.GoogleAuthUtil$1.zzam(Unknown Source)
at com.google.android.gms.auth.GoogleAuthUtil$1.zzan(Unknown Source)
at com.google.android.gms.auth.GoogleAuthUtil.zza(Unknown Source)
at com.google.android.gms.auth.GoogleAuthUtil.zza(Unknown Source)
at com.google.android.gms.auth.GoogleAuthUtil.getToken(Unknown Source)
at com.google.android.gms.auth.GoogleAuthUtil.getToken(Unknown Source)
at com.google.android.gms.auth.GoogleAuthUtil.getToken(Unknown Source)
at com.abc.xyz.SignupScreenActivity$10.doInBackground(SignupScreenActivity.java:480)
at com.abc.xyz.SignupScreenActivity$10.doInBackground(SignupScreenActivity.java:471)
at android.os.AsyncTask$2.call(AsyncTask.java:288)
at java.util.concurrent.FutureTask.run(FutureTask.java:237)
at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
at java.lang.Thread.run(Thread.java:818)
Here's build.gradle
:这是build.gradle
:
apply plugin: 'com.android.application'
apply plugin: 'com.google.gms.google-services'
android {
compileSdkVersion 23
buildToolsVersion "23.0.2"
defaultConfig {
applicationId "com.abc.xyz"
minSdkVersion 16
targetSdkVersion 23
versionCode 4
versionName "0.3"
multiDexEnabled true
}
packagingOptions {
exclude 'META-INF/LICENSE'
exclude 'META-INF/LICENSE-FIREBASE.txt'
exclude 'META-INF/NOTICE'
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
}
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
testCompile 'junit:junit:4.12'
compile 'com.android.support:appcompat-v7:23.2.1'
compile 'com.android.support:design:23.2.1'
compile 'com.android.support:cardview-v7:23.2.1'
compile 'com.firebase:firebase-client-android:2.3.1'
compile 'com.facebook.android:facebook-android-sdk:4.1.0'
compile 'com.google.android.gms:play-services-maps:8.3.0'
compile 'com.google.android.gms:play-services-plus:8.3.0'
compile 'com.android.support:support-v4:23.2.1'
}
I don't know what's going wrong here!我不知道这里出了什么问题!
Please let me know.请告诉我。
Make sure you have created new client id using release version of SHA1 fingerprint.确保您已使用 SHA1 指纹的发布版本创建了新的客户端 ID。
Open terminal (in Unix , in MAC ), ( cmd
in Windows ) and cd
to this (your java) path:打开终端(在Unix 中,在MAC 中),(在Windows 中为cmd
)并cd
到此(您的 java)路径:
C:\Program Files\Java\jdk1.6.0_43\bin>
Run this command:运行此命令:
keytool -list -v -keystore "your keystore path" -alias "keystore alias name" -storepass "keystore password" -keypass "keystore password"
As far as I remember, in order to generate an access key for Google APIs, you must provide some data about your app, including the key that are using to sign your APK.据我所知,为了生成 Google API 的访问密钥,您必须提供一些有关您的应用的数据,包括用于签署您的 APK 的密钥。 As Baijrao Shinde has pointed out in his answer, you should double check that you have two distinct client ID for running your application in debug mode (installing directly from your Android Studio using the debug key to sing the APK) and production mode (installing from Google Play using the production key to sign the APK).正如 Baijrao Shinde 在他的回答中指出的那样,您应该仔细检查您是否有两个不同的客户端 ID,用于在调试模式(直接从 Android Studio 使用调试密钥唱 APK)和生产模式(从 Android Studio 安装)下运行您的应用程序Google Play 使用生产密钥对 APK 进行签名)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.