Доступ к API Gmail с помощью Android

Я пытаюсь получить доступ к API Gmail с помощью приложения для Android. Я успешно запросил и получил маркер доступа, используя все доступные комбинации областей. Но кажется, что каждый раз, когда я пытаюсь использовать команду Gmail API, я получаю 403 exception reading: Access not configured please use Google developers console to activate the api...

Излишне говорить, что API активирован, и ключ клиента был создан с использованием правильного имени пакета и кода sha1. Тот же идентификатор клиента хорошо работает с функциями Google Plus.

любой, у кого есть эта проблема или удалось подключиться к api Gmail с Android?

спасибо

вот лог:

09-04 21:40:54.014: W/System.err(26717): com.google.api.client.googleapis.json.GoogleJsonResponseException: 403 Forbidden
09-04 21:40:54.014: W/System.err(26717): {
09-04 21:40:54.014: W/System.err(26717):   "code" : 403,
09-04 21:40:54.014: W/System.err(26717):   "errors" : [ {
09-04 21:40:54.014: W/System.err(26717):     "domain" : "usageLimits",
09-04 21:40:54.014: W/System.err(26717):     "message" : "Access Not Configured. Please use Google Developers Console to activate the API for your project.",
09-04 21:40:54.014: W/System.err(26717):     "reason" : "accessNotConfigured"
09-04 21:40:54.014: W/System.err(26717):   } ],
09-04 21:40:54.014: W/System.err(26717):   "message" : "Access Not Configured. Please use Google Developers Console to activate the API for your project."
09-04 21:40:54.014: W/System.err(26717): }

есть ли другие API, которые должны быть включены в консоли API, кроме Google + API и Gmail API?

EDIT:

я обнаружил, что использование аутентификации на основе WebView приведет к маркеру доступа, который предоставит доступ к API Gmail, но это не является допустимым решением, потому что маркер недолговечен. А пока ... GoogleAuthUtil предоставит токен, но его привилегий недостаточно для использования API Gmail. кто-нибудь имел успех в подключении Android к API Gmail и хотел бы поделиться?

EDIT2:

вот фрагменты того, что я делаю:

получение маркера:

token = GoogleAuthUtil.getToken(MainActivity.this, Plus.AccountApi.getAccountName(mGoogleApiClient), scope);

попытка получить сообщения из API Gmail:

GoogleCredential credential = new GoogleCredential().setAccessToken(token);
JsonFactory jsonFactory = new JacksonFactory();
HttpTransport httpTransport = new NetHttpTransport();

service = new Gmail.Builder(httpTransport, jsonFactory, credential).setApplicationName("GmailApiTP").build();
ListMessagesResponse messagesRespose;
List<Message> m = null;

ArrayList<String> ids = new ArrayList<String>();
ids.add("INBOX");
try {
    messagesRespose = service.users().messages().list("me").setLabelIds(ids).setQ("From: something")
            .execute();
    m = messagesRespose.getMessages();

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

исключение ловится при использовании службы API Gmail. Кроме того, я попытался очистить токен и просить новую с тем же результатом.

4 ответов


это сообщение об ошибке обманчиво, я считаю, что это также происходит, когда клиент учетных данных проекта разработчика не является правильным. Например, вы выбрали "веб-приложение", когда действительно хотите"установленное приложение".

убедитесь, что вы правильно следуете инструкциям: https://developers.google.com/accounts/docs/OAuth2

(должно быть "установленное приложение" и т. д.)

можете ли вы опубликовать информацию о клиенте oauth, которую у вас есть от разработчиков консоль? (Введите и любую другую неконфиденциальную информацию и т. д.)


хотя это не описано четко, проблема в том, что токен, полученный через GoogleAuthUtil.getToken() кэшируется локально и может истечь. Ошибка 403, которую вы получаете, связана с истекшим токеном. Правильный способ справиться с этой ситуацией-вызвать GoogleAuthUtil.clearToken() чтобы удалить локально кэшированный маркер, а затем вызвать GoogleAuthUtil.getToken(), чтобы получить новый.

кроме того, вы можете отслеживать последний раз, когда вы запросили токен, и если он был больше часа (время истечения по умолчанию для них токены) делают вызовы clearToken + getToken pre-preemptively.


вам нужно настроить ключ приложения Android в консоли Google Dev.

  1. выберите проект, выберите API & Auth, затем нажмите учетные данные
  2. создать новый идентификатор клиента (хотя он имеет другие идентификаторы клиента)
  3. выберите установленное приложение - > android
  4. заполните ваше имя пакета и SHA1 правильно
  5. создать новый ключ (хотя у него есть другие ключи клиента)
  6. выберите Android key
  7. заполните SHA1; имя пакета, как это: 45:B5:E4:6F:36:AD:0A:98:94:B4:02:66:2B:12:17:F2:56:26:A0:E0;com.example

ваша проблема будет автоматически решена. Не забудьте создать идентификатор клиента и ключ как с хранилищем ключей отладки, так и с хранилищем ключей выпуска.


Ну вот в чем дело. До сих пор токены, предоставленные GoogleAuthUtil & & AccountManager, не работают с API Gmail. Не знаю, является ли это Google вещь или нет, но мое решение таково:

создайте идентификатор клиента (Applicaion - >Other) в консоли API. Используйте идентификатор клиента и секрет клиента для получения маркера доступа через WebView. Сохраните маркер обновления результата. Теперь, когда вы хотите обновить маркер доступа, используйте этот запрос:

    httpClient = new DefaultHttpClient();
    httpPost = new HttpPost(address);
    params.add(new BasicNameValuePair("refresh_token", token));
    params.add(new BasicNameValuePair("client_id", client_id));
    params.add(new BasicNameValuePair("client_secret", client_secret));
    params.add(new BasicNameValuePair("grant_type", "refresh_token"));
    httpPost.setHeader("Content-Type", "application/x-www-form-urlencoded");
    httpPost.setEntity(new UrlEncodedFormEntity(params));
    HttpResponse httpResponse = httpClient.execute(httpPost);
    HttpEntity httpEntity = httpResponse.getEntity();
    is = httpEntity.getContent();

работает для меня. Надеюсь, что в будущее действительный маркер будет предоставлена GoogleAuthUtil.(вариант getToken).