3

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、エラー/クラッシュが発生したとき、またはユーザーが単に許可を与えることを拒否してフローをキャンセルした場合の両方で返されることです。

だからここに(ええ、最終的に!)私の質問があります... あるケース(エラー/クラッシュ)と他のケース(可能なユーザーフロー)をどのように区別できますか?

4

1 に答える 1

1

さて、これでしばらく戦った後、解決策を見つけたと思います。それが正しい方法かどうかはわかりませんが、共有する必要があると思ったので、ここに行きます。

ログイン/サインインを行うアクティビティが実装するonActivityresultメソッドがあります。

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

私が考えた (しばらく考えた後、後で確認した) ことは、Intent dataパラメーターには、返されるエラーまたは結果の種類に関する何らかの手がかりまたは情報が必要であるということでした。少し調べたところ、ユーザーがアプリのアクセス許可を拒否した場合、このインテントには keyErrorと valueを含む Extra String が含まれていることがわかりましたUserCancel。それが、あるケースを他のケースと区別するために私が最終的に使用したものです。それが役に立てば幸い!

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

dataインテントが常にこの ExtraString を提供するとは限らないことに注意してください。実際にnullは の一部の呼び出し用である可能性があるため、これを使用する前にonActityResult確認する必要があります。if (data != null)

于 2014-08-07T16:43:33.787 に答える