Uso de Android para enviar a un formulario de hoja de cálculo de Google

Primera vez haciendo una pregunta aquí. Por lo general, puedo encontrar mi respuesta sin tener que pedir, pero esta vez estoy atascado y no puedo averiguar lo que estoy perdiendo.

Sólo estoy tratando de que mi aplicación Android llene un formulario en un sitio web y lo envíe. No necesito que la aplicación haga nada con los datos enviados, simplemente llene el formulario y envíelo. Básicamente estoy tratando de recoger los resultados de una aplicación de votación. Pensé que la sumisión de la forma sería simple así que creé una hoja de balance de Google y hice una forma fuera de ella. Pensé que apuntaría la aplicación de Android a la forma y luego tendría todos los datos en la hoja de cálculo para su posterior visualización. No puedo conseguir que la aplicación de Android complete el formulario. Aquí están los recursos.

Formar

Hoja de cálculo

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

Hice tanto el formulario y la hoja de cálculo público, así que siéntase libre de jugar con él y tratar de conseguir que funcione usted mismo.

No obtengo errores de mi programa, no hay errores de compilación, no hay errores en DDMS. Cuando en realidad ejecutar el programa y haga clic en el botón que ejecuta este código puedo ver el retraso ya que ahora mismo está en el hilo de la interfaz de usuario, así que sé que lo está ejecutando. Parece que todo funciona perfectamente, pero mi hoja de cálculo no se actualiza en absoluto.

¿Alguna idea? Estoy seguro de que es algo estúpido que me falta, pero cualquier ayuda sería apreciada.

Aquí está el código actualizado con muchas cosas de registro y depuración.

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

Utilizo ReadingView.class para algo más en mi aplicación, pero lo he secuestrado para este propósito de registro en este momento. Sólo tiene un método onCreate (), que está debajo.

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

También vale la pena señalar que en el DDMS sólo registra una salida de línea. Creo que esto es sólo porque el código html se devuelve todo como una línea. Corrígeme si estoy equivocado.

Así que finalmente me di cuenta de lo que estaba pasando. A través de jugar con las respuestas de codificación manual al final de la URL de POST de formulario, pude encontrar que la url que dio al ver la fuente tenía problemas de codificación de su propio en ella.

Esta es la URL de la fuente:

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

Pero aquí es lo que debe ser para trabajar realmente en el código anterior:

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

El amplificador adicional; fue lo que lo estropeó. Por la razón que sea, funciona sin la última & ifq también, así que dejé eso. De todos modos, aquí está el código completo:

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

Espero que esto ayude a otra persona cuando trate de trabajar con Google Spreadsheet Forms. Y gracias a @pandre por señalarme en la dirección correcta.

El formato, entry.0.single puede no funcionar en muchos casos. Siempre debe encontrar el id adecuado de los elementos para crear su solicitud POST. Este artículo proporciona la forma correcta de enviar datos a una hoja de documentos de Google a través de la aplicación de Android.

Echa un vistazo a la fuente de Acra . Esto carga los rastreos de pila en una hoja de cálculo de Google.

Es probable que no aparezcan errores porque están imprimiendo excepciones de manera incorrecta.
Está utilizando e.printStackTrace(); que no aparece en DDMS / Logcat.

Debe utilizar en su lugar
Log.e("YOUR_TAG, "An error has occurred", e);

que registrará su error en DDMS / Logcat. Usted debe ver el stacktrace de la excepción, y le ayudará a entender lo que está mal.

EDIT: ¿Ha comprobado lo que se devuelve en client.execute(post); ?
Usted debe comprobar lo que se está devolviendo en la respuesta POST haciendo:

 HttpResponse httpResponse = client.execute(post); 

También puede ejecutar la aplicación en modo de depuración y comprobar dónde se está bloqueando / deteniendo

Así que los cardOneUrl son campos de edición de texto en un layout.xml "results.add (new BasicNameValuePair (" entry.0.single ", cardOneURL));" Gracias, Joe

  • No se pudo escribir la solicitud: no se encontró HttpMessageConverter adecuado para el tipo de solicitud y el tipo de contenido
  • Enviar datos a la página cargada en WebView
  • Poste HTTP seguro en Android
  • LoopJ AndroidAsyncHttp y JSON POST ARRAY
  • MultipartEntityBuilder y setCharset para UTF-8 envían contenido vacío
  • HTTPURLConnection - POST multipart / form-data con archivo grande con FixedLengthStreamingMode
  • Solicitud de Android POST utilizando HttpUrlConnection obtener "ya conectado"
  • Configuración del tipo de contenido Json para el cliente Rest
  • Uploding archivo en el servidor mediante POST de Android dando excepción
  • Android: comprueba si la solicitud es GET o POST
  • POSTando JSON / XML usando android-async-http (loopj)
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.