Подтвердить что ты не робот

Доступ к Google плюс клиенту из нескольких действий

Я разрабатываю приложение, в котором я интегрировал google plus. Пока он работает отлично, я могу получить профиль пользователя.

Но теперь я хочу сделать следующее:

1) У меня есть две активности signInActivity и shareActivity.

2) Если пользователь уже использует signInActivity, то он не должен снова запрашивать подпись shareActivity и должен напрямую делиться контентом.

3) Если пользователь не подписан в signInActivity и пытается обмениваться данными с помощью shareActivity, тогда приложение должно подписаться на пользователя, а затем делиться только данными. В этом случае, если пользователь вернется к signInActivity, тогда приложение должно показать, что "вы уже подписали"

Короче говоря, я хочу, чтобы пользовательский указатель был Центральным внутри приложения, так что, если он подписан в alrady, он должен быть доступен из любой активности.

Я слышал про токен доступа, но я не знаю, как его использовать, и в документе говорится, что он истекает через час, который мне не нужен.

Как я могу сделать центральную ссылку Google плюс? Является ли это возможным? или мне нужно аутентифицировать пользователя в каждом действии?

4b9b3361

Ответ 1

Управление отдельным экземпляром GoogleApiClient в каждом действии будет не, при этом пользователь будет просить его выполнить несколько раз.

Вход в Google+ (т.е. GoogleApiClient) предоставляет интерфейс к учетным записям Google на устройстве и основной службе сервисов Google Play - он не имеет состояния для экземпляра GoogleApiClient. Таким образом, как только учетная запись устройства будет аутентифицирована для вашего приложения, новые экземпляры GoogleApiClient получат доступ к одному и тому же состоянию. GoogleApiClient специально разработан, чтобы быть легким способом доступа к центральному состоянию, управляемому службами Google Play.

Вам повезло в токенах доступа! Службы Google Play заботятся обо всех маркерах для вас. Поэтому, хотя токены доступа продолжаются всего один час, как вы говорите, если вы попытаетесь использовать свой PlusClient для доступа к API Google и ваш токен доступа истек, службы Google Play будут прозрачно запрашивать новый токен доступа для вас и завершить вызов.

Взгляните на первую часть этого разговора по вводу/выводу Google для более подробной информации:

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

Ответ 2

0. TL; DR

Для нетерпеливого кодера рабочую версию следующей реализации можно найти на GitHub. Это тот же ответ, написанный на другой пост.

После перезаписи кода активности входа несколько раз во многих разных приложениях легкое (и не очень элегантное) решение создало клиент Google API как объект класса приложения. Но, поскольку состояние соединения влияет на поток UX, я никогда не был доволен этим подходом.

Уменьшая нашу проблему только до концепции соединения, мы можем считать, что:

  • Он скрывает клиента API Google.
  • Он имеет конечные состояния.
  • Это (скорее) уникальный.
  • Текущее состояние влияет на поведение приложения.

1. Шаблон прокси-сервера

Так как Connection инкапсулирует GoogleApiClient, он реализует ConnectionCallbacks и OnConnectionFailedListener:

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

Действия могут связываться с классом Connection с помощью методов 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. Шаблон состояния

Это поведенческий шаблон, позволяющий объекту изменять его поведение при изменении его внутреннего состояния. Книга шаблонов дизайна GoF описывает, как TCP-соединение может быть представлено этим шаблоном (что также является нашим случаем).

Состояние из конечного автомата должно быть 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) {}

Класс 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);
}

3. Шаблон Singleton

Поскольку нет необходимости повторно создавать этот класс повторно, мы предоставляем его как singleton:

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

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...
}

Ответ 3

Для тех, кто читает этот вопрос, вы также можете проверить этот ответ от Ian Barber, а также тот, который приведен ниже, ответил Ли, который объясняет три широких способа работы с Google плюс логин и несколько видов деятельности, которые я нашел очень полезными на самом деле.