En este tutorial de hoy vamos aprender cómo enviar datos captados des de nuestro Android a un servidor web, en este caso a un archivo PHP. Yo os presento el código más simple para que veáis el funcionamiento y después vosotros por vuestra cuenta ampliar ese código para crear cosas útiles.
Para empezar os muestro el código del archivo 'index.php' que estará alojado en mi servidor y es el que recibirá la información enviada por Android y emitirá una respuesta. En este caso más simple no podría ser; recibirá el parámetro y dará una respuesta de OK añadiendo el parámetro recibido para confirmar que el envío de datos a sido correcto.
index.php
<?php //Recibimos el parametro des de Android $parametro = $_REQUEST['a']; //En este caso simplemente imprimimos una respuesta //Aqui podríais introducir/obetener datos de SQL //O cualquier otra cosa //imprimimos el mensaje de que ha llegado correctamente //añadiendo el parametro 'a' también echo ("SERVER: ok, parametro recibido -> ".$parametro); ?>Una vez visto el php ya no le damos más importáncia. Pasemos a Android. En el siguiente código que he hecho crearemos un simple EditTexT y un botón para enviar el texto escrito en el EditText al servidor e imprimir por pantalla (en un Toast) el resultado.
El código esta como siempre totalmente comentado para el fácil entendimiento y me gustaría que practicarais con el para crear cosas útiles. Para poder entender bien el tutorial os recomiendo leer primero estos POST si es que no lo habéis hecho:
- http://www.tutorialeshtml5.com/2012/02/tutorial-basico-android-agregar-boton.html
- http://www.tutorialeshtml5.com/2012/05/android-thread-hilo-y-handler-proceso.html
Os dejo con el código y como siempre espero vuestras dudas, sugeréncias e críticas. Gracias!
Activity
public class MainActivity extends Activity { private Button bt; private EditText edit; //Creamos el handler puente para mostrar //el mensaje recibido del servidor private Handler puente = new Handler() { @Override public void handleMessage(Message msg) { //Mostramos el mensage recibido del servido en pantalla Toast.makeText(getApplicationContext(), (String)msg.obj, Toast.LENGTH_LONG).show(); } }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //Relacionamos con XML como ya sabemos bt = (Button)findViewById(R.id.button1); edit = (EditText)findViewById(R.id.editText1); //Añadimos el Listener bt.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { //Hay que hacerlo dentro del Thread //No me dejaba tocar la Clase de Network //directamente en el hilo principal Thread thr = new Thread(new Runnable() { @Override public void run() { //Enviamos el texto escrito a la funcion EnviarDatos(edit.getText().toString()); } }); //Arrancamos el Hilo thr.start(); } }); } private void EnviarDatos(String dato){ //Utilizamos la clase Httpclient para conectar HttpClient httpclient = new DefaultHttpClient(); //Utilizamos la HttpPost para enviar lso datos //A la url donde se encuentre nuestro archivo receptor HttpPost httppost = new HttpPost("http://tywors.com/" + "webs/tutoriales_html5/enviar_php/index.php"); try { //Añadimos los datos a enviar en este caso solo uno //que le llamamos de nombre 'a' //La segunda linea podría repetirse tantas veces como queramos //siempre cambiando el nombre ('a') List<NameValuePair> postValues = new ArrayList<NameValuePair>(2); postValues.add(new BasicNameValuePair("a", dato)); //Encapsulamos httppost.setEntity(new UrlEncodedFormEntity(postValues)); //Lanzamos la petición HttpResponse respuesta = httpclient.execute(httppost); //Conectamos para recibir datos de respuesta HttpEntity entity = respuesta.getEntity(); //Creamos el InputStream como su propio nombre indica InputStream is = entity.getContent(); //Limpiamos el codigo obtenido atraves de la funcion //StreamToString explicada más abajo String resultado= StreamToString(is); //Enviamos el resultado LIMPIO al Handler para mostrarlo Message sms = new Message(); sms.obj = resultado; puente.sendMessage(sms); }catch (IOException e) { //TODO Auto-generated catch block } } //Funcion para 'limpiar' el codigo recibido public String StreamToString(InputStream is) { //Creamos el Buffer BufferedReader reader = new BufferedReader(new InputStreamReader(is)); StringBuilder sb = new StringBuilder(); String line = null; try { //Bucle para leer todas las líneas //En este ejemplo al ser solo 1 la respuesta //Pues no haría falta while ((line = reader.readLine()) != null) { sb.append(line + "\n"); } } catch (IOException e) { e.printStackTrace(); } finally { try { is.close(); } catch (IOException e) { e.printStackTrace(); } } //retornamos el codigo límpio return sb.toString(); } }
Muchas gracias y no olvides comentar!
Tengo una duda, una vez copiado el codigo y hecho mi boton y mi edittext en el main.xml lo ejecuto, escribo un texto pero no hace nada..... se supone q el servidor esta recibiendo algo? o yo deberia recibir un "OK" ?
ResponderEliminarSi el código PHP es igual al del tutorial sí que deberías obtener respuesta ya que tiene un "echo".
Eliminarcomo sería el codigo, para un servidor http?
ResponderEliminarBuenos días,
Eliminarno te acabo de entender, ya que el ejemplo esta hecho para un servidor http.
El código en el servidor sería la primera parte del tutorial donde dice index.php
explícate un poco mejor, muchas gracias!
perdon perdon, la pregunta era como seria la cabecera html??
EliminarNose si sigo sin entenderte muy bien;
ResponderEliminarpara imprimmir alho en HTML sería simplemnete texto plano:
< html>
< body>
SERVER: ok, no hay parametros en HTML
< /body>
< /html>
sin espacios en las eiquetas
EliminarAmigo ya lo probe y no pasa nada como se supone que deberia de funcionar
ResponderEliminarPara enviar varios datos, por ejemplo datos y un archivo, como sería? porque por lo que veo solo pilla el último setEntity.
ResponderEliminarPara enviar varios datos hay que repetir la línea:
EliminarpostValues.add(new BasicNameValuePair("a", dato));
una por cada dato cambiando el Key en este caso 'a' y el dato como ya se entiende.
Para enviar archivos crearé un tutorial en cuanto tenga un rato libre. Gracias!
¿es posible enviar una foto tomada desde el mismo dispositivo (celular con androide) a una url con este mismo procedimiento?
ResponderEliminarMuchas gracias por tu colaboración.
Sí que se podría! :D
EliminarMuchas gracias, seguiré intentandolo.
EliminarMuy buen tuto! Despues lo probaré
EliminarVictor, pudiste enviar la foto?
Muxas gracias amigo, he probado varios tutoriales, pero no me funcionaban al 100, buen aporte
ResponderEliminarHola, buen día
ResponderEliminarprimero que todo muchas gracias me ha servido mucho sin embargo tengo una duda.
Cuando uso tu link para el ejemplo me sirve de maravilla, no obstante cuando trato de poner mi dirección http://localhost/xampp/example/index.php no funciona, supongo que es porque no hago conexión a mi servidor primero, eso lo cambio y en index.php hago la conexión, sin embargo no funciona =( algún consejo u observación?
De antemano muchas gracias
Supongo que desde el navegador si puedes entrar a http://localhost/xampp/example/index.php? Haces la prueba con mi código del php en el tuyo?
EliminarLo que te pasa es raro... debe ser una tontería si das más detalles veremos a ver si entre todos te lo resolvemos! :D Gracias!
Primero que todo muchas gracias por responder.
EliminarMe sale esto cuando intento ingresar:
Notice: Undefined index: a in C:\xampp\htdocs\xampp\example\index.php on line 6
SERVER: ok, parametro recibido ->
y me está pasando algo muy raro, porque si se supone que tengo a index en una carpeta, cuando le doy http://localhost/xampp/example no me sale el listado de documentos que tengo =/ Pero si le cambio el nombre de index a receiver. La verdad no se que modificarle. Mi servidor tiene contraseña y por eso le estaba agregando dos documentos más
"globals.php"
class config{
public static function getBBDDServer() {
return 'localhost';
}
public static function getBBDDName(){
return 'android';
}
public static function getBBDDUser(){
return 'root';
}
public static function getBBDDPwd(){
return 'diana';
}
}
y dbmanager.php
include_once('globals.php');
class dbmanager{
public function executeQuery($sql){
$con = mysql_connect(config::getBBDDServer(), config::getBBDDUser(), config::getBBDDPwd());
if (!$con)
{
die('Could not connect: ' . mysql_error());
}
mysql_select_db(config::getBBDDName(), $con);
$result = mysql_query($sql);
mysql_close($con);
return $result;
}
}
finalmente a index le estaba adicionando:
include_once('globals.php');
include_once('dbmanager.php');
y el código de eclipse es tal cual tu lo tienes menos la línea:
HttpPost httppost = new HttpPost("http://localhost/xampp/example/receive.php");
Muchas gracias
Por lo que parece el error esta en algo de la configuración del XAMPP... Intenta hacer la prueba con APPServ es muy sencillo y apenas tiene nada de configuración. Antes de eso (Puede parecer una tontería pero en esto nunca se sabe) elimina la línea de: mysql_close($con); en el php y haz la prueba.
EliminarYo es que en local no tengo mucha practica ya que no lo suelo utilizar,mira a ver de probar una de esas dos cosas y sino a ver si alguien más nos puede echar un cable ;). Gracias!
Tengo una pregunta, tu no le tienes ningún otro archivo en el servidor?
EliminarNo uses localhost, so no la ip de tu red, ya que el empulador del dispositivo movil es como si fuera un dispositivo externo.
EliminarMuchas gracias por las recomendaciones, ya mismo lo miro sino mañana pruebo en el pc de la U que tiene otro servidor ;)
ResponderEliminarhola hermanaso tu tuto esta genial te tengo una pregunta puesto q soy novato en cosas de java yo quiero hacer lo siguiente se generaran numeros aleatorios y quiero q cada vez q el numero sea superior a 120 este inserte una serie de datos sin necesidad de ejecutar un boton o algo no se si me explico quiero hacer inserciones a la base de datos sin necesidad de usar un boton para ejecutar la accion si no cuando se genere un numero superior a 120 no se si tengas algun ejemplo de esto realmente me interesa mi nombre es jose dejo mi correo jose_xp_799@hotmail.com
ResponderEliminarPuedes probar haciendo un TimerTask o sino lo poner en el onCreate, no ara necesidad de apretar ningún botón, esto que me preguntas no será con fines maléficos no? xD
EliminarNO PARA NADA xD es para un proyecto de la escuela
ResponderEliminarmira este es el codigo q tengo pero no se q error cometo q no inserta los datos
ResponderEliminarpublic void onClick(View v) {
//Declare the timer
Timer t = new Timer();
//Set the schedule function and rate
t.scheduleAtFixedRate(new TimerTask() {
@Override
public void run() {
runOnUiThread(new Runnable() {
@Override
public void run() {
TextView tv = (TextView) findViewById(R.id.tv2);
final Random myRandom = new Random();
switch (contador){
case 1: tv.setText(String.valueOf(myRandom.nextInt(95-90)+90));
numero=myRandom.nextInt();
if(numero>=90 ) {
class Insertar extends AsyncTask {
protected String doInBackground(String… args) {
String nombre= (“Jose”);
String Npulso=”";
numero= Integer.parseInt(Nnumero);;
// Building Parameters
List params = new ArrayList();
params.add(new BasicNameValuePair(“nombre”, nombre));
params.add(new BasicNameValuePair(“Nnumero”, Nnumero));
// getting JSON Object
// Note that create product url accepts POST method
JSONObject json = jsonParser.makeHttpRequest(url_create_paciente,
“POST”, params);
// check log cat fro response
Log.d(“Creacion Exitosa”, json.toString());
// check for success tag
try {
int success = json.getInt(TAG_SUCCESS);
if (success == 1) {
// successfully created product
Intent i = new Intent(getApplicationContext(), monitor.class);
startActivity(i);
// closing this screen
finish();
} else {
// failed to create product
}
} catch (JSONException e) {
e.printStackTrace();
}
return null;
}
}
}
break;
}
contador+=1;
}
});
}
}, 60000, 60000);
}
});
}
no se que error me sale a parte no se donde colocar esto new Insertar().execute(); q lo coloco en el onclick del boton que preciono para que este empiese a generar los numeros aleatorios y quiero q cuando este sea superior a 120 inserte datos disculpa la novatada lo de la insercion estoy tratando de hacerlo con un if pero igual no hace nada
no se si me puedas dar una mano es q de verdad lo necesito para terminar mi proyecto y estoy ya a una semana tratando y no se que hacer :(
ResponderEliminar<?php
ResponderEliminar// array for JSON response
$response = array();
// check for required fields
if (isset($_POST['nombre']) && isset($_POST['codigo'])) {
$nombre = $_POST['nombre'];
$codigo = $_POST['codigo'];
// include db connect class
require_once __DIR__ . '/db_connect.php';
// connecting to db
$db = new DB_CONNECT();
// mysql inserting a new row
$result = mysql_query("INSERT INTO registro(nombre, codigo, fecha, hora) VALUES('$nombre', '$codigo','2013-06-18', '19:41:00')");
// check if row inserted or not
if ($result) {
// successfully inserted into database
$response["success"] = 1;
$response["message"] = "registro Guardado.";
// echoing JSON response
echo json_encode($response);
} else {
// failed to insert row
$response["success"] = 0;
$response["message"] = "Oops! Un ERROR";
// echoing JSON response
echo json_encode($response);
}
} else {
// required field is missing
$response["success"] = 0;
$response["message"] = "Required field(s) is missing";
// echoing JSON response
echo json_encode($response);
}
Primero comprueba que el PHP te funcione bien, cambia los parámetros $_POST por $_GET (solo durante esta prueba) y pasale los parámetros manualmente, ejemplo: loksea.php?nombre=pepe&codigo=200 y mira aver si graba en SQL.
EliminarPara el Android tendras que ir comprobanda hasta que punto te funciona y cual no, utiliza el Log.d("Miapp","punto 1,2,3,etc.."); y podrás leer en el Logcat si te llega hasta esa linea sin fallos. Ves intercalando tus lineas del programa con el Log.d("Miapp","punto 1,2,3,etc.."); veras en que punto te deja de funcionar. Me gustaría ayudarte más pero entre el trabajo y todo no me lo puedo permitir, lo siento. Si te salen dudas puntuales pregunta aquí. Muchas Gracias!
Hola Tengo una pregunta. Supongamos que quiero enviar información desde una pagina accedida por un dispositivo movil con android cuando presiono un boton en la pagina. Tengo que que dar algun tipo de permiso para que dicho contenido sea enviado supongo, o para que el dispositivo acceda a recibirlo? Ahora bien hay alguna forma de obtenerlo mediante alguna API? tenes alguna idea de como hacerlo?
ResponderEliminarTe refieres a que quieres mostrar una web dentro de la aplicación y que esta envíe algún tipo de información del dispositivo, no? Creo que tienes más de una opción.
Eliminar-La más difícil: Que la pagina por si sola coja información del dispositivo, aquí ya tienes que ponerte con más lenguajes y mirar como se podría hacer con php o asp o algo así... muchos permisos etc..
-La manera fácil: nose si te valdría, sería coger la información des de java, es decir desde la misma aplicación y pasarla a la web una vez que pulse el botón de enviar a través de variables en el GET por ejemplo..
Dime algún ejemplo más concreto que con lo que lo quieras utilizar. Gracias! +1 :D
Hola, primero que nada muchas gracias por responder. La idea seria que en una pagina se pueda tener información de algun usuario (como su mail), y presionando un boton(tratando de no instalar un cliente en el dispositivo, si se puede),se cree en el celular o tablet un archivo con dicha información o un contacto. Espero que te quedara un poco mas clara mi duda. No soy un experto, recien comienzo y me surgen muchos interrogantes. Si tenes alguna otra reflexión me sera de gran utilidad.
EliminarDe nuevo muchas gracias.
Disculpame por no responder en el hilo correspondiente mas abajo no me di cuenta.
Por lo que he entendido tendrías que utilizar la opción difícil xD ya que quieres conectar una pagina web con un dispositivo móvil.
EliminarPara guardar archivos se aria con en web normal de PC sin embargo que ese archivo actúe de una manera o otra (por ejemplo que sea un contacto) abrá que buscar más... cuando tenga tiempo buscaré sobre ese tema. Perdona por no poderte ayudar más de momento!
Falta un detalle, en Manifest tienen que darle permisos de INTERNET de lo contrario no funcionara APP.
ResponderEliminarHola! esta muy bueno el tuto pero quede con algunas dudas..
ResponderEliminarEstoy haciendo un proyecto en el cual necesito obtener informacion de una base de datos que esta alojada en un servidor. La duda que me queda es como hago la conexion con la base de datos.. esto lo hago en un PHP? o lo debo hacer en alguna clase de la app ??
Y si necesito hacer pruebas en localhost, como hago la conexion? gracias!
Estimado Victor:
ResponderEliminarte felicito por tus aportes,mi caso es, yo me comunico bien con la base de datos hago bien el sql, mi pregunta como hago para que los datos leidos de una tabla los pueda enviar al dispositivo y aparezcan en la pantalla del dispositivo.gracias.
Si realizas este tutorial al dispositivo te llegará el mensaje de : SERVER: ok, parametro recibido -> ....
EliminarSimplemente hay que añadir una consulta a base de datos Select Id from table ....
y el resultado de la consulta lo debes añadir en vez de ( SERVER: ok, parametro recibido ->) ....
Ya comentarás resultados! un +1 nos ayuda a todos!
Muchas gracias!
MUCHAS GRACIAS, ME SIRVIO BASTANTE :D
ResponderEliminarGracias! recuerda puntuarlo +1
EliminarAmigo podria adjuntar el proyecto , para poder descargarlo
ResponderEliminarsoy nuevo en android y me seria de mucha ayuda.
atento a sus comentarios.
Nelson
hola! oye un favor, tengo que hacer una aplicacion en donde con un solo boton en android, mande a traer la tabla sqlite con una respuesta de esa tabla de manera aleatoria.. tu sabrias como hacerlo!!!
ResponderEliminarEnhorabuena Victor un gran trabajo. Gracias
ResponderEliminarQue tal victor, mi duda es que corro el la App desde mi cell y miro el php en un servidor, pero no muestra sino "SERVER: ok, parametro recibido -> " faltando la variable que envie desde la aplicación, agradecería ayuda lo antes posible, de hecho sería genia hoy mismo
ResponderEliminarMil gracias
prueba poner $_POST['a'];
Eliminaren vez de $_REQUEST['a'];
Ninguna de las dos funciona
Eliminara mi me pasa lo mismo ¿alguna solución?
Eliminarhola buenas noches disculpa soy nueva en esto de la programacion en android, lo que pasa es que un profesor nos dejo que desarrollemos un programa en android que capture el numero de celular de donde nos envian un mensaje y que lo mostremos en una base de datos me gustaria optener su ayuda, me parecio interesante su post y queria saber como podria hacer si es que es posible adecuar su codigo para lo que se me solicito, de antemano muchisimas gracias por el apoyo
ResponderEliminarEste tutorial te puede servir para la parte de enviar el número que recoges y guardarlo en una base de datos en el servidor. Para la parte de capturar el número de teléfono busca en google 'intent receiver android' y busca algún ejemplo de sms que seguro que hay!
EliminarMuchas gracias por seguir nuestra web!
Este comentario ha sido eliminado por el autor.
ResponderEliminarMuy buen tutorial, funciona excelente mi duda es como puedo mostrar el parametro recibido pero en php es decir que el echo ("SERVER: ok, parametro recibido -> ".$parametro); se visualice en mi navegador y no en mi dispositivo android. De antemano muchas gracias por el tutorial y por cualquier ayuda
ResponderEliminarEn el navegador del móvil?
EliminarCon este tutorial no es posible ya que es un envio-respuesta, tendrías que buscar de hacer un intent a la página web. Hace tiempo publique un tutorial sobre intents, échale un ojo :)
Necesito que los datos se visualicen en una aplicación web que será accesada desde una pc de escritorio, revisare tu articulo de intents gracias.
ResponderEliminarComo puedo hacerle para mostrar en una pagina web los parámetros enviados? Quiero enviar mi ubicación gps al server y que me la muestre en un mapa en una página web, de antemano gracias.
ResponderEliminarAl enviarlos al server deberás guardar las coordenadas en una SQL. Y despues pues consultas la SQL des de la web.
EliminarHola, estoy interesada en tu problema, ya que tengo que realizar un control de flotas para unos vehículos y no se como hacer el server.. la verdad ando un poco perdida
Eliminaramigo una ayuda por favor, necesito enviar un archivito al servidor como hago eso?
ResponderEliminarHola felicidades por el tuto me uno a la pregunta de dante como podria enviar una archivo de audio sea mp3 o wav enviarlo desde android mediante un servidor php usando android studio.
ResponderEliminargracias mil por sus ayudas
Hola, me quedo claro en su mayoría lo que explicaste.. Pero tengo una duda, yo hice una pagina web (mapa) con php y base de datos, quiero que esta pag aparezca en mi webView en Android Studio y que cuando le de clic a un marcador me muestre su información (que se almacena en la BD) ¿Como le hago para hacer que funcione en si?, es decir, ¿Que la app muestre un toast al dar clic en un marcador y esta muestre información q se almacena en la BD?
ResponderEliminarNo tengo muy claro como puedes conectar el contenido del webview al toast de android.
EliminarLo que yo aría es buscar el API de google maps para simplemente descargar los datos de la BD al maps android en tu App. De esta manera los marcadores serán más fáciles.
Lo que pasa es que me pidieron que fuera asi, mediante una pagina web realizar el mapa.. Pero la verdad yo tampoco se como conectar el webView con el toast en android :/
EliminarGracias por el tutorial me sirvio mucho...
ResponderEliminarHola, probe el tuto pero no realmente no me sale nada, me pregunto si tiene que ver con que yo uso Android Studio
ResponderEliminarBuenas, gracias por el tutorial, pero en el SDK 23 de AndroidStudio la clase HttpClient no está soportada. Podrías decirnos como usar la clase HttpUrlConnection ?
ResponderEliminarhola si quiero mandar los datos a mi correo electronico ¿en que parte pongo mi dirección de correo? se pueden enviar datos como difreccion correo telefono y cuerpo de mensaje? como seria el código. para integrarlo en android studio. gracias por tu ayuda
ResponderEliminarGenial, mas o menos lo que buscaba, lo cierto es que me conformo con enviar algo por get ( a php) y que este responda simplemente con ok y que android lo lea para saber que ha llegado.
ResponderEliminarVeo demasiado codigo para lo que pido, no?. Sobraran cosas.
Bueno, voy a ir probando y ya veo
Gracias por darme un (parece ser) buen comienzo :-)
Que tal amigo. disculpa pero quisiera saber si esto lo puedo usar para enviar información a un servicio en php que escucha a travez de una IP y puerto. Es decir que en vex de especificarle una URL, se puede indicar que envie el texto a una Ip y un puerto en específico ? Por favor si alguien lo sabe. Le agradecería mucho.
ResponderEliminarHola, sé que hay muchas opciones ya inventadas, pero no está mal una más!!!
ResponderEliminarYo necesito saber cómo se puede hacer para transmitir lo que ocurre en la pantalla de mi móvil a un sitio web.
Algo que sea propio y no usando youtube, daylimotion u otro para transmitir vídeo en vivo de desde el móvil.
Hola, sé que hay muchas opciones ya inventadas, pero no está mal una más!!!
ResponderEliminarYo necesito saber cómo se puede hacer para transmitir lo que ocurre en la pantalla de mi móvil a un sitio web.
Algo que sea propio y no usando youtube, daylimotion u otro para transmitir vídeo en vivo de desde el móvil.
Hola Victor muy bueno tu tutorial, yo te consulto, tengo una app en android que me muestra en pantalla los datos de latitud y longitud, vos me podrás decir como hago para que esta aplicacion envie esos datos a un servicio web php, y hay alguna forma de obtener el id del dispositivo en el que corre la aplicacion? como puedo hacer para que los datos se envien cada cierto tiempo a la BD?
ResponderEliminarComo puedo hacer para que corra en segundo plano?
Muchas gracias.