从多个活动访问google plus客户端

dd6*_*619 24 android access-token google-plus

我正在开发一个我已集成谷歌加上的应用程序.到目前为止它工作正常,我能够检索用户配置文件.

但现在我想做以下事情:

1)我有两个活动signInActivityshareActivity.

2)如果用户已使用登录,signInActivity则不应再次请求登录, shareActivity并应直接共享内容.

3)如果用户未登录signInActivity并尝试使用shareActivity应用程序共享数据,则应该登录用户,然后仅共享数据.在这种情况下,如果用户返回到signInActivity那么应用程序应该显示"你已经签署"

简而言之,我希望用户登录在应用程序中是中心,这样如果它是alrady签名,它应该可以从任何活动访问.

我听说过访问令牌,但我不知道如何使用它,文档说它在一小时内到期,这不是我想要的.

我如何制作中央谷歌加登录?可能吗?或者我需要在每个活动中验证用户?

Lee*_*Lee 37

在每项活动中管理单独的GoogleApiClient实例不会导致要求用户多次登录.

Google+登录(即GoogleApiClient)为设备上的Google帐户和Google Play服务核心服务提供了一个界面 - 它没有每个GoogleApiClient实例的状态.因此,一旦设备帐户针对您的应用进行了身份验证,GoogleApiClient的新实例将访问相同的状态.GoogleApiClient专门设计为访问由Google Play服务管理的中央状态的轻量级方式.

关于访问令牌,你很幸运!Google Play服务会为您处理所有令牌管理.因此,虽然访问令牌只持续一小时,但正如您所说,如果您尝试使用PlusClient访问Google API且访问令牌已过期,Google Play服务将透明地为您请求新的访问令牌并完成调用.

有关详细信息,请查看此Google I/O演讲的第一部分:

http://www.youtube.com/watch?v=_KBHf1EODuk

  • 另请注意,PlusClient(developer.android.com/reference/com/google/android/gms/plus/ ...)现已弃用,以支持GoogleApiClient.有关如何实施GoogleApiClient的一个很好的示例,请访问:http://www.androidhive.info/2014/02/android-login-with-google-plus-account-1/ (4认同)

JP *_*ura 16

0. TL; DR

对于不耐烦的编码器,可以在GitHub上找到以下实现的工作版本.这是另一个Stack Overflow帖子上写的相同答案.

在许多不同的应用程序中多次重写登录活动代码后,简单(而不是那么优雅)的解决方案是将Google API客户端创建为Application类对象.但是,由于连接状态会影响用户体验流程,因此我从未对这种方法感到高兴.

将我们的问题仅减少到连接概念,我们可以考虑:

  1. 它隐藏了Google API客户端.
  2. 它有有限的状态.
  3. 它是(相当)独特的.
  4. 当前状态会影响应用程序的行为.

1.代理模式

由于Connection封装了GoogleApiClient它,它将实现ConnectionCallbacksOnConnectionFailedListener:

@Override
public void onConnected(Bundle hint) {
    changeState(State.OPENED);
}

@Override
public void onConnectionSuspended(int cause) {
    changeState(State.CLOSED);
    connect();
}

@Override
public void onConnectionFailed(ConnectionResult result) {
    if (currentState.equals(State.CLOSED) && result.hasResolution()) {
        changeState(State.CREATED);
        connectionResult = result;
    } else {
        connect();
    }
}
Run Code Online (Sandbox Code Playgroud)

活动可以通过方法Connection类沟通connect,disconnectrevoke,但他们的行为是由当前状态决定.状态机需要以下方法:

protected void onSignIn() {
    if (!googleApiClient.isConnected() && !googleApiClient.isConnecting()) {
        googleApiClient.connect();
    }
}

protected void onSignOut() {
    if (googleApiClient.isConnected()) {
        Plus.AccountApi.clearDefaultAccount(googleApiClient);
        googleApiClient.disconnect();
        googleApiClient.connect();
        changeState(State.CLOSED);
    }
}

