Как подключить Android-приложения к электронным таблицам Google Таблиц?

Я пытаюсь сделать приложение для Android, которое должно работать с API таблиц Google. Я новичок в этом, поэтому я начинаю с версии 3 api: https://developers.google.com/google-apps/spreadsheets/

Я выполнил все шаги, загрузил все файлы jar в подпапку lib в моей папке проекта, а затем добавил в путь сборки в Eclipse, как обычно. Поэтому, хотя Java-пример для выполнения Oauth 2.0 отсутствует, я просто попытался объявить:

SpreadsheetService service = new SpreadsheetService("v1");

но когда я эмулирую эту простую строку, это дает мне ошибку:

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

Я использую все банки, включенные в документацию, и у меня есть импорт:

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

но я полностью потерян. Я не знаю, что еще делать, чтобы начать, подключиться к API Google и работать с электронными таблицами.

Ответ 1

Спасибо, столько Scorpion! Оно работает!! Я слишком долго пробовал это. Хорошо, вот мое решение: Я начал новый проект и включил эти банки:

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-документации, но я постараюсь, и если я не могу этого сделать, я попрошу здесь. Еще раз большое спасибо, и я надеюсь помочь вам, когда я буду работать в это время.:)

Ответ 2

Пример кода для вас без 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();
}

Ответ 3

Это сложный процесс, но это можно сделать! Я написал сообщение в блоге о том, как начать работу. И я также опубликовал проект с открытым исходным кодом, который действительно полезен, но все же весьма минимален. Он использует 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.
  }

}

Ответ 4

(февраль 2017) Вопрос (и большинство ответов) теперь устарел: 1) API-интерфейсы GData - это предыдущее поколение API Google. Хотя не все API-интерфейсы GData устарели, все современные API Google используют не протокол данных Google, 2) Google выпустил новый API Google Таблиц (v4; не GData) в 2016 году, и 3) Android Studio теперь является предпочтительной средой IDE над Eclipse. Чтобы использовать API Google, вам нужно получить Клиентскую библиотеку API Google для Android (или для более общей Java, Клиентская библиотека API Google API для Java). Теперь вы настроены.

Чтобы начать, последний Sheets API намного более мощный, чем все старые версии. Последний API предоставляет функции, недоступные в старых версиях, а именно дает разработчикам программный доступ к Листу, как если бы вы использовали пользовательский интерфейс (создавать замороженные строки, выполнять форматирование ячеек, изменять размер строк/столбцов, добавлять сводные таблицы, создавать диаграммы и т.д.).

Тем не менее, это сложно, когда не хватает хороших (рабочих) примеров, плавающих вокруг, не так ли? В официальных документах мы стараемся приводить примеры "быстрого запуска" на максимально возможном количестве языков, чтобы помочь вам в этом. В этом духе, вот Пример кода быстрого запуска Android, а также более общий Пример кода быстрого запуска Java. Для удобства здесь приведена ссылка Таблица API JavaDocs.

Еще один ответ предложил использовать OAuth2 для авторизации данных, который вы можете сделать с этим отрывком auth от быстрого запуска выше, плюс правый scope:

// 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, я сделал несколько видеороликов с более "реальными" примерами, используя API таблиц (немобильный):

Наконец, обратите внимание, что API таблиц выполняет document -ориентированную функциональность, как описано выше. Для доступа файла, то есть импорта, экспорта и т.д., Вы должны использовать API Google Диска вместо; специально для мобильных устройств, используйте Google Android API для Android. Надеюсь, это поможет!