Envío de datos de Android a servidor web

Buenas,

estoy haciendo una pequeña aplicación que envíe datos desde Android a un servidor web y lo guarde en una BBDD.

Estoy siguiente el siguiente tutorial:

http://www.go4expert.com/articles/step-step-guide-sending-data-android-t30182/

En mi caso, y para simplificar, tengo un botón de "Submit" que envía la fecha y un valor (que siempre es el mismo: 100). Cundo lo ejecuto, me da el siguiente error de RunTime:

08-02 08:15:45.918    7415-7812/com.example.alberto.albertapp W/System.err﹕ org.json.JSONException: End of input at character 0 of
08-02 08:15:45.919    7415-7812/com.example.alberto.albertapp W/System.err﹕ at org.json.JSONTokener.syntaxError(JSONTokener.java:450)
08-02 08:15:45.919    7415-7812/com.example.alberto.albertapp W/System.err﹕ at org.json.JSONTokener.nextValue(JSONTokener.java:97)
08-02 08:15:45.919    7415-7812/com.example.alberto.albertapp W/System.err﹕ at org.json.JSONObject.<init>(JSONObject.java:156)
08-02 08:15:45.919    7415-7812/com.example.alberto.albertapp W/System.err﹕ at org.json.JSONObject.<init>(JSONObject.java:173)
08-02 08:15:45.919    7415-7812/com.example.alberto.albertapp W/System.err﹕ at com.example.alberto.albertapp.MainActivity$AddNewRecord.doInBackground(MainActivity.java:119)
08-02 08:15:45.919    7415-7812/com.example.alberto.albertapp W/System.err﹕ at com.example.alberto.albertapp.MainActivity$AddNewRecord.doInBackground(MainActivity.java:91)
08-02 08:15:45.919    7415-7812/com.example.alberto.albertapp W/System.err﹕ at android.os.AsyncTask$2.call(AsyncTask.java:288)
08-02 08:15:45.919    7415-7812/com.example.alberto.albertapp W/System.err﹕ at java.util.concurrent.FutureTask.run(FutureTask.java:237)
08-02 08:15:45.919    7415-7812/com.example.alberto.albertapp W/System.err﹕ at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231)
08-02 08:15:45.919    7415-7812/com.example.alberto.albertapp W/System.err﹕ at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
08-02 08:15:45.919    7415-7812/com.example.alberto.albertapp W/System.err﹕ at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
08-02 08:15:45.919    7415-7812/com.example.alberto.albertapp W/System.err﹕ at java.lang.Thread.run(Thread.java:818)



¿Alguna idea de qué hago mal?

Gracias!
Sin algo del código tuyo chungo ayudarte...


Edito:
tras una búsqueda rápida del error de JSON, aquí te dejo algo que puede que te de pistas


http://samalpramod.blogspot.com.es/2012 ... ut-at.html
Gracias @malainfluencia.

Lo he hecho con un código más sencillo:

public void envia(View v) {
        // Create a new HttpClient and Post Header
        HttpClient httpclient = new DefaultHttpClient();
        HttpPost httppost = new HttpPost("http://x.y.z.a/android1/new_record.php");
        TextView tv = (TextView) findViewById(R.id.logbox);
//        tv.setText(String.valueOf(cambios));
        strLog="Dentro de función...";
        tv.setText(strLog);

        try {
            // Add your data
            List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(2);
            nameValuePairs.add(new BasicNameValuePair("fecha", "2015-08-02 02:09:12"));
            nameValuePairs.add(new BasicNameValuePair("valor", "1"));
            httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));

            // Execute HTTP Post Request
            HttpResponse response = httpclient.execute(httppost);

        } catch (org.apache.http.client.ClientProtocolException e) {
            // TODO Auto-generated catch block
            strLog=strLog+ "http_Err" + e.toString();
        } catch (java.io.IOException e) {
            // TODO Auto-generated catch block
            strLog=strLog+ "IO_Err" + e.toString();
        }
        tv.setText(strLog);

    }


He hecho un log, y me da el error:

httpHostConnectException: Connection to http://IP refused


No lo entiendo, porque si abro un navegador y le pongo la URL, me abre la web...

Gracias!
Lo ejecutas en el emulador o es en un dispositivo real?


¿Tienes permisos de internet declarados en el manifest ?

<uses-permission android:name="android.permission.INTERNET"></uses-permission>
malainfluencia escribió:Lo ejecutas en el emulador o es en un dispositivo real?


¿Tienes permisos de internet declarados en el manifest ?

