Es este tutorial vamos a explicar como crear un navegador sencillo que además podrá guardar la página en un archivo en memoria externa.
La aplicación pedirá una dirección web y mostrará por pantalla la página indicada, además verificará si hay conexión, también almacenará el contenido de la página en un fichero en memoria externa, el cual se le pedirá al usuario que indique el nombre de dicho archivo.
Es este tutorial aprenderás a:
- Usar un WebView
- Guardar una página en un fichero en memoria externa
Espero que le guste y le resulte fácil de comprender.
Aquí podrás ir a la ayuda oficial de Android donde te explica detalladamente el uso del WebView.
Pasos a seguir:
1. Creamos la interfaz principal de la aplicación, la interfaz deberá de informa al usuario si se ha podido obtener conexión y también permitir al usuario introducir la url que quiere visualizar.
Los elementos principales de la interfaz serán:
- TextView: para informar al usuario sobre el estado de la conexión
- EditText: para que el usuario pueda introducir la dirección url
- WebView: para que el usuario pueda visualizar la web
Un ejemplo de interfaz gráfica.
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" > <TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="@string/hello" /> <EditText android:id="@+id/edTextUrl" android:layout_width="match_parent" android:layout_height="50dp" android:inputType="textUri" android:singleLine="true" android:text="@string/httphint" > <requestFocus /> </EditText> <Button android:id="@+id/btnConectar" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="@string/botonConectar" /> <WebView android:id="@+id/webView" android:layout_width="match_parent" android:layout_height="260dp" /> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" > <Button android:id="@+id/btnGuardar" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/guardarPagina" /> <EditText android:id="@+id/edtextNombre" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_weight="1" android:ems="10" android:text="@string/pagina.html" /> </LinearLayout> <TextView android:id="@+id/textInfo" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textSize="12dp" /> </LinearLayout>
2. Declaramos los campos que vamos a utilizar en la clase principal.
public class MainActivity extends Activity { //1. Campos protected EditText url; protected Button conectar; protected TextView info; protected WebView webview; protected Button guardar; protected EditText nombre;
3. Inicializamos los campos y los eventos que vamos a utilizar en el método onCreate() además de comprobar si tenemos conexión a internet.
@SuppressLint({ "NewApi", "NewApi", "NewApi" }) @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // Dar permisos de internet a la actividad StrictMode.ThreadPolicy policy = new StrictMode. ThreadPolicy.Builder().permitAll().build(); StrictMode.setThreadPolicy(policy); //2. Unir la interfaz con la clase url = (EditText) findViewById(R.id.edTextUrl); conectar = (Button) findViewById(R.id.btnConectar); guardar = (Button) findViewById(R.id.btnGuardar); webview = (WebView) findViewById(R.id.webView); info = (TextView) findViewById(R.id.textInfo); nombre = (EditText) findViewById(R.id.edtextNombre); //Comprueba si hay conexión ha internet if (isNetworkAvailable()){ info.setText("Se ha establecido conexión"); } else{ info.setText("No se ha podido establecer la conexión"); } // (conectar) Evento SetOnClickListener conectar.setOnClickListener(new OnClickListener() { public void onClick(View v) { // TODO Auto-generated method stub webview.loadUrl(url.getText().toString()); } }); // (guardar) Evento SetOnClickListener guardar.setOnClickListener(new OnClickListener() { public void onClick(View v) { // TODO Auto-generated method stub guardarPagina(); } }); }
4. Creamos el método que comprueba el estado de la conexión a internet.
/** * Comprueba si hay conexión ha internet * @return Falso en caso de que no haya */ private boolean isNetworkAvailable() { ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE); NetworkInfo networkInfo = cm.getActiveNetworkInfo(); if (networkInfo != null && networkInfo.isConnected()) return true; else return false; }
5. Creamos un método para ver si está accesible la memoria externa y podemos escribir en ella.
/** * Comprueba si la memoria externa es accesible y se puede escribir * @return Falso en caso de que no sea accesible o no se pueda escribir */ public boolean comprobarMemoria(){ boolean sdDisponible = false; boolean sdAccesoEscritura = false; //Comprobamos el estado de la memoria externa (tarjeta SD) String estado = Environment.getExternalStorageState(); if (estado.equals(Environment.MEDIA_MOUNTED)) { sdDisponible = true; sdAccesoEscritura = true; } else if (estado.equals(Environment.MEDIA_MOUNTED_READ_ONLY)) { sdDisponible = true; sdAccesoEscritura = false; } else { sdDisponible = false; sdAccesoEscritura = false; } //Comprueba que es accesible y se puede escribir if (sdDisponible && sdAccesoEscritura) return true; else return false; }
6. Creamos un método que obtiene el flujo de la página web.
/** * Lee el flujo de entrada de una página * @param in El flujo de entrada * @return El contenido de la página */ private String leer(InputStream in) { BufferedReader reader = null; StringBuffer mibuffer = new StringBuffer(); try { reader = new BufferedReader(new InputStreamReader(in)); String line = ""; while ((line = reader.readLine()) != null) { Log.d("http",line); mibuffer.append(line); } } catch (IOException e) { Log.e ("Error", e.getMessage()); } finally { if (reader != null) { try { reader.close(); } catch (IOException e) { Log.e ("Error", e.getMessage()); } } } return mibuffer.toString(); }
7. Creamos el método que nos permite obtener el contenido de la página.
/** * Obtiene el contenido de una página * @param urlS * @return El contenido de la página */ private String ConectarJava (String urlS){ String pagina = null; HttpURLConnection conexion = null; try { URL destino = new URL(urlS); conexion = (HttpURLConnection) destino.openConnection(); pagina = leer(conexion.getInputStream()); } catch (Exception e) { Log.e ("Error", e.getMessage()); } finally { if (conexion != null) conexion.disconnect(); } return pagina; }
8. Y finalmente el método que nos va a permitir guardar el contenido de la página en la memoria externa del teléfono.
/** * Guarda un fichero con el contenido de la página * Mostrará por info si ha sido posible o no */ public void guardarPagina(){ if(comprobarMemoria()){ //Controla si podemos guardar en el fichero //Guarda el contenido de la página String tmpPagina = ConectarJava(url.getText().toString()); try { File ruta_sd = Environment.getExternalStorageDirectory(); File f = new File(ruta_sd.getAbsolutePath(), nombre.getText().toString()); OutputStreamWriter fout = new OutputStreamWriter(new FileOutputStream(f)); fout.write(tmpPagina); fout.close(); } catch (Exception ex) { Log.e("Ficheros", "Error al escribir fichero a tarjeta SD"); } info.setText("Guardado con éxito"); } else{ info.setText("No tiene suficientes permisos para guardar el archivo"); } }
9. Darle los permisos necesarios para que se pueda conectar a internet además de escribir en memoria externa en el manifiesto de la aplicación.
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.ACDAT.ejercicio6" android:versionCode="1" android:versionName="1.0"> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/> <uses-permission android:name="android.permission.INTERNET"/> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-sdk android:minSdkVersion="8" android:targetSdkVersion="15" /> <application android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <activity android:name=".MainActivity" android:label="@string/title_activity_main" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> </manifest>
Para aprender más:
Acceso a Internet a través de la actividad principal
El acceso a la web desde la hebra principal no es una buena práctica y desde la versión 3 de Android obtendremos un error a menos que especifiquemos los siguientes comandos en el método onCreate de la actividad principal:
StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
StrictMode.setThreadPolicy(policy);
Más información aquí.
Obtener el contenido de una página
HttpURLConnection
Esta es la clase estándar proporcionada por Java, lo que permite reutilizar código escrito en otras plataformas.
private String ConectarJava (String urlS){ String pagina = null; HttpURLConnection conexion = null; try { URL destino = new URL(urlS); conexion = (HttpURLConnection) destino.openConnection(); pagina = leer(conexion.getInputStream()); } catch (Exception e) { Log.e ("Error", e.getMessage()); } finally { if (conexion != null) conexion.disconnect(); } return pagina; } private String leer(InputStream in) { BufferedReader reader = null; StringBuffer mibuffer = new StringBuffer(); try { reader = new BufferedReader(new InputStreamReader(in)); String line = ""; while ((line = reader.readLine()) != null) { Log.d("http",line); mibuffer.append(line); } } catch (IOException e) { Log.e ("Error", e.getMessage()); } finally { if (reader != null) { try { reader.close(); } catch (IOException e) { Log.e ("Error", e.getMessage()); } } } return mibuffer.toString(); }
Más información aquí.
FIN
Gracias, me fue muy útil.
ResponderEliminarpor que cuando pongo otra pagina que no sea esa me manda el explorador :/
ResponderEliminarno hace la búsqueda ,me da la opción de completar acción utilizando otro explorador pero el sistema no reconoce esta aplicación como explorador web,¿alguna sugerencia?
ResponderEliminarpene
ResponderEliminar