我最近一直在处理android上的Google+登录,有一件事一直困扰着我。
在所有官方认可的示例中,没有一个方法专门显示登录过程。每次尝试登录某人时调用的方法叫做resolveSignInError(),如下所示:
private void resolveSignInError() {
if (mConnectionResult.hasResolution()) {
try {
mIntentInProgress = true;
mConnectionResult.startResolutionForResult(this, RC_SIGN_IN);
Log.d("mGoogleApiClient ", mGoogleApiClient.toString());
} catch (IntentSender.SendIntentException e) {
mIntentInProgress = false;
mGoogleApiClient.connect();
}
}
}
此方法还依赖于存在mConnectionResult这一事实,它在on连接失败方法
中设置public void onConnectionFailed(ConnectionResult result) {
if (!result.hasResolution()) {
GooglePlayServicesUtil.getErrorDialog(result.getErrorCode(), this,
0).show();
return;
}
if (!mIntentInProgress) {
// Store the ConnectionResult for later usage
mConnectionResult = result;
if (mSignInClicked) {
// The user has already clicked 'sign-in' so we attempt to
// resolve all
// errors until the user is signed in, or they cancel.
resolveSignInError();
}
}
}
所以整个方案围绕至少一次登录失败而展开。有人知道为什么没有一种方法可以让你直接登录google +吗?为什么这作为一种构建可读软件的方式是有意义的?
原因是设备无法知道您是否真的需要登录-登录实际上更像是访问设施(就像您可能使用位置一样),而不是输入用户名和密码。基本流程为:
- 连接到Google Play服务,查看应用程序是否已授权。
- 如果是,则连接成功。
- 如果不是,连接失败。
如果您想要登录,则执行连接结果解析。
微妙的是,即使用户以前从未在设备上使用过该应用程序,你也可能会进入步骤2 !例如,如果我登录到你的网站,然后安装你的android应用。
- 应用程序启动,并检索你的用户帐户列表(通过GET_ACCOUNTS权限)
- 它尝试连接到Google Play服务与任何帐户
- Google Play服务调用到Google认证服务器,发现你已经登录到该应用程序(在这种情况下,在web上)
- 应用程序获得onConnected回调
所以没有登录方法的原因是登录状态实际上是远程的——它存在于Google服务器上,而不是设备本身。因此,流必须是异步的。
我知道这个线程是非常古老的。更新,因为这是每次出现在谷歌。现在google play store API v8.4发布了,onConnectionFailed做了它必须做的事情。
查看此链接https://github.com/googlesamples/google-services/blob/master/android/signin/app/src/main/java/com/google/samples/quickstart/signin/SignInActivity.java
这是一个很普通的例子https://developers.google.com/+/mobile/android/sign-in:
There is method
`@Override
public void onConnected(Bundle connectionHint) {
mSignInClicked = false;
Toast.makeText(this, "User is connected!", Toast.LENGTH_LONG).show();
}`
第一步有https://developers.google.com/+/mobile/android/getting-started