11

我正在尝试做一个需要使用 Google 电子表格 API 的 Android 应用程序。我是新手,所以我从 api 的第 3 版开始:https ://developers.google.com/google-apps/spreadsheets/

我按照所有步骤,将所有 jar 文件下载到lib我的项目文件夹中的子文件夹,然后像往常一样添加到 Eclipse 中的构建路径。因此,虽然没有执行 Oauth 2.0 的 Java 示例,但我只是尝试声明:

SpreadsheetService service = new SpreadsheetService("v1");

但是当我模拟这条简单的线时,它给了我一个错误:

java.lang.NoClassDefFoundError: com.google.gdata.client.spreadsheet.SpreadsheetService

我正在使用文档中包含的所有 jar,并且我有导入:

import com.google.gdata.client.spreadsheet.SpreadsheetService;

但我完全迷路了。我不知道还要做什么才能开始,连接到 Google API 并使用电子表格。

4

4 回答 4

4

没有 OAuth 2.0 的示例代码。但它建议执行 OAuth,因为它有利于安全目的。您还必须添加以下权限。

<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCOUNT_MANAGER"/>
<uses-permission android:name="android.permission.AUTHENTICATE_ACCOUNTS"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>

示例代码:-

try {
    SpreadsheetEntry spreadsheet;
    service = new SpreadsheetService("Spreadsheet");
    service.setProtocolVersion(SpreadsheetService.Versions.V3);
    service.setUserCredentials("username", "password");//permission required to add in Manifest
    URL metafeedUrl = new URL("https://spreadsheets.google.com/feeds/spreadsheets/private/full");
    feed = service.getFeed(metafeedUrl, SpreadsheetFeed.class);

    List<SpreadsheetEntry> spreadsheets = feed.getEntries();
    if (spreadsheets.size() > 0) {
        spreadsheet = spreadsheets.get(i);//Get your Spreadsheet
   }
} catch (Exception e) {
    e.printStackTrace();
}
于 2012-10-16T17:30:08.693 回答
4

非常感谢蝎子!有用!!我已经尝试这个太久了。好的,这是我的解决方案:我开始了一个新项目并包含了这些 jar:

gdata-client-1.0
gdata-client-meta-1.0
gdata-core-1.0
gdata-spreadsheet-3.0
gdata-spreadsheet-meta-3.0
guava-13.0.1  

和我的代码:

    SpreadsheetService spreadsheet= new SpreadsheetService("v1");
    spreadsheet.setProtocolVersion(SpreadsheetService.Versions.V3);

    try {
        spreadsheet.setUserCredentials("username", "password");
        URL metafeedUrl = new URL("https://spreadsheets.google.com/feeds/spreadsheets/private/full");
        SpreadsheetFeed feed = spreadsheet.getFeed(metafeedUrl, SpreadsheetFeed.class);

        List<SpreadsheetEntry> spreadsheets = feed.getEntries();
        for (SpreadsheetEntry service : spreadsheets) {             
            System.out.println(service.getTitle().getPlainText());
       }
    } catch (AuthenticationException e) {           
        e.printStackTrace();
    }

当然,这是在另一个线程中执行的,而不是在主线程中。OAuth 2.0 没有 java 文档,但我会尝试,如果我做不到,我会在这里问。再次,非常感谢你,我希望在我足够的时间工作时能帮助你。:)

于 2012-10-17T12:19:08.217 回答
4

(2017 年 2 月)这个问题(和大多数答案)现在已经过时了:

  1. GData API是上一代 Google API。虽然并非所有 GData API 都已被弃用,所有现代Google API并不使用Google Data 协议
  2. Google于 2016 年发布了新的 Google Sheets API(v4;不是 GData),并且
  3. Android Studio现在是 Eclipse 的首选 IDE。为了使用 Google API,您需要获取适用于 Android 的 Google API 客户端库(或者对于更通用的 Java,请获取适用于 Java 的 Google API 客户端库)。现在你准备好了。

首先,最新的Sheets API比所有旧版本都要强大得多。最新的 API 提供了旧版本中没有的功能,即让开发人员可以像使用用户界面一样以编程方式访问工作表(创建冻结行、执行单元格格式设置、调整行/列大小、添加数据透视表、创建图表等。 )。

也就是说,是的,当没有足够的好(工作)示例时,这很困难,对吧?在官方文档中,我们尝试以尽可能多的语言提供“快速入门”示例,以帮助您入门。本着这种精神,这里是Android 快速入门代码示例以及更通用的Java 快速入门代码示例。为方便起见,这里是Sheets API JavaDocs 参考

