Android 用 Google+ サインを使用しているときに小さな問題が見つかりました。ウェブを検索した後 (そして明らかにそうです)、誰かが同じことに気付いたかどうかを確認するために大声で質問しています。
こちらで説明されているように、アプリのサーバー側 API アクセスを有効にしてい ます。 何が起こっているのか詳しく説明しましょう。このフラグメントを取ります:
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
、エラー/クラッシュが発生したとき、またはユーザーが単に許可を与えることを拒否してフローをキャンセルした場合の両方で返されることです。
だからここに(ええ、最終的に!)私の質問があります... あるケース(エラー/クラッシュ)と他のケース(可能なユーザーフロー)をどのように区別できますか?