适用于 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 权限活动结果代码的主要内容,如果未能解决你的问题,请参考以下文章
如何在 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