为什么Google+登录会因错误而登录?

时间:2014-03-19 06:47:25

标签: android google-api google-plus

我最近一直在处理关于Android的Google+登录,有一件事让我烦恼。

在所有官方批准的示例中,没有专门显示登录过程的方法。每次尝试记录某人时调用的方法称为resolveSignInError(),如下所示:

private void resolveSignInError() {
    if (mConnectionResult.hasResolution()) {
        try {
            mIntentInProgress = true;
            mConnectionResult.startResolutionForResult(this, RC_SIGN_IN);
            Log.d("mGoogleApiClient ", mGoogleApiClient.toString());

        } catch (IntentSender.SendIntentException e) {
            mIntentInProgress = false;
            mGoogleApiClient.connect();
        }
    }
}

此方法还依赖于mConnectionResult这一事实,该连接在on连接失败方法中设置

public void onConnectionFailed(ConnectionResult result) {
    if (!result.hasResolution()) {
        GooglePlayServicesUtil.getErrorDialog(result.getErrorCode(), this,
                0).show();
        return;
    }

    if (!mIntentInProgress) {
        // Store the ConnectionResult for later usage
        mConnectionResult = result;

        if (mSignInClicked) {
            // The user has already clicked 'sign-in' so we attempt to
            // resolve all
            // errors until the user is signed in, or they cancel.
            resolveSignInError();
        }
    }
} 

因此,整个计划围绕着至少一次登录失败。 有谁知道为什么没有一种方法可以直接登录谷歌加? 为什么这是构建可读软件的一种方式?

3 个答案:

答案 0 :(得分:2)

原因是该设备无法确定您是否确实需要登录 - 登录实际上更像是访问设施(就像您可能使用位置一样)而不是输入用户名和密码。基本流程是:

  1. 连接到Google Play服务,查看该应用是否已获得授权。
  2. 如果有,则连接成功。
  3. 如果不是,则连接失败。
  4. 如果您想要登录,则需要完成连接结果解析。

    微妙的是,即使用户之前从未在设备上使用该应用,您也可以转到第2步!所以,例如,如果我去你的网站并在那里登录,那么安装你的Android应用程序。

    1. 应用启动,并检索您的用户帐户列表(通过GET_ACCOUNTS权限)
    2. 它尝试使用任何帐户
    3. 连接到Google Play服务
    4. Google Play服务呼叫Google身份验证服务器,发现您已登录该应用程序(在此情况下,在网络上)
    5. 该应用获取onConnected回调
    6. 因此,没有登录方法的原因是登录状态实际上是远程的 - 它存在于Google服务器上,而不是设备本身。因此,流程必须是异步的。

答案 1 :(得分:0)

我知道这个帖子很老了。每次在Google上都会更新。现在google play store API v 8.4已经发布,onConnectionFailed正是它所要做的。

检查此链接 https://github.com/googlesamples/google-services/blob/master/android/signin/app/src/main/java/com/google/samples/quickstart/signin/SignInActivity.java

答案 2 :(得分:-1)

以下是非常正常的示例https://developers.google.com/+/mobile/android/sign-in

有方法

`@Override
public void onConnected(Bundle connectionHint) {
  mSignInClicked = false;
  Toast.makeText(this, "User is connected!", Toast.LENGTH_LONG).show();
}`

第一步是https://developers.google.com/+/mobile/android/getting-started