适用于 Android 的 Google+ 登录 - Google 权限活动结果代码

Posted

技术标签:

【中文标题】适用于 Android 的 Google+ 登录 - Google 权限活动结果代码【英文标题】:Google+ Sign-in for Android - Google Permissions Activity Result Codes 【发布时间】:2014-09-30 19:33:23 【问题描述】:

我在使用适用于 android 的 Google+ Sign 时发现了一个小问题,并且在搜索了网络之后(显然是这样),我大声问我的问题,看看是否有人注意到了同样的问题。

我正在为我的应用启用服务器端 API 访问,如所述 here. 让我详细说明发生了什么。拿这个片段:

Bundle appActivities = new Bundle();
appActivities.putString(GoogleAuthUtil.KEY_REQUEST_VISIBLE_ACTIVITIES,
          "<APP-ACTIVITY1> <APP-ACTIVITY2>");
String scopes = "oauth2:server:client_id:<SERVER-CLIENT-ID>:api_scope:<SCOPE1> <SCOPE2>";
String code = null;
try 
  code = GoogleAuthUtil.getToken(
      this,                                              // Context context
      Plus.AccountApi.getAccountName(mGoogleApiClient),  // String accountName
      scopes,                                            // String scope
      appActivities                                      // Bundle bundle
  );

 catch (IOException transientEx) 
  // network or server error, the call is expected to succeed if you try again later.
  // Don't attempt to call again immediately - the request is likely to
  // fail, you'll hit quotas or back-off.
  ...
  return;
 catch (UserRecoverableAuthException e) 
  // Requesting an authorization code will always throw
  // UserRecoverableAuthException on the first call to GoogleAuthUtil.getToken
  // because the user must consent to offline access to their data.  After
  // consent is granted control is returned to your activity in onActivityResult
  // and the second call to GoogleAuthUtil.getToken will succeed.
  startActivityForResult(e.getIntent(), AUTH_CODE_REQUEST_CODE);
  return;
 catch (GoogleAuthException authEx) 
  // Failure. The call is not expected to ever succeed so it should not be
  // retried.
  ...
  return;
 catch (Exception e) 
  throw new RuntimeException(e);

看到UserRecoverableAuthException 和它的评论?嗯,这就是我想和你谈的。如您所见,在这种情况下,将启动另一个活动并开始一个流程,您必须接受应用程序请求的权限。如您所见,正在使用startActivityForResult 方法。我观察到的是,Activity.RESULT_OK 在用户接受授予权限时返回,但Activity.RESULT_CANCELED 在发生错误/崩溃或用户只是拒绝授予权限并取消流程时返回。

所以这是(是的,终于!)我的问题...如何区分一种情况(错误/崩溃)与另一种情况(可能的用户流)?

【问题讨论】:

【参考方案1】:

好吧,经过一段时间的努力,我想我找到了解决方案。我不知道这是否是正确的做法,但我认为我应该分享它,所以就这样吧。

我们有 onActivityresult 方法,进行登录/登录的活动应该实现。

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) 
     (...)

我的想法(经过一段时间的思考,后来证实)是Intent data 参数应该有一些关于返回什么样的错误或结果的线索或信息。经过一点检查后,我发现在用户拒绝应用程序权限的情况下,这个意图有一个额外的字符串,键为Error,值为UserCancel。所以这就是我最终用来区分一种情况的方法。希望对您有所帮助!

   data.getExtraString("Error"); // This should have the value "UserCancel" when the user    
                                 // refused to give the permissions required by the app. 

请注意,data Intent 可能并不总是提供此 ExtraString,实际上对于 onActityResult 的某些调用可能是 null,因此您应该在使用之前检查 if (data != null)

【讨论】:

以上是关于适用于 Android 的 Google+ 登录 - Google 权限活动结果代码的主要内容,如果未能解决你的问题,请参考以下文章

适用于多个开发人员的 Google 登录配置文件

如何在 Unity3D 上显示适用于 Android 的 Google Play 游戏“欢迎回来”吐司?

Flutter Web:google_sign_in_web:适用于桌面和 iOS。在 Android Chrome 上失败

适用于 iOS 的 Google+ SDK 以编程方式添加登录按钮

适用于 Android 的 Google Places API 未显示

适用于 Android 的 Google+ 平台 - NoClassDefFoundError:com.google.android.gms.samples.plus.SignInActivity