Programación > Programación en Android
consulta http
LeandroA:
Hola, como se hace una consulta http con android studio, supongamos en en un layout tengo un boton y una caja de texto, presiono el boton hace la consulta a una pagina web y muestra el contenido en la caja de texto (supongamos que la pagina muestra un simple texto plano "hola mundo")
pd: que triste preguntar esto :D
xkiz ™:
la verdad ni la menor idea pero aca te busque un video tutorial en Youtube, ponelo en la calidad mas alta para que puedas ver bien lo que escribe y saltea a los 5:30 minutos si ya tenes todo instalado..
[youtube]http://www.youtube.com/watch?v=a764vgnOx8o][/youtube]
LeandroA:
bueno al parecer no es fácil o mejor dicho hay una limitación de seguridad :-\, probé con dos metodos, pero al parecer, utilizar internet en segundo plano tiene restricciones, las cuales según lei se pueden desbloquearse agregando los permisos en el AndroidManifes.xml, pero aun asi no corre y me tira error
--- Citar ---android.os.NetworkOnMainThreadException
--- Fin de la cita ---
MainActivity.java (hay dos metodos uno de ellos esta comentado)
--- Código: (JAVA) ---package com.example.helloworld;
import android.app.Activity;
import android.os.Bundle;
// used for interacting with user interface
import android.widget.Button;
import android.widget.TextView;
import android.widget.EditText;
import android.view.View;
// used for passing data
import android.os.Handler;
import android.os.Message;
// used for connectivity
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.URL;
import java.net.URLConnection;
import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import org.apache.http.HttpResponse;
import org.apache.http.StatusLine;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;
import android.os.AsyncTask;
import android.widget.TextView;
import android.os.Bundle;
import android.app.Activity;
import android.util.Log;
import android.view.Menu;
import android.view.View;
import android.widget.Button;
public class MainActivity extends Activity {
private static final String TAG = "Test";
private Button MiBoton;
private HttpResponse response;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
MiBoton = (Button) findViewById(R.id.button1);
MiBoton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
//Log.v(TAG, "Leandro");
//HttpClient httpclient = new DefaultHttpClient();
//HttpGet httpget = new HttpGet("http://www.leandroascierto.com");
//try{
//message.setText("333");
// HttpResponse response = httpclient.execute(httpget);
//message.setText("444");
// StatusLine statusLine = response.getStatusLine();
// int statusCode = statusLine.getStatusCode();
// if(statusCode == 200){
// Log.v(TAG, "sdf");
// }else
// Log.v(TAG, "mierda");
//}catch(Exception e){
// Log.v(TAG, e.toString());
//}
try {
// Perform action on click
URL url = new URL("http://www.leandroascierto.com");
Log.v(TAG,"1");
URLConnection conn = url.openConnection();
Log.v(TAG,"2");
BufferedReader rd = new BufferedReader(new
InputStreamReader(conn.getInputStream()));
Log.v(TAG,"3");
String line = "";
while ((line = rd.readLine()) != null) {
Message lmsg;
lmsg = new Message();
lmsg.obj = line;
lmsg.what = 0;
Log.v(TAG, lmsg.toString());
}
}
catch (Exception e) {
Log.v(TAG, e.toString());
}
}
});
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
@Override
protected void onStart(){
super.onStart();
//Log.v(TAG, "Leandro Ascierto");
}
}
--- Fin del código ---
AndroidManifest.xml
--- Código: (JAVA) ---<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.helloworld"
android:versionCode="1"
android:versionName="1.0" >
<uses-permission android:name="android.permission.INTERNET" />
<uses-sdk
android:minSdkVersion="7"
android:targetSdkVersion="16" />
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name="com.example.helloworld.MainActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
--- Fin del código ---
activity_main.xml
--- Código: (JAVA) ---<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/LinearLayout1"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<Button
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="Button"
android:id="@+id/button1"
android:layout_gravity="left|center_vertical"/>
</LinearLayout>
--- Fin del código ---
seba123neo:
a mi juego me llamaron 8)
te explico como es el tema, ahora lo veo facil, pero en su momento hace unos años cuando empeze me tomo tiempo investigarlo y dejarlo realmente bien.
para explicarlo de forma facil, en android cada cosa necesita su "permiso" (prender wifi, leer contactos, escribir en almacenamiento..etc), como bien hiciste ahi, añadiste el permiso de "internet" en el manifest, eso esta bien, de lo contrario cualquier intento de conexion a internet te salta error.
ahora bien, para hacer una simple peticion a internet, despues de investigar varios metodos para ver cual era el mas rapido, ya hace tiempo que uso este que te paso abajo (es lo mas facil que hay, es simplemente una peticion a una web y una respuesta de texto)
--- Código: (JAVA) --- public static String valida(String pParametro) {
HttpURLConnection vConexion = null;
URL vDireccion;
String vResultado = "";
try {
vDireccion = new URL("http://www.prueba.com/archivo.php?pId=" + pParametro);
vConexion = (HttpURLConnection) vDireccion.openConnection();
vConexion.setConnectTimeout(2000); // Tiempo de espera de la conexion
vConexion.setReadTimeout(10000); // Tiempo de espera de la lectura del stream, si esto ocurre lanza una SocketTimeoutException
vConexion.connect();// Si no conecta lanza una SocketTimeoutException
InputStream vStream = vConexion.getInputStream();
if (vStream.available() != 0){
String vRespuesta = convertInputStreamToString(vStream);
if (vValor.equals("HOLA")) {
vResultado = "OK";
} else {
vResultado = "ERROR";
}
} else {
vResultado = "Error al leer datos del servidor."; // Conecto pero no pudo leer la respuesta (Stream).
}
vDireccion = null;
vStream.close();
vStream = null;
vConexion.disconnect();
vConexion = null;
} catch (SocketTimeoutException e) {
e.printStackTrace();
vResultado = "No se pudo Conectar al Servidor. Chequee la Conexion a Internet y vuelva a intentar.";
} catch (IOException e) {
e.printStackTrace();
vResultado = "No se pudo Conectar al Servidor. Chequee la Conexion a Internet y vuelva a intentar. 2";
}
return vResultado;
}
--- Fin del código ---
con eso ya es suficiente, me olvidaba pasarte la funcion que conviente al "stream" que viene de internet (seria la respuesta) a string, aca va:
--- Código: (JAVA) --- public static String convertInputStreamToString(InputStream is) throws IOException {
if (is != null) {
Writer writer = new StringWriter();
char[] buffer = new char[500000];
try {
Reader reader = new BufferedReader(new InputStreamReader(is, "UTF-8"));
int n;
while ((n = reader.read(buffer)) != -1) {
writer.write(buffer, 0, n);
}
} finally {
is.close();
}
return writer.toString();
} else {
return "";
}
}
--- Fin del código ---
con eso ya te tiene que funcionar para hacer cualquier cosa.
ahora bien, hay un problema, que seguramente es el que te esta pasando a vos, antes cuando yo programaba con la version 2.1 de android, esto funcionaba de lujo en cualquier lugar de la aplicacion (en el evento de un boton o donde sea), pero despues no me acuerdo desde que version de las nuevas que fueron saliendo, dejo de funcionar y lanzaba error, investigando decian que ya no se pueden hacer conexiones de internet desde el mismo "thread" por asi decirlo que la UI, sino que tenes que meterlo en un thread diferente, si o si, sino te lanza error en las versiones nuevas como la 4.
entonces otra ves investigando, cual es el mejor metodo de hacer "thread" o tareas costosas sin que te trabe la UI, me tope y me enamore de "AsyncTask", aparte de ser la solucion al problema anterior sirve para todo.
aca te paso la base de esa clase, la podes buscar en internet y te dice para que sirve cada evento de los que tiene, podes pasar parametros y actualizar controles de la UI directamente en el evento onProgressUpdate.
--- Código: (JAVA) ---private class ThreadActualizar extends AsyncTask<String, String, String> {
Context ctx;
public ThreadActualizar(Context ctx){
this.ctx = ctx;
}
@Override
protected void onPreExecute() {
}
@Override
protected String doInBackground(String... params) {
}
@Override
protected void onProgressUpdate(String... values) {
}
@Override
protected void onPostExecute(String result) {
}
}
--- Fin del código ---
simplemente poner el codigo que quieras, en este caso la conexion a internet, en el evento doInBackground y listo.
y lo llamas desde afuera de esta forma:
--- Código: (JAVA) ---ThreadActualizar thrActualizar = new ThreadActualizar(this);
thrActualizar.execute("");
--- Fin del código ---
saludos.
LeandroA:
Buenísimo Seba, había visto algo de doInBackground pero como todavía no se ni donde estoy pisando lo pase de largo y fui por algo mas facil, asi que era ese el problema,
busque algo con lo que me pasaste porque no se muy que es lo librerias hay que importar y me tope con este ejemplo y bien me funciono bien, al parecer utiliza otras librerias (el tuyo creo que HttpURLConnection y el otro DefaultHttpClient) no se bien que ventajas o desventajas cada uno pero bueno me pone contento almenos poder conectar a la web y ver el contenido.
unas preguntas mas fuera de este tema
que significa o porque se declaran asi
protected void
public static
otra lo que se llama MainActivity.java, es un modulo una clase? por lo que vi se pueden declarar clases privadas dentro de este, se pueden agregar mas archivos de este tipo?
los Layout serian algo asi como los forms en vb? :P
Navegación
[#] Página Siguiente
Ir a la versión completa