2012-05-25 2 views
3

Я пишу приложение для Android (версия ICS). который загружает данные на Google Диск. Приложение использует oauth2 для получения токена доступа.Приложение для Android: получить токен доступа для API Google Диска

Первый шаг: приобрести токен авторизации.

String AUTH_TOKEN_TYPE = "oauth2:https://www.googleapis.com/auth/drive"; 
    // Step 1 
    accountManager.getAuthToken(
     account,        // Account retrieved using getAccountsByType("com.google") 
     AUTH_TOKEN_TYPE,      // Auth Token Type 
     options,        // Authenticator-specific options 
     this,         // Your activity 
     new OnTokenAcquired(),     // Callback called when a token is successfully acquired 
     new Handler(new OnAuthTokenError())); // Callback called if an error occurs 
} 
private class OnTokenAcquired implements AccountManagerCallback<Bundle> { 
    @Override 
    public void run(AccountManagerFuture<Bundle> result) { 
     // Get the result of the operation from the AccountManagerFuture. 
     Bundle bundle; 
     try { 
      bundle = result.getResult(); 

      authToken = bundle.getString(AccountManager.KEY_AUTHTOKEN); 

      Log.d(TAG,"authToken:" + authToken); 

      exchangeToken access = (exchangeToken) new exchangeToken().execute(); 

     } catch (OperationCanceledException e) { 
      e.printStackTrace(); 
     } catch (AuthenticatorException e) { 
      e.printStackTrace(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 
} 

Успех. Получается токен авторизации.

Шаг 2: токен авторизации Exchange для токена доступа.

private class exchangeToken extends AsyncTask<String, Void, Void> { 

    @Override 
    protected Void doInBackground(String... params) { 
     HttpTransport transport = new NetHttpTransport(); 
     JsonFactory jsonFactory = new GsonFactory(); 
     String CLIENT_ID = "999999999999.apps.googleusercontent.com"; 
     String CLIENT_SECRET = "axXXXXXXXXXXXXXXX7"; 

     try { // Step 2: Exchange for an access and refresh token 
      GoogleTokenResponse authResponse = new GoogleAuthorizationCodeTokenRequest(transport, jsonFactory, CLIENT_ID, CLIENT_SECRET, authToken, CALLBACK_URL).execute(); 
      accessToken = authResponse.getAccessToken(); 
      Log.d("Get Access","Token:" + accessToken); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
     return null; 
    } 
} 

Ошибка. LogCat показывает следующее: com.google.api.client.auth.oauth2.TokenResponseException: 400 Bad Request

{

"error":"unauthorized_client" 

}

Я был в состоянии получить доступ к «Google Drive «на моем Android-планшете с помощью приложения« Диск ». поэтому мой адрес электронной почты действителен. Может быть, AUTH_TOKEN_TYPE неверен, но SDK Google неясно, каково это должно быть. Что мне не хватает?

ответ

1

Вам не нужно делать второй шаг обмена токеном. Android предоставляет вам токен доступа напрямую, он не предоставляет вам код аутентификации, который вам нужно будет обменять на токены.

This page В документации на Android объясняется все, что действительно хорошо.

+0

Предполагая, что accountmanager.getAuthToken возвращает accessToken, я решил протестировать пакет com.google.api.services.drive.Drive со следующим кодом: – user1417943

+0

@Nivco plz проверить этот квест http://stackoverflow.com/q/18760929/2632749 – NextStep

0

Вы знаете, что для использования API-интерфейса Drive вам необходимо установить приложение на веб-сайте Chrome (!)? Обычно API-список документов - лучший выбор для Android.

+1

Действительно, я не понимаю, почему приложение Android должно быть установлено на – user1417943

+1

Это правда. Дело в том, что в настоящее время модель безопасности Drive API является файлом. Это означает, что только файлы, которые будут доступны только для чтения файлов, которые пользователь открыл с веб-интерфейса Диска с вашим приложением. Это еще не работает с Android, но мы работаем над вещами (возможно, с особыми намерениями, которые вам придется регистрировать против того, что запускает ваше приложение из приложения Android для Android). ИЛИ также более широкий интерфейс API. Действительно, в настоящее время лучшим способом является API-список документов, ищите другие сообщения об этом. – Nivco

+0

Неправда. Вы можете использовать API-интерфейс Диска с теми же областями, что и API-интерфейс Документов, и получить те же самые пропуски. – pinoyyid

Смежные вопросы