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

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

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

Любой, у кого есть эта проблема или удалось подключиться к Gmail api из 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-консоли, кроме API Google+ и API Gmail?

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. Кроме того, я попытался очистить токен и попросить новый с тем же результатом.

Ответ 1

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

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

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

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

Ответ 2

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

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

Ответ 3

Вам нужно настроить свой Android-приложение в Google Dev Console.

  • Выберите свой проект, выберите API и Auth, затем нажмите "Учетные данные"
  • Создать новый идентификатор клиента (хотя он имеет другие идентификаторы клиентов)
  • Выберите установленное приложение → android
  • Заполните имя своего пакета и SHA1 правильно
  • Создать новый ключ (хотя он имеет другие клиентские ключи)
  • Выберите кнопку Android
  • Заполните SHA1; packageName: 45:B5:E4:6F:36:AD:0A:98:94:B4:02:66:2B:12:17:F2:56:26:A0:E0;com.example

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

Ответ 4

Ну вот сделка. До сих пор токены, выданные 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().