從 Play 商店安裝應用程序後嘗試使用 Google 登錄時出現“使用 Google 進行身份驗證時出錯:未知”異常。閱讀詳情 (Getting 'Error authenticating with Google: unknown' exception when trying to signin with google after installing app from play store. See details)


問題描述

從 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 NasirBajirao ShindeDanail Alexiev)

參考文件

  1. Getting 'Error authenticating with Google: unknown' exception when trying to signin with google after installing app from play store. See details (CC BY‑SA 2.5/3.0/4.0)

#android-googleapiclient #android-studio #Android #google-signin #google-plus






相關問題

Scope 在 GoogleApiClient 中的作用是什麼? (What does Scope do in GoogleApiClient?)

Android studio - 將 GCM api 更新為 Google 服務 (Android studio - updating GCM api to Google services)

Android:為沒有 Google Play 服務的用戶登錄 Google? (Android: Google signin for a user without Google Play Services?)

GoogleApiClient onConnected 未被調用,在服務中使用 (GoogleApiClient onConnected not being called, using in a Service)

從 Play 商店安裝應用程序後嘗試使用 Google 登錄時出現“使用 Google 進行身份驗證時出錯:未知”異常。閱讀詳情 (Getting 'Error authenticating with Google: unknown' exception when trying to signin with google after installing app from play store. See details)

Android google Sign In 總是顯示 handleSignInResult:false (Android google Sign In always shows handleSignInResult:false)

Android Google Play 遊戲服務 (Android Google Play Games Services)

android - 即使沒有可用的互聯網,也會調用 onLocationChanged (android - onLocationChanged is called even when there is not internet available)







留言討論