Использование Android для отправки в форму Google Spreadsheet - PullRequest
15 голосов
/ 30 мая 2011

Впервые задаю вопрос здесь.Обычно я могу найти свой ответ без необходимости спрашивать, но на этот раз я застрял и не могу понять, что мне не хватает.

Я просто пытаюсь, чтобы мое приложение для Android заполнило формуна веб-сайте и представить его.Мне не нужно приложение, чтобы делать что-либо с отправкой каких-либо данных, просто заполните форму и отправьте ее.В основном я пытаюсь собрать результаты голосования приложения.Я думал, что отправка формы будет простой, поэтому я создал таблицу Google и из нее сделал форму.Я решил указать приложению Android на форму, и тогда у меня будут все данные в электронной таблице для последующего просмотра.Я не могу заставить приложение Android фактически заполнить форму.Вот ресурсы.

Форма

Электронная таблица

private void submitVote(String outcome) {
    HttpClient client = new DefaultHttpClient();
    HttpPost post = new HttpPost("https://spreadsheets.google.com/spreadsheet/formResponse?hl=en_US&formkey=dDlwZzh4bGFvNFBxUmRsR0d2VTVhYnc6MQ&ifq");

    List<BasicNameValuePair> results = new ArrayList<BasicNameValuePair>();
    results.add(new BasicNameValuePair("entry.0.single", cardOneURL));
    results.add(new BasicNameValuePair("entry.1.single", outcome));
    results.add(new BasicNameValuePair("entry.2.single", cardTwoURL));

    try {
        post.setEntity(new UrlEncodedFormEntity(results));
    } catch (UnsupportedEncodingException e) {
        // Auto-generated catch block
        Log.e("YOUR_TAG", "An error has occurred", e);
    }
    try {
        client.execute(post);
    } catch (ClientProtocolException e) {
        // Auto-generated catch block
        Log.e("YOUR_TAG", "An error has occurred", e);
    } catch (IOException e) {
        // Auto-generated catch block
        Log.e("YOUR_TAG", "An error has occurred", e);
    }
}

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

Я не получаю ни ошибок от моей программы, ни ошибок компиляции, ни ошибок в DDMS.Когда я на самом деле запускаю программу и нажимаю кнопку, которая выполняет этот код, я вижу задержку, так как сейчас она находится в потоке пользовательского интерфейса, поэтому я знаю, что она выполняется.Похоже, что все работает отлично, но моя таблица не обновляется совсем.

Есть мысли?Я уверен, что это что-то глупое, что я упускаю, но любая помощь будет признательна.

Вот обновленный код с большим количеством журналирования и отладки.

private void submitVote(String outcome) {
    HttpClient client = new DefaultHttpClient();
    HttpPost post = new HttpPost("https://spreadsheets.google.com/spreadsheet/formResponse?hl=en_US&amp;formkey=dDlwZzh4bGFvNFBxUmRsR0d2VTVhYnc6MQ&amp;ifq");

    List<BasicNameValuePair> results = new ArrayList<BasicNameValuePair>();
    results.add(new BasicNameValuePair("entry.0.single", cardOneURL));
    results.add(new BasicNameValuePair("entry.1.single", outcome));
    results.add(new BasicNameValuePair("entry.2.single", cardTwoURL));

    try {
        post.setEntity(new UrlEncodedFormEntity(results));
    } catch (UnsupportedEncodingException e) {
        // Auto-generated catch block
        Log.e("YOUR_TAG", "An error has occurred", e);
    }
    try {
        HttpResponse httpResponse = client.execute(post);
        Log.e("RESPONSE", "info: " + httpResponse);

        BufferedReader rd = new BufferedReader(new InputStreamReader(httpResponse.getEntity().getContent()));
        String line;
        while ((line = rd.readLine()) != null) {
        Log.i("words", line);   
        }

        Intent intent = new Intent(this, ReadingView.class);
        intent.putExtra("html", line);
        startActivity(intent);
    } catch (ClientProtocolException e) {
        // Auto-generated catch block
        Log.e("YOUR_TAG", "client protocol exception", e);
    } catch (IOException e) {
        // Auto-generated catch block
        Log.e("YOUR_TAG", "io exception", e);
    }
}