<uses-permission android:name="android.permission.INTERNET"></uses-permission>


Es un dispositivo real, y tengo los permisos declarados. :(
Desde el navegador del dispositivo accedes a la pagina web?

El código parece correcto, no se que puede estar fallando para que no conecte...

x.y.z.a ¿es el propio teléfono no?
malainfluencia escribió:Desde el navegador del dispositivo accedes a la pagina web?

El código parece correcto, no se que puede estar fallando para que no conecte...

x.y.z.a ¿es el propio teléfono no?


Desde el navegador acceso, correcto . x.y.z.a es la IP pública de mi servidor. La que pongo en el navegador y me funciona.
¿Estás realizando la conexión desde un hilo? Aunque creo que si no fuese el caso daría una excepción diferente.

Aprovecho para comentar que modificar la interfaz desde un hilo es muy mala idea, y en algunos casos puede cascar la app XD
Waninkoko escribió:¿Estás realizando la conexión desde un hilo? Aunque creo que si no fuese el caso daría una excepción diferente.

Aprovecho para comentar que modificar la interfaz desde un hilo es muy mala idea, y en algunos casos puede cascar la app XD


Hola Waninkoko. Me he perdido, pero ahora creo que el problema está en cómo el program contacta con el PHP. Desde una web con un formulario simple, me inserta los valores. Y desde la maldita aplicación no lo hace, ni salta error.

El código es tan simple como:

HttpClient httpclient = new DefaultHttpClient();
        HttpPost httppost = new HttpPost("new_record.php");
            // Add your data
            List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();
            nameValuePairs.add(new BasicNameValuePair("fecha", "2015-08-02 02:09:12"));
            nameValuePairs.add(new BasicNameValuePair("valor", "2001"));
            httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));

            // Execute HTTP Post Request
            HttpResponse response = httpclient.execute(httppost);
            HttpEntity resEntity = response.getEntity();


Es que no hay más! :( . Y no me da ni siquiera error!

EDIT:

android.os.NetworkOnMainThreadException
banderas20 escribió:
Waninkoko escribió:¿Estás realizando la conexión desde un hilo? Aunque creo que si no fuese el caso daría una excepción diferente.

Aprovecho para comentar que modificar la interfaz desde un hilo es muy mala idea, y en algunos casos puede cascar la app XD


Hola Waninkoko. Me he perdido, pero ahora creo que el problema está en cómo el program contacta con el PHP. Desde una web con un formulario simple, me inserta los valores. Y desde la maldita aplicación no lo hace, ni salta error.

El código es tan simple como:

HttpClient httpclient = new DefaultHttpClient();
        HttpPost httppost = new HttpPost("new_record.php");
            // Add your data
            List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();
            nameValuePairs.add(new BasicNameValuePair("fecha", "2015-08-02 02:09:12"));
            nameValuePairs.add(new BasicNameValuePair("valor", "2001"));
            httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));

            // Execute HTTP Post Request
            HttpResponse response = httpclient.execute(httppost);
            HttpEntity resEntity = response.getEntity();


Es que no hay más! :( . Y no me da ni siquiera error!

EDIT:

android.os.NetworkOnMainThreadException


Esta excepción es porque tienes que hacer al petición en un hilo, como te ha dicho @Waninkoko
aleix_1379 escribió:Esta excepción es porque tienes que hacer al petición en un hilo, como te ha dicho @Waninkoko


¿Alguna ayudita de cómo hacer eso? :)
banderas20 escribió:
aleix_1379 escribió:Esta excepción es porque tienes que hacer al petición en un hilo, como te ha dicho @Waninkoko


¿Alguna ayudita de cómo hacer eso? :)


Yo utilitaria una AsyncTask

http://developer.android.com/reference/ ... cTask.html

Te pongo un pequeño ejemplo que sirve para descargar una web y poner el resultado en un TextView, si tienes alguna duda ya preguntaras :)

https://dl.dropboxusercontent.com/u/475 ... ncTask.zip
aleix_1379 escribió:http://developer.android.com/reference/ ... cTask.html

Te pongo un pequeño ejemplo que sirve para descargar una web y poner el resultado en un TextView, si tienes alguna duda ya preguntaras :)

https://dl.dropboxusercontent.com/u/475 ... ncTask.zip


Muchas gracias. Había leído que se tenía que usar una AsyncTask. Le echaré un vistazo a la referencia y al ejemplo.

Os voy contando.

Gracias de nuevo! [oki]
12 respuestas