dd6*_*619 24 android access-token google-plus
我正在开发一个我已集成谷歌加上的应用程序.到目前为止它工作正常,我能够检索用户配置文件.
但现在我想做以下事情:
1)我有两个活动signInActivity和shareActivity.
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
JP *_*ura 16
对于不耐烦的编码器,可以在GitHub上找到以下实现的工作版本.这是另一个Stack Overflow帖子上写的相同答案.
在许多不同的应用程序中多次重写登录活动代码后,简单(而不是那么优雅)的解决方案是将Google API客户端创建为Application类对象.但是,由于连接状态会影响用户体验流程,因此我从未对这种方法感到高兴.
将我们的问题仅减少到连接概念,我们可以考虑:
由于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();
}
}
Run Code Online (Sandbox Code Playgroud)
活动可以通过方法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);
}
Run Code Online (Sandbox Code Playgroud)
这是一种行为模式,允许对象在其内部状态发生变化时改变其行为.在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)
由于不需要重复重新创建此类,因此我们将其作为单例提供:
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)
在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)
| 归档时间: |
|
| 查看次数: |
12657 次 |
| 最近记录: |