問題描述
從 Play 商店安裝應用程序後嘗試使用 Google 登錄時出現“使用 Google 進行身份驗證時出錯:未知”異常。閱讀詳情 (Getting 'Error authenticating with Google: unknown' exception when trying to signin with google after installing app from play store. See details)
我已在我的應用中集成了 Google 登錄。
當我通過直接從 android studio 安裝它來測試我的設備上的應用程序時,谷歌登錄工作正常。
但是,在發布我的應用程序的測試版之後,然後從 Play 商店安裝它,當我嘗試使用 Google 登錄時,我收到以下錯誤:'Error authentication with Google: unknown
'。
這是我的代碼:
// 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
詳細信息:
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)
這裡是 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'
}
我不知道不知道這裡出了什麼問題!
請告訴我。
參考解法
方法 1:
Make sure you have created new client id using release version of SHA1 fingerprint.
Open terminal (in Unix, in MAC), (cmd
in Windows) and cd
to this (your java) path:
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"
方法 2:
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. 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).
(by Hammad Nasir、Bajirao Shinde、Danail Alexiev)