2011-05-30 8 views
15

Primera vez que hace una pregunta aquí. Por lo general, puedo encontrar mi respuesta sin tener que preguntar, pero esta vez estoy atascado y no puedo entender lo que me estoy perdiendo.Usando Android para enviar a un Formulario de hoja de cálculo de Google

Solo intento que mi aplicación de Android complete un formulario en un sitio web y lo envíe. No necesito que la aplicación haga nada con los datos que se envían, solo complete el formulario y envíelo. Básicamente, estoy tratando de recopilar los resultados de una aplicación de votación. Pensé que la presentación del formulario sería simple, así que creé una hoja de cálculo de Google e hice un formulario con ella. Pensé que apuntaría la aplicación de Android al formulario y luego tendría todos los datos en la hoja de cálculo para verlos más tarde. Sin embargo, no puedo conseguir que la aplicación de Android llene el formulario. Aquí están los recursos.

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

hice tanto la forma como el público en hoja de cálculo para sentirse libres para perder el tiempo con él y tratar de conseguir que funcione a ti mismo.

No recibo ningún error de mi programa, no hay errores de compilación, no hay errores en DDMS. Cuando realmente ejecuto el programa y hago clic en el botón que ejecuta este código, puedo ver el retraso ya que ahora está en el hilo de UI, así que sé que lo está ejecutando. Parece que todo está funcionando perfectamente, pero mi hoja de cálculo no se actualiza en absoluto.

¿Alguna idea? Estoy seguro de que es algo estúpido que me estoy perdiendo, 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 otra cosa en mi aplicación, pero secuestrado para este propósito tala en este momento. Solo tiene un método onCreate(), que se encuentra 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 solo registra una salida de línea. Creo que esto es solo porque el código html se devuelve todo como una sola línea. Corrígeme si estoy equivocado.

+1

Esto es un gran artículo que podría ser útil para usted. http://www.morningcopy.com.au/tutorials/how-to-style-google-forms/ – JackyBoi

Respuesta

18

Así que finalmente descubrió lo que estaba pasando. Al jugar con la codificación manual de las respuestas al final de la URL POST del formulario, pude encontrar que la URL que proporcionaba al ver la fuente tenía problemas de codificación propios.

Aquí está 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 tiene que ser para ponerse a trabajar en el código anterior:

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

El amplificador adicional; era lo que estaba estropeando. Por alguna razón, funciona sin el último ifc &, así que lo dejé. Código De todos modos, aquí está completado:

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 alguien más cuando se trata de trabajar con las formas de hoja de cálculo de Google. Y gracias a @pandre por señalarme en la dirección correcta.

+1

Gracias por hacer esta pregunta. Estoy tratando de hacer algo similar y soy un desarrollador novato, así que tengan paciencia conmigo. ¿Para qué es la vista web en OnCreate? ¿Hace un formulario nativo de Android con un campo de texto y un botón para enviar y luego llamar a SubmitVote()? Si es así, ¿cuál es el objetivo de la vista web? – Zaheer

+0

¿podría decirme cómo encontrar la URL del formulario? –

+0

Apache HTTP Client que se utiliza en el ejemplo anterior fue [eliminado] (http://developer.android.com/about/versions/marshmallow/android-6.0-changes.html#behavior-apache-http-client) en Android 6.0 . ¿Cómo se puede lograr lo mismo con [HttpUrlConnection] (http://developer.android.com/reference/java/net/HttpURLConnection.html)? –

1

Probablemente no esté viendo errores porque está imprimiendo excepciones de forma incorrecta.
Está utilizando e.printStackTrace(); que no aparece en DDMS/Logcat.

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

que ingrese su error en DDMS/Logcat. Debería ver el stacktrace de la excepción y le ayudará a comprender qué sucede.

EDITAR: ¿Ha comprobado qué se devuelve en client.execute(post);?
Debe comprobar lo que se devuelve en la respuesta posterior al hacerlo:

HttpResponse httpResponse = client.execute(post); 

También puede ejecutar la aplicación en modo de depuración y comprobar donde está fallando/detener

+0

supongo que ayudaría eh? Lo puse y todavía no recibo nada en DDMS. Actualicé mi publicación original también para que otros no se concentren en eso. Acabo de recibir un mensaje sobre "La ventana ya está enfocada", y ese mensaje está ahí incluso sin el código anterior. Básicamente presentan su voto y luego aparecen dos nuevas imágenes para votar. ¿Podría ser algo con Google Forms? – doeiqts

+0

He editado la respuesta, comprobar si le ayuda – pandre

+0

Voy a comprobar que cuando llegue a casa. No estoy seguro de qué respuesta debo esperar en realidad, ya que no la necesito para la aplicación. ¿Existe una respuesta de formulario predeterminada en el envío que pueda verificar? Además, no hay fallas al ejecutar el programa, actúa como todo si está bien, pero los resultados nunca aparecen en la hoja de cálculo. Solo trato de ser claro. – doeiqts

2

Tener un vistazo a la fuente para Acra. Esto carga rastreos de pila a una hoja de cálculo de Google.

0

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

5

El formato, entry.0.single podría no funcionar en muchos casos. Siempre debe encontrar la identificación adecuada de los elementos para crear su solicitud POST. Este article proporciona la forma correcta de publicar datos en una hoja de documentos de Google a través de la aplicación de Android.

Cuestiones relacionadas