【问题标题】:Android and Google client API NetHttptransport Class not found未找到 Android 和 Google 客户端 API NetHttptransport 类
【发布时间】:2011-10-04 12:41:36
【问题描述】:

我第一次尝试将 Google 生成的 API 库用于 Android。我从Sample Program provided by Google 获取了代码。我的代码看起来像

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

import android.app.Activity;
import android.os.Bundle;

// Core Google API
import com.google.api.client.auth.oauth2.draft10.AccessTokenResponse;
import com.google.api.client.googleapis.auth.oauth2.draft10.GoogleAccessProtectedResource;
import com.google.api.client.googleapis.auth.oauth2.draft10.GoogleAccessTokenRequest.GoogleAuthorizationCodeGrant;
import com.google.api.client.googleapis.auth.oauth2.draft10.GoogleAuthorizationRequestUrl;
import com.google.api.client.http.ByteArrayContent;
import com.google.api.client.http.GenericUrl;
import com.google.api.client.http.HttpRequest;
import com.google.api.client.http.HttpRequestFactory;
import com.google.api.client.http.HttpResponse;
import com.google.api.client.http.HttpTransport;
import com.google.api.client.http.javanet.NetHttpTransport;
import com.google.api.client.json.JsonFactory;
import com.google.api.client.json.jackson.JacksonFactory;

// Google+ API
import com.google.api.services.plus.*;

public class GooglePlusActivity extends Activity {

    // Want data about authenticated user
    private static final String SCOPE = "https://www.googleapis.com/auth/plus.me";
    //
    private static final String CALLBACK_URL = "urn:ietf:wg:oauth:2.0:oob";
    //
    private static final HttpTransport TRANSPORT = new NetHttpTransport();
    private static final JsonFactory JSON_FACTORY = new JacksonFactory();

    private static final String CLIENT_ID = "XXXXXXXXXXXXXXX";
    private static final String CLIENT_SECRET = "XXXXXXXXXXXXXX";

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        // Generate the URL to which we will direct users
        String authorizeUrl = new GoogleAuthorizationRequestUrl(CLIENT_ID,
                CALLBACK_URL, SCOPE).build();

        BufferedReader in = new BufferedReader(new InputStreamReader(System.in));

        try {
            String authorizationCode = in.readLine();

            // Exchange for an access and refresh token
            GoogleAuthorizationCodeGrant authRequest = new GoogleAuthorizationCodeGrant(TRANSPORT,
                JSON_FACTORY, CLIENT_ID, CLIENT_SECRET, authorizationCode, CALLBACK_URL);

            authRequest.useBasicAuthorization = false;

            AccessTokenResponse authResponse = authRequest.execute();

            String accessToken = authResponse.accessToken;

            GoogleAccessProtectedResource access = new GoogleAccessProtectedResource(accessToken,
                TRANSPORT, JSON_FACTORY, CLIENT_ID, CLIENT_SECRET, authResponse.refreshToken);

            HttpRequestFactory rf = TRANSPORT.createRequestFactory(access);
            System.out.println("Access token: " + authResponse.accessToken);


        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        Plus plus = new Plus(new NetHttpTransport(), new JacksonFactory());

    }
}

但是下面一行:

private static final HttpTransport TRANSPORT = new NetHttpTransport();

导致异常:

10-04 13:33:28.954: ERROR/AndroidRuntime(5925): Caused by: java.lang.NoClassDefFoundError: com.google.api.client.http.javanet.NetHttpTransport

我在构建路径中添加了以下库:

google-api-client-1.5.0-beta.jar google-api-services-plus-v1-1.2.2-beta.jar

还有这些依赖库:

番石榴-r09 httpclient-4.0.3 杰克逊核心asl-1.6.7 gson-1.6

我只是出于绝望才添加依赖项...因为我看不到我需要它们。我所有的 import 语句在编译时都被正确解析了,为什么会出现这个错误?

我在 Windows 7 上使用 Eclipse Indigo。

我添加了以下jar文件:

google-api-client-1.5.0-beta
google-api-client-extensions-1.5.0-beta
google-api-client-extensions-android2-1.5.0-beta
google-api-services-plus-v1-1.2.2-beta
google-http-client-1.5.0-beta
google-http-client-extensions-1.5.0-beta
google-http-client-extensions-android2-1.5.0-beta
google-oauth-client-1.5.0-beta
google-oauth-client-extensions-1.5.0-beta
gson-1.6
番石榴-r09
httpclient-4.0.3
httpcore-4.0.1
杰克逊核心-asl-1.6.7

这解决了我的问题。但是,我仍然不确定这些文件如何与 wiki 页面上的库列表相对应,以及为什么在编译期间解析我的导入时需要它们。

【问题讨论】:

  • 你有没有发现如何以及为什么?我遇到了完全相同的问题,虽然我使用的版本略有不同(1.6.0),但我似乎无法修复它,即使我已经添加了上面的列表(主要是需要添加 httpclient 和 dhttpcore ) 到我的项目。但没有骰子:(

标签: android google-api


【解决方案1】:

你必须显式添加google-http-client-1.5.0-beta.jar的库引用(右键项目->属性->Java构建路径->添加外部JARs),不要相信类路径。 如果不这样做,在apk文件中不包含需要的数据。
您可以从这里下载 Google plus 库google-plus-java-starter_v5.zip

【讨论】:

    【解决方案2】:

    以下是您的项目中应该拥有的库列表:http://code.google.com/p/google-api-java-client/wiki/Setup

    【讨论】:

    • Google 在同一页面上提供的 zip 文件不包含所有列出的 jar 文件。例如,我找不到以下 jar 文件:google-api-client-googleapis google-api-client-googleapis-extensions google-api-client-googleapis-extensions-android2 google-api-client-extensions-android3
    【解决方案3】:

    这个可能有点晚了,但你要找的罐子是 google-http-client-1.5.0-beta.jar

    这个 jar 定义了 com.google.api.client.http.* 和 com.google.api.client.json.*

    【讨论】:

      【解决方案4】:
      plus = Plus.builder(transport, jsonFactory).setApplicationName("Google-PlusSample/1.0")
          .setHttpRequestInitializer(accessProtectedResource)
          .setJsonHttpRequestInitializer(new JsonHttpRequestInitializer() {
              @Override
              public void initialize(JsonHttpRequest request) {
                  PlusRequest plusRequest = (PlusRequest) request;
                  plusRequest.setPrettyPrint(true);
              }
          }).build();
      

      用这个代替

      Plus plus = new Plus(new NetHttpTransport(), new JacksonFactory());
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-11-05
        • 2017-09-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多