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

时间:2013-05-30 04:16:57

标签: android google-plus access-token

我正在开发一个我已经整合了google plus的应用程序。到目前为止它工作正常,我能够检索用户配置文件。

但现在我想做以下事情:

1)我有两项活动signInActivityshareActivity

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

3)如果用户未在signInActivity中登录并尝试使用shareActivity共享数据,则应该向用户签名,然后仅共享数据。在这种情况下,如果用户返回signInActivity,则应用应显示“您已签名”

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

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

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

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:16)

0。 TL; DR

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

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

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

  1. 它隐藏了Google API客户端。
  2. 它有有限的状态。
  3. 这是一个(相当)独特的。
  4. 当前状态会影响应用的行为。
  5. 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();
        }
    }
    

    活动可以通过方法connectdisconnectrevoke与Connection类进行通信,但它们的行为由当前状态决定。状态机需要以下方法:

    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);
    }
    

    2。状态模式

    这是一种行为模式,允许对象在其内部状态发生变化时改变其行为。 GoF Design Patterns book描述了这种模式如何表示TCP连接(这也是我们的例子)。

    状态机的状态应该是singleton,在Java中最简单的方法是创建名为Enum的{​​{1}},如下所示:

    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) {} 类包含上下文,即当前状态,它定义Connection方法Connectionconnectdisconnect的行为方式:

    revoke

    3。单身人士模式

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

    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);
    }
    

    4。可观察模式

    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; } 类扩展了Java Connection,因此一个或多个活动可以观察状态变化:

    Observable

答案 2 :(得分:6)

对于阅读此问题的任何人,您也可以check this answer by Ian Barber以及下面的答案,由Lee回答,它解释了使用Google加上登录和多项活动的三种主要方式,我认为这些方法非常有用。