2012-03-02 3 views
6

저는 며칠 동안이 문제로 어려움을 겪었습니다. Android의 AccountManager을 통한 인증을 사용하여 Google 캘린더에 전화를 걸려고합니다. 그 토큰으로,이 같은 Calendar 인스턴스를 만든 다음AccountManager를 사용하여 Google API로 인증

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

그리고 : 나는 일반적인 방법을 사용하여 인증 토큰을 검색

그러나
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 호출을, I 아래 표시된 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" 
} 

내가 잘못하고있는 것에 대한 의견이 있으십니까?

답변

11

예 가능합니다. 설명 된대로 Google 계정에서 핸들을 얻은 후에는 GData 서비스의 AccountManager에서 인증 토큰을 요청하면됩니다.

안드로이드 장치에 이미 (액세스하려는 특정 GData 서비스에 대한) 인증 토큰이있는 경우 사용자에게 반환됩니다. 그렇지 않은 경우 AccountManager가 계정 관리자에게 요청하고이를 반환합니다. 어쨌든 AccountManager가 처리 할 때 걱정하지 않아도됩니다. 다음 예에서

, 나는 구글 스프레드 시트 API를 사용하고 있습니다 :

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"); 

} 

는 구글 데이터 API의 sample code에서 참조하시기 바랍니다. 인증 후 중요한 작업은 GoogleHeaders.setGoogleLogin (String)을 호출하는 것입니다.

이 정보가 도움이되기를 바랍니다.

+0

좋아요, 저는 현재 setGoogleLogin()을 호출하지 않고'((GoogleHeaders) transport.defaultHeaders) .setGoogleLogin (authToken)'을 호출하는 샘플 코드를보고 있지만, 나를 위해 컴파일해라. 나는 google-http-client-1.6.0-beta를 사용하고있다. 'HttpTransport'는'defaultHeaders' 필드를 더 이상 가지고 있지 않습니다. –

0

나 자신에게 비슷한 문제가 있습니다. 이 API 호출을 통해 갔다 후

com.google.api.services.calendar.Calendar.CalendarList.List list = calendar.calendarList().list(); 
//Set the requestor id 
list.getUnknownKeys().put("xoauth_requestor_id", "[email protected]"); 

: 이것은 나를 위해 일한

: 나는 알 수없는 키 목록에서 xoauth_requestor_id (http://www.yenlo.nl/2011/google-calendar-api-v3-and-2lo/ 참조)을 설정해야한다는 것을 발견했다.

왜 요청자 ID가 필요한지에 대한 설명이 있었으면합니다. 누군가 설명 할 수 있습니까?

+0

방금 ​​시도했지만 불행히도'401 Unauthorized' 오류가 발생합니다. –

관련 문제