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

Android 从多个活动访问google plus客户端,android,google-plus,access-token,Android,Google Plus,Access Token,我正在开发一个集成了GooglePlus的应用程序。到目前为止,它工作正常,我能够检索用户配置文件 但现在我想做以下几点: 1) 我有两个活动重要活动和共享活动 2) 如果用户已经使用signInActivity登录,则不应在中再次请求登录 shareActivity并应直接共享内容 3) 如果用户未在签名活动中签名,并尝试使用shareActivity共享数据,则应用程序应签名用户,然后仅共享数据。在这种情况下,如果用户返回到符号活动,则应用程序应显示“您已登录” 简言之,我希望用户登录在应用

我正在开发一个集成了GooglePlus的应用程序。到目前为止,它工作正常,我能够检索用户配置文件

但现在我想做以下几点:

1) 我有两个活动
重要活动
共享活动

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

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

简言之,我希望用户登录在应用程序中处于中心,这样,如果它在应用程序中始终被签名,那么它应该可以从任何活动中访问

我听说了访问令牌,但我不知道如何使用它,文件说它在一个小时后过期,这不是我想要的


我如何使中央谷歌加签名?可能吗?或者我需要对每个活动中的用户进行身份验证?

在每个活动中管理一个单独的GoogleAppClient实例将不会导致要求用户多次登录

Google+登录(即GoogleAppClient)为设备上的Google帐户和Google Play services核心服务提供了一个接口-它没有每个GoogleAppClient实例的状态。因此,一旦应用程序的设备帐户通过身份验证,GoogleAppClient的新实例将访问相同的状态。GoogleAppClient是专门设计用来访问由Google Play服务管理的中央状态的轻量级方式

关于访问令牌,您很幸运!Google Play services为您管理所有代币。因此,尽管访问令牌仅持续一小时,正如您所说,如果您尝试使用PlusClient访问Google API,并且您的访问令牌已过期,Google Play服务将透明地为您请求新的访问令牌并完成调用

有关更多详细信息,请参阅本谷歌I/O讲座的第一部分:


对于阅读此问题的任何人,您也可以阅读下面由Lee回答的一个问题,这解释了使用Google plus登录和多种活动的三种广泛方式,我发现它们实际上非常有用。

0。TL;博士 对于不耐烦的程序员,可以在上找到以下实现的工作版本。这是写在另一张纸上的相同答案

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

将我们的问题仅限于连接概念,我们可以考虑:

  • 它隐藏了GoogleAPI客户端
  • 它有有限的状态
  • 这是(相当)独特的
  • 当前状态会影响应用程序的行为
  • 1.代理模式 由于
    连接
    封装了
    GoogleAppClient
    ,因此它将实现
    连接回调
    连接失败监听器

    @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();
        }
    }
    
    活动可以通过方法
    connect
    disconnect
    revoke
    与连接类通信,但它们的行为由当前状态决定。状态机需要以下方法:

    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.状态模式 这是一种行为模式,允许对象在其内部状态更改时改变其行为。描述了如何用这种模式表示TCP连接(这也是我们的例子)

    状态机的状态应该是
    单例
    ,在Java中最简单的方法是创建名为
    状态的
    枚举
    ,如下所示:

    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) {}
    
    连接
    类保存上下文,即当前状态,它定义了
    连接
    方法
    连接
    断开
    撤销
    的行为方式:

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

    另外请注意,PlusClient(developer.android.com/reference/com/google/android/gms/plus/…)现在被弃用,取而代之的是GoogleAppClient。关于如何实现GoogleAppClient的一个很好的例子可以在这里找到:@nommer您的链接不是与此问题相关的示例。您能告诉我这是哪个连接类吗?是连接(android.telecom)
    还是连接(java.sql)
    还是其他什么?
    @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...
    }