protected void onSignUp() {
    Activity activity = activityWeakReference.get();
    try {
        changeState(State.OPENING);
        connectionResult.startResolutionForResult(activity, REQUEST_CODE);
    } catch (IntentSender.SendIntentException e) {
        changeState(State.CREATED);
        googleApiClient.connect();
    }
}

protected void onRevoke() {
    Plus.AccountApi.clearDefaultAccount(googleApiClient);
    Plus.AccountApi.revokeAccessAndDisconnect(googleApiClient);
    googleApiClient = googleApiClientBuilder.build();
    googleApiClient.connect();
    changeState(State.CLOSED);
}
Run Code Online (Sandbox Code Playgroud)

2.国家格局

这是一种行为模式,允许对象在其内部状态发生变化时改变其行为.在GoF的设计模式一书描述了一个TCP连接可以通过这种模式来表示(这也是我们的情况下).

来自状态机的状态应该是a singleton,并且在Java中最简单的方法是创建Enum命名State如下:

public enum State {
    CREATED {
        @Override
        void connect(Connection connection) {
            connection.onSignUp();
        }
        @Override
        void disconnect(Connection connection) {
            connection.onSignOut();
        }
    },
    OPENING {},
    OPENED {
        @Override
        void disconnect(Connection connection) {
            connection.onSignOut();
        }
        @Override
        void revoke(Connection connection) {
            connection.onRevoke();
        }
    },
    CLOSED {
        @Override
        void connect(Connection connection) {
            connection.onSignIn();
        }
    };

void connect(Connection connection) {}
void disconnect(Connection connection) {}
void revoke(Connection connection) {}
Run Code Online (Sandbox Code Playgroud)

Connection类保存上下文,即当前状态,它定义了如何Connection方法connect,disconnect以及revoke将表现:

public void connect() {
    currentState.connect(this);
}

public void disconnect() {
    currentState.disconnect(this);
}

public void revoke() {
    currentState.revoke(this);
}

private void changeState(State state) {
    currentState = state;
    setChanged();
    notifyObservers(state);
}
Run Code Online (Sandbox Code Playgroud)

3.单身模式

由于不需要重复重新创建此类,因此我们将其作为单例提供:

public static Connection getInstance(Activity activity) {
    if (null == sConnection) {
        sConnection = new Connection(activity);
    }

    return sConnection;
}

public void onActivityResult(int result) {
    if (result == Activity.RESULT_OK) {
        changeState(State.CREATED);
    } else {
        changeState(State.CLOSED);
    }
    onSignIn();
}

private Connection(Activity activity) {
    activityWeakReference = new WeakReference<>(activity);

    googleApiClientBuilder = new GoogleApiClient
           .Builder(activity)
           .addConnectionCallbacks(this)
           .addOnConnectionFailedListener(this)
           .addApi(Plus.API, Plus.PlusOptions.builder().build())
           .addScope(new Scope("email"));

    googleApiClient = googleApiClientBuilder.build();
    currentState = State.CLOSED;
}
Run Code Online (Sandbox Code Playgroud)

4.可观察的模式

Connection类扩展的Java Observable,所以1个或多个活动可以观察状态的变化:

@Override
protected void onCreate(Bundle bundle) {
    connection = Connection.getInstance(this);
    connection.addObserver(this);
}

@Override
protected void onStart() {
    connection.connect();
}

@Override
protected void onDestroy() {
    connection.deleteObserver(this);
    connection.disconnect();
}

@Override
protected void onActivityResult(int request, int result, Intent data) {
    if (Connection.REQUEST_CODE == request) {
        connection.onActivityResult(result);
    }
}

@Override
public void update(Observable observable, Object data) {
    if (observable != connection) {
        return;
    }
    // Your presentation logic goes here...
}
Run Code Online (Sandbox Code Playgroud)


Aca*_*lco 6

对于阅读此问题的任何人,您也可以查看Ian Barber的答案以及下面的答案,Lee回答,这解释了使用Google加登录和多种活动的三种主要方式,我发现这些方法非常有用.