Я использую ReadingView.class для чего-то еще в моем приложении, но похитил его для этой цели ведения журнала прямо сейчас.Он имеет только метод onCreate (), который приведен ниже.

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.readingview);

    WebView mWebView = (WebView) findViewById(R.id.webview);
    mWebView.getSettings().setJavaScriptEnabled(true);
    //mWebView.loadUrl(getIntent().getExtras().getString("url"));
    mWebView.loadData(getIntent().getExtras().getString("html"), "text/html", "utf-8");
}

Также стоит отметить, что в DDMS он регистрирует только один вывод строки.Я считаю, что это только потому, что HTML-код возвращается все в одну строку.Поправь меня, если я ошибаюсь.

Ответы [ 5 ]

18 голосов
/ 02 июня 2011

Итак, я наконец понял, что происходит.Путем работы с ручным кодированием ответов в конце формы POST url я смог обнаружить, что URL, который он давал при просмотре источника, имел собственные проблемы с кодировкой.

Вот URL из источника:

<form action="https://spreadsheets.google.com/spreadsheet/formResponse?hl=en_US&amp;formkey=dDlwZzh4bGFvNFBxUmRsR0d2VTVhYnc6MQ&amp;ifq" method="POST" id="ss-form">

Но вот что нужно для фактической работы в приведенном выше коде:

https://spreadsheets.google.com/spreadsheet/formResponse?hl=en_US&formkey=dDlwZzh4bGFvNFBxUmRsR0d2VTVhYnc6MQ

Дополнительный усилитель;было то, что испортило это.По какой-то причине он работает без последнего & ifq, поэтому я остановился.Как бы то ни было, вот готовый код:

private void submitVote(String outcome) {
    HttpClient client = new DefaultHttpClient();
    HttpPost post = new HttpPost("https://spreadsheets.google.com/spreadsheet/formResponse?hl=en_US&formkey=dDlwZzh4bGFvNFBxUmRsR0d2VTVhYnc6MQ");

    List<BasicNameValuePair> results = new ArrayList<BasicNameValuePair>();
    results.add(new BasicNameValuePair("entry.0.single", cardOneURL));
    results.add(new BasicNameValuePair("entry.1.single", outcome));
    results.add(new BasicNameValuePair("entry.2.single", cardTwoURL));

    try {
        post.setEntity(new UrlEncodedFormEntity(results));
    } catch (UnsupportedEncodingException e) {
        // Auto-generated catch block
        Log.e("YOUR_TAG", "An error has occurred", e);
    }
    try {
        client.execute(post);
    } catch (ClientProtocolException e) {
        // Auto-generated catch block
        Log.e("YOUR_TAG", "client protocol exception", e);
    } catch (IOException e) {
        // Auto-generated catch block
        Log.e("YOUR_TAG", "io exception", e);
    }
}

Надеюсь, это поможет кому-то другому при работе с формами электронных таблиц Google.И спасибо @pandre за то, что он указал мне правильное направление.

5 голосов
/ 23 февраля 2015

Формат entry.0.single может не работать во многих случаях. Вы всегда должны найти правильный идентификатор элементов для создания вашего запроса POST. Эта статья предоставляет правильный способ публикации данных на листе документов Google с помощью приложения для Android.

2 голосов
/ 02 июня 2011

Посмотрите на источник для Acra .Это загружает трассировки стека в электронную таблицу Google.

1 голос
/ 30 мая 2011

Вы, вероятно, не видите ошибки, потому что вы печатаете исключения неправильно.
Вы используете e.printStackTrace();, который не отображается в DDMS / Logcat.

Вы должны использовать вместо
Log.e("YOUR_TAG, "An error has occurred", e);

, что будет регистрировать вашу ошибку в DDMS / Logcat.Вы должны увидеть трассировку стека исключения, и это поможет вам понять, что не так.

РЕДАКТИРОВАТЬ: Вы проверили, что возвращается в client.execute(post);?
Вы должны проверить, что возвращается в POSTответ, выполнив:

HttpResponse httpResponse = client.execute(post);

Вы также можете запустить приложение в режиме отладки и проверить, где происходит сбой / остановка

0 голосов
/ 21 октября 2012

Итак, cardOneUrl - это поля для редактирования текста в layout.xml "results.add (new BasicNameValuePair (" entry.0.single ", cardOneURL));"Спасибо, Джо

...