我一直致力于为我的Android应用设置Google+登录。使用我的网络应用程序的客户端ID和密码在Firebase上设置了后端,但在尝试使用Android Studio上的Google帐户登录后,它会引发以下运行时错误:
ConnectionResult {statusCode = SIGN_IN_REQUIRED,resolution = PendingIntent {3a466ee7:android.os.BinderProxy@2586e4da},message = null}
以下是我的代码的一些重要摘要:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mGoogleLoginButton = (SignInButton) findViewById(R.id.sign_in_button);
mGoogleLoginButton.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)
.build();
Firebase.setAndroidContext(this);
mFirebaseRef = new Firebase("https://boiling-heat-5858.firebaseio.com");
mAuthProgressDialog = new ProgressDialog(this);
mAuthProgressDialog.setTitle("Loading");
mAuthProgressDialog.setMessage("Authenticating with Firebase...");
mAuthProgressDialog.setCancelable(false);
mAuthProgressDialog.show();
mAuthStateListener = new Firebase.AuthStateListener() {
private TextView mLoggedInStatusTextView;
private void setAuthenticatedUser(AuthData authData) {
mGoogleLoginButton.setVisibility(View.GONE);
String name = null;
if (name != null) {
mLoggedInStatusTextView.setText("Logged in as " + name + " (" + authData.getProvider() + ")");
}
else {
mGoogleLoginButton.setVisibility(View.VISIBLE);
}}
public void onAuthStateChanged(AuthData authData) {
mAuthProgressDialog.hide();
}
};
/* Check if the user is authenticated with Firebase already. If this is the case we can set the authenticated
* user and hide hide any login buttons */
mFirebaseRef.addAuthStateListener(mAuthStateListener);
mGoogleApiClient = new GoogleApiClient.Builder(this)
.addConnectionCallbacks(this)
.addOnConnectionFailedListener(this)
.addApi(Plus.API)
.addScope(Plus.SCOPE_PLUS_LOGIN)
.build();
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();
}
}
}
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 = String.format("oauth2:%s", Scopes.PLUS_LOGIN);
token = GoogleAuthUtil.getToken(OAuth.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, OAuth.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;
Intent resultIntent = new Intent();
if (token != null) {
mFirebaseRef.authWithOAuthToken("google", token, new AuthResultHandler("google"));
} /*else if (errorMessage != null) {
// rmAuthProgressDialog.hide();
//showErrorDialog(errorMessage);
}*/
}
};
task.execute();
}
我花了几个小时研究和尝试所有关于这个主题的现有主题,但到目前为止没有任何帮助。希望有人能够指出我错过了什么。