另一个答案建议使用 OAuth2 进行数据授权,您可以使用上面快速入门中的此身份验证片段以及正确的范围来执行此操作:

// Sheets RO scope
private static final String[] SCOPES = {SheetsScopes.SPREADSHEETS_READONLY};
    :

// Initialize credentials and service object
mCredential = GoogleAccountCredential.usingOAuth2(
        getApplicationContext(), Arrays.asList(SCOPES))
        .setBackOff(new ExponentialBackOff());

如果您对 Python 没有“过敏”,我已经制作了几个视频,其中包含更多使用 Sheets API 的“真实世界”示例(虽然是非移动设备):

最后,请注意,Sheets API 执行上述面向文档的功能。对于文件级访问,即导入、导出等,您可以使用Google Drive API;专门针对移动设备,使用Google Drive Android API。希望这可以帮助!

于 2017-03-02T03:25:40.287 回答
2

这是一个复杂的过程,但它可以做到!我写了一篇关于启动和运行基础知识的博客文章。而且我还发布了一个开源项目,它实际上很有用,但仍然非常少。它使用 OAuth,因此可以直接从 Android 的权限模型中提取权限(没有硬编码的电子邮件/密码!)。

您需要一些东西来启动“选择帐户意图”:

    View.OnTouchListener mDelayHideTouchListener = new View.OnTouchListener() {
    @Override
    public boolean onTouch(View view, MotionEvent motionEvent) {
         Intent intent = AccountPicker.newChooseAccountIntent(null, null, new String[]{"com.google"},
                 false, null, null, null, null);
         startActivityForResult(intent, 1);

        if (AUTO_HIDE) {
            delayedHide(AUTO_HIDE_DELAY_MILLIS);
        }
        return false;
    }
};

然后当该意图返回时,您可以尝试使用返回的令牌(尽管请注意,如果这是用户第一次可能必须明确授权您的程序;那就是 UserRecoverableAuthException):

    protected void onActivityResult(final int requestCode, final int resultCode,
        final Intent data) {
    if (requestCode == 1 && resultCode == RESULT_OK) {
        final String accountName = data.getStringExtra(AccountManager.KEY_ACCOUNT_NAME);
        System.err.println(accountName);

        (new AsyncTask<String, String,String>(){
            @Override
            protected String doInBackground(String... arg0) {
                try {
                    // Turn account name into a token, which must
                    // be done in a background task, as it contacts
                    // the network.
                    String token = 
                            GoogleAuthUtil.getToken(
                                    FullscreenActivity.this, 
                                    accountName, 
                                    "oauth2:https://spreadsheets.google.com/feeds https://docs.google.com/feeds");
                    System.err.println("Token: " + token);

                    // Now that we have the token, can we actually list
                    // the spreadsheets or anything...
                    SpreadsheetService s =
                            new SpreadsheetService("Megabudget");
                    s.setAuthSubToken(token);

                    // Define the URL to request.  This should never change.
                    // (Magic URL good for all users.)
                    URL SPREADSHEET_FEED_URL = new URL(
                        "https://spreadsheets.google.com/feeds/spreadsheets/private/full");

                    // Make a request to the API and get all spreadsheets.
                    SpreadsheetFeed feed;
                    try {
                        feed = s.getFeed(SPREADSHEET_FEED_URL, SpreadsheetFeed.class);
                        List<SpreadsheetEntry> spreadsheets = feed.getEntries();

                        // Iterate through all of the spreadsheets returned
                        for (SpreadsheetEntry spreadsheet : spreadsheets) {
                          // Print the title of this spreadsheet to the screen
                          System.err.println(spreadsheet.getTitle().getPlainText());
                        }
                    } catch (ServiceException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                } catch (UserRecoverableAuthException e) {
                    // This is NECESSARY so the user can say, "yeah I want
                    // this app to have permission to read my spreadsheet."
                    Intent recoveryIntent = e.getIntent();
                    startActivityForResult(recoveryIntent, 2);
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                } catch (GoogleAuthException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
                return null;
            }}).execute();
  } else if (requestCode == 2 && resultCode == RESULT_OK) {
      // After the user YAYs or NAYs our permission request, we are
      // taken here, so if we wanted to grab the token now we could.
  }

}
于 2014-08-15T20:12:32.053 回答