Использование Android для отправки в форму Google Spreadsheet

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

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

Form

Spreadsheet

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

Я использую ReadView.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-код возвращается как одна строка. Исправьте меня, если я ошибаюсь.

Ответы

Ответ 1

Итак, я, наконец, понял, что происходит. Через messing с ручным кодированием ответы на конец формы 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 для указания меня в правильном направлении.

Ответ 3

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

Ответ 4

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

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

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

EDIT: Вы проверили, что возвращается в client.execute(post);?
Вы должны проверить, что возвращается в ответ POST, выполнив:

HttpResponse httpResponse = client.execute(post);

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

Ответ 5

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