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