Доступ к 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.
- выберите проект, выберите API & Auth, затем нажмите учетные данные
- создать новый идентификатор клиента (хотя он имеет другие идентификаторы клиента)
- выберите установленное приложение - > android
- заполните ваше имя пакета и SHA1 правильно
- создать новый ключ (хотя у него есть другие ключи клиента)
- выберите Android key
- заполните 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).