6

私はこれに数日間苦労しています。Android経由の認証を使用してGoogleカレンダーに電話をかけようとしていますAccountManager。通常の方法を使用して認証トークンを取得します。

AccountManager manager = AccountManager.get(this);
String authToken = manager.getAuthToken(account, AUTH_TOKEN_TYPE, true, null, null).getResult().getString(AccountManager.KEY_AUTHTOKEN);

そして、そのトークンを使用して、次のCalendarようなインスタンスを作成します。

HttpTransport transport = AndroidHttp.newCompatibleTransport();
JacksonFactory jsonFactory = new JacksonFactory();
GoogleAccessProtectedResource accessProtectedResource = new GoogleAccessProtectedResource(accessToken);
Calendar calendar = Calendar.builder(transport, jsonFactory).setApplicationName("MyApp/1.0").setJsonHttpRequestInitializer(new JsonHttpRequestInitializer() {
    @Override
    public void initialize(JsonHttpRequest request) {
        CalendarRequest calendarRequest = (CalendarRequest) request;
        calendarRequest.setKey(API_KEY);
    }
}).setHttpRequestInitializer(accessProtectedResource).build();

ただし、これを使用してAPI呼び出しを行うと、以下の401 Unauthorizedエラーが発生します。期限切れの認証トークンを無効にするコードを含めたので、それがここでの問題であるとは思わないことに注意してください。

com.google.api.client.googleapis.json.GoogleJsonResponseException: 401 Unauthorized
{
    "code" : 401,
    "errors" : [ {
        "domain" : "global",
        "location" : "Authorization",
        "locationType" : "header",
        "message" : "Invalid Credentials",
        "reason" : "authError"
    } ],
    "message" : "Invalid Credentials"
}

私が間違っているかもしれないことについて何か考えはありますか?

4

2 に答える 2

11

はい、これは可能です。(説明したように)Googleアカウントのハンドルを取得したら、GDataサービスのAccountManagerに認証トークンを要求するだけです。

Androidデバイスにすでに認証トークンがある場合(アクセスしようとしている特定のGDataサービス用)、それが返されます。そうでない場合、AccountManagerは1つを要求し、それをあなたに返します。いずれにせよ、AccountManagerが処理するため、これについて心配する必要はありません。

次の例では、GoogleSpreadsheetsAPIを使用しています。

ArrayList<Account> googleAccounts = new ArrayList<Account>();

// Get all accounts 
Account[] accounts = accountManager.getAccounts();
  for(Account account : accounts) {
    // Filter out the Google accounts
    if(account.type.compareToIgnoreCase("com.google")) {
      googleAccounts.add(account);
    }
  }
AccountManager accountManager = AccountManager.get(activity);

// Just for the example, I am using the first google account returned.
Account account = googleAccounts.get(0);

// "wise" = Google Spreadheets
AccountManagerFuture<Bundle> amf = accountManager.getAuthToken(account, "wise", null, activity, null, null);

try {
  Bundle authTokenBundle = amf.getResult();
  String authToken = authTokenBundle.getString(AccountManager.KEY_AUTHTOKEN);

  // do something with the token
  InputStream response = sgc.getFeedAsStream(feedUrl, authToken, null, "2.1");

}

googledataapiのサンプルコードをご覧ください。認証後に行う重要なことは、GoogleHeaders.setGoogleLogin(String)を呼び出すことです。

これがお役に立てば幸いです。

于 2012-03-02T05:22:19.310 に答える
0

私自身も同様の問題に遭遇しました。xoauth_requestor_id を不明なキー リストに設定する必要があることがわかりました (参照 : http://www.yenlo.nl/2011/google-calendar-api-v3-and-2lo/ )

これは私のために働いた:

com.google.api.services.calendar.Calendar.CalendarList.List list = calendar.calendarList().list();
//Set the requestor id
list.getUnknownKeys().put("xoauth_requestor_id", "user@gmail.com");

この後、API 呼び出しは成功しました。

リクエスタIDが必要な理由について説明があればいいのにと思います。誰か説明できますか?

于 2012-03-13T05:25:02.607 に答える