12

Android アプリケーションを使用して Gmail API にアクセスしようとしています。利用可能なすべてのスコープの組み合わせを使用して、アクセス トークンを正常に要求し、受け取りました。しかし、実際に Gmail API コマンドを使用しようとするたびに、403 exception reading: Access not configured please use Google developers console to activate the api...

言うまでもなく、API が有効になり、正しいパッケージ名と sha1 コードを使用してクライアント キーが作成されました。同じクライアント ID は、Google Plus 機能でうまく機能します。

この問題を抱えている人、または Android から Gmail API への接続に成功した人はいますか?

ありがとう

ログは次のとおりです。

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): }

Google+ API と Gmail API 以外に API コンソールで有効にする必要がある API はありますか?

編集:

WebView ベースの認証を使用すると、Gmail API アクセスを許可するアクセス トークンが生成されることがわかりましたが、トークンの有効期間が短いため、これは有効なソリューションではありません。今のところ、GoogleAuthUtil はトークンを付与しますが、その権限は Gmail API を使用するのに十分ではありません。Android と Gmail API の接続に成功した人はいますか?共有したいと思いますか?

EDIT2:

ここに私がやっていることのスニペットがあります:

トークンの取得:

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

Gmail API からメッセージを取得しようとしています:

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();
}

Gmail API サービスを使用すると、例外がキャッチされます。さらに、トークンをクリアして、同じ結果で新しいトークンを要求しようとしました。

4

4 に答える 4

6

明確に記載されていませんが、経由で取得したトークンGoogleAuthUtil.getToken()がローカルにキャッシュされ、有効期限が切れる可能性があることが問題です。受け取った 403 エラーは、期限切れのトークンが原因です。この状況を処理する正しい方法は、 を呼び出しGoogleAuthUtil.clearToken()てローカルにキャッシュされたトークンを削除してから、 を呼び出しGoogleAuthUtil.getToken()て新しいトークンを取得することです。

または、最後にトークンをリクエストした時間を追跡し、それが 1 時間 (これらのトークンのデフォルトの有効期限) を超えている場合は、事前に clearToken + getToken 呼び出しを行うことができます。

于 2014-09-08T18:45:02.283 に答える
4

そのエラー メッセージは欺瞞的です。開発者プロジェクトの資格情報クライアントが正しくない場合にも発生すると思います。たとえば、本当に「インストールされたアプリケーション」が必要なときに「Web アプリケーション」を選択したとします。

https://developers.google.com/accounts/docs/OAuth2の指示に従っていることを確認してください 。

(「インストール済みアプリ」等のはずです)

開発者コンソールから取得した oauth クライアント情報を投稿できますか? (タイプおよびそこにあるその他の非機密情報など)

于 2014-09-04T16:34:33.320 に答える
0

Google Dev Console で Android アプリ キーを設定する必要があります。

  1. プロジェクトを選択し、[API & Auth] を選択してから、[Credentials] をクリックします。
  2. 新しいクライアント ID を作成します (ただし、他のクライアント ID があります)
  3. インストール済みアプリを選択 -> android
  4. パッケージ名とSHA1を正しく入力してください
  5. 新しいキーを作成します (ただし、他のクライアント キーがあります)
  6. Androidキーを選択
  7. 次のように SHA1;packageName を入力します。45:B5:E4:6F:36:AD:0A:98:94:B4:02:66:2B:12:17:F2:56:26:A0:E0;com.example

あなたの問題は自動的に解決されます。デバッグ キーストアとリリース キーストアの両方を使用して、必ずクライアント ID とキーを作成してください。

于 2014-11-21T08:56:44.613 に答える
-3

さて、これが取引です。これまでのところ、GoogleAuthUtil && AccountManager によって提供されるトークンは、Gmail API では機能しません。それがGoogleのものかどうかはわかりませんが、私の解決策は次のとおりです。

API コンソールでクライアント ID (アプリケーション -> その他) を作成します。クライアント ID とクライアント シークレットを使用して、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() オプションで提供されることを願っています。

于 2014-09-08T08:34:41.183 に答える