如何将Android应用程序与Google Sheets电子表格连接?

如何将Android应用程序与Google Sheets电子表格连接?,android,google-sheets,google-api,google-docs-api,google-sheets-api,Android,Google Sheets,Google Api,Google Docs Api,Google Sheets Api,我正在尝试做一个Android应用程序,需要与谷歌电子表格API一起工作。我是这方面的新手,所以我从api的第3版开始: 我按照所有步骤,将所有jar文件下载到我的项目文件夹中的lib子文件夹中,然后像往常一样添加到Eclipse中的构建路径中。因此,尽管没有Java示例来执行Oauth 2.0,但我只是尝试声明: SpreadsheetService service = new SpreadsheetService("v1"); 但当我模拟这条简单的线路时,它给了我一个错误: java.la

我正在尝试做一个Android应用程序,需要与谷歌电子表格API一起工作。我是这方面的新手,所以我从api的第3版开始:

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

SpreadsheetService service = new SpreadsheetService("v1");
但当我模拟这条简单的线路时,它给了我一个错误:

java.lang.NoClassDefFoundError: com.google.gdata.client.spreadsheet.SpreadsheetService
我正在使用文档中包含的所有JAR,我有以下导入:

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

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

没有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();
}
试试看{
电子表格输入电子表格;
服务=新的电子表格服务(“电子表格”);
setProtocolVersion(SpreadsheetService.Versions.V3);
service.setUserCredentials(“用户名”、“密码”);//添加到清单中所需的权限
URL metafeedUrl=新URL(“https://spreadsheets.google.com/feeds/spreadsheets/private/full");
feed=service.getFeed(metafeedUrl,SpreadsheetFeed.class);
列表电子表格=feed.getEntries();
如果(电子表格.size()>0){
电子表格=电子表格。获取(i);//获取电子表格
}
}捕获(例外e){
e、 printStackTrace();
}

非常感谢你,蝎子!它起作用了!!我已经试了很久了。 好的,这是我的解决方案: 我启动了一个新项目,包括以下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();
    }
SpreadsheetService电子表格=新的电子表格服务(“v1”);
setProtocolVersion(SpreadsheetService.Versions.V3);
试一试{
电子表格.setUserCredentials(“用户名”、“密码”);
URL metafeedUrl=新URL(“https://spreadsheets.google.com/feeds/spreadsheets/private/full");
SpreadsheetFeed=电子表格.getFeed(metafeedUrl,SpreadsheetFeed.class);
列表电子表格=feed.getEntries();
(电子表格输入服务:电子表格){
System.out.println(service.getTitle().getPlainText());
}
}捕获(身份验证异常){
e、 printStackTrace();
}
当然,这是在不同的线程中执行的,而不是在主线程中。OAuth2.0没有java文档,但我会尝试,如果做不到,我会在这里询问。
再次,非常感谢您,我希望在这段时间的工作中能够帮助您。:)

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

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

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

activityresult上的受保护无效(最终int请求代码、最终int结果代码、,
最终目的(数据){
if(requestCode==1&&resultCode==RESULT\u确定){
最终字符串accountName=data.getStringExtra(AccountManager.KEY\u ACCOUNT\u NAME);
System.err.println(accountName);
(新任务(){
@凌驾
受保护的字符串doInBackground(字符串…arg0){
试一试{
//将帐户名转换为令牌,必须
//可以在后台任务中完成,因为它与
//网络。
字符串标记=
GoogleAuthUtil.getToken(
全屏活动,这个,
帐户名,
“oauth2:https://spreadsheets.google.com/feeds https://docs.google.com/feeds");
System.err.println(“令牌:+Token”);
//既然我们有了代币,我们可以实际列出吗
//电子表格什么的。。。
电子表格服务=
新的电子表格服务(“Megabudget”);
s、 setAuthSubToken(令牌);
//定义要请求的URL。这永远不会更改。
//(魔法URL适合所有用户。)
URL电子表格\u提要\u URL=新URL(
"https://spreadsheets.google.com/feeds/spreadsheets/private/full");
//向API发出请求并获取所有电子表格。
电子表格;
试一试{
feed=s.getFeed(电子表格\u feed\u URL,SpreadsheetFeed.class);
列表电子表格=feed.getEntries();
//遍历返回的所有电子表格
用于(电子表格输入电子表格:电子表格){
//将此电子表格的标题打印到屏幕上
System.err.println(电子表格.getTitle().getPlainText());
}
}捕获(服务异常e){
//TODO自动生成的捕捉块
e、 printStackTrace();
}
}捕获(UserRecoverableAuthe异常){
//这是必要的,因此用户可以说,“是的,我想要
//此应用程序必须具有读取我的电子表格的权限。”
Intent recoveryIntent=e.getIntent();
startActivityForResult(恢复期,2);
}c
    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;
    }
};
    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.
  }

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