Como programar un Webview

Objetivo:

Vamos a aprender a crear nuestro primer Webview.

Hay varias formas de hacerlo, pero nos centraremos en la más simple, dando una pautas al final con configuraciones mas avanzadas.

Vemos un resultado final antes.

Ejemplo Webview por tutorialandroid

 

Código fuente java (/src/com.webview/Principal.java):

[sourcecode language=”java”]
package com.webview;

//importaciones necesarias
import android.app.Activity;
import android.os.Bundle;
import android.webkit.WebView;

public class Principal extends Activity {

//Nuestra vista necesaria para la web
private WebView mWebView;

@Override
public void onCreate(Bundle icicle) {
super.onCreate(icicle);
setContentView(R.layout.main);

//asociamos
mWebView = (WebView) findViewById(R.id.webview);

//cargo un .html que he situado en la carpeta asset/ del proyecto
mWebView.loadUrl("file:///android_asset/ejemploWebview.html");
}

}
[/sourcecode]

 

Código fuente XML (/res/layout/main.xml):

[sourcecode language=”xml”]
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>

<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="Aplicacion ejemplo de un Webview"
android:padding="4dip"
android:textSize="16sp"
/>

<WebView
android:id="@+id/webview"
android:layout_width="fill_parent"
android:layout_height="0dip"
android:layout_weight="1"
/>

</LinearLayout>
[/sourcecode]

 

Código fuente HTML (/asset/ejemploWebview.html):

[sourcecode language=”html”]
<html>

<!– Los estilos se proyectarán a nuestra aplicacion –>
<body style="text-align:center">

<strong> Ejemplo Webview, Por TutorialAndroid.com </strong> <br>

<p>Este es un ejemplo de p&aacute;gina web
con texto e im&aacute;genes y links.</p>

<!– Enlace con una imagen de Androide-Feeds –>
<a href="http://www.tutorialandroid.com/feed/">
<img src="http://www.tutorialandroid.com/androidFeed_.png"
height="128" width="128" border="0" alt="RSS"
title="http://www.tutorialandroid.com/feed/"></a>

<p>Link a la web
<a href="http://www.tutorialandroid.com">tutorialandroid.com</a></p>

</body>

</html>

[/sourcecode]

 

Descárgate el código aquí

 

Opciones más avanzadas:

  • Visionar una web situada en internet (y no en nuestro proyecto).
    Para ello debemos sustituir la ruta de carga de la Url por la deseada en el código Java:
    [sourcecode language=”java”]
    mWebView.loadUrl("http://www.tutorialandroid.com");
    [/sourcecode]

    Y no se puede olvidar proporcionar de conexión a internet a la aplicacion en el Manifest.xml (como hijo del tag <manifest>):

    [sourcecode language=”java”]
    <uses-permission android:name="android.permission.INTERNET" />
    [/sourcecode]

  • Permitir más compatibilidad con componentes, tal y como Javascript, simulación de cliente Chrome,  o aparición de un zoom en caso de ser necesario.
    En este caso debemos añadir el siguiente código al método onCreate:
    [sourcecode language=”java”]
    webSettings.setSavePassword(false);
    webSettings.setSaveFormData(false);
    webSettings.setJavaScriptEnabled(true);
    webSettings.setSupportZoom(false);
    mWebView.setWebChromeClient(new MyWebChromeClient());
    mWebView.addJavascriptInterface(new DemoJavaScriptInterface(), "demo");
    [/sourcecode]
    Y definimos una clase, dentro de la nuestra (Principal.java):
    final class DemoJavaScriptInterface {

    [sourcecode language=”java”]
    final class DemoJavaScriptInterface {

    DemoJavaScriptInterface() {
    }

    /**
    * No es llamada en la interfaz. Crea un runnable para invocar
    * loadUrl en la hebra de la interfaz.
    */
    public void clickOnAndroid() {
    mHandler.post(new Runnable() {
    public void run() {
    mWebView.loadUrl("javascript:wave()");
    }
    });

    }
    }

    /**
    * "alerta" para javascript. Util para depurar javascript.
    */
    final class MyWebChromeClient extends WebChromeClient {
    @Override
    public boolean onJsAlert(WebView view, String url, String message, JsResult result) {
    result.confirm();
    return true;
    }
    }
    [/sourcecode]

Como programar un Context Menu

Objetivo:

Vamos a aprender a crear nuestro primer Context Menu a partir de pulsar un botón.

Se van a ver en concreto dos formas de aparecer el Context Menu:

Al dejar pulsado un botón (es como normalmente aparece un Context Menu)

Al pulsar normal el botón (modificamos el comportamiento para que en este caso también aparezca)

Ejemplo Context Menu Android

Aprendiendo Context Menu Android 2

 

 

 

 

 

 

 

 

 

 

 

 

Código fuente java (Principal.java):

[sourcecode language=”java”]
import android.app.Activity;
import android.os.Bundle;
import android.view.ContextMenu;
import android.view.MenuItem;
import android.view.View;
import android.view.ContextMenu.ContextMenuInfo;
import android.widget.Button;
import android.widget.Toast;

public class Principal extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);

//al Boton_01 le damos el comportamiento normal con
//registerForContextMenu, y al pulsar largamente sale el ContextMenu
Button btn = (Button) findViewById(R.id.button_example);
registerForContextMenu(btn);

//el boton 2, es un boton especial. A diferencia del boton 1,
//haremos que el ContextMenu aparezca al pulsar normalmente el botón
Button btn2 = (Button) findViewById(R.id.button_example2);

}

/**
* Se crea el Context Menu, añadiendo las opciones deseadas
* @param ContextMenu
* @param View
* @param ContextMenuInfo
*/
@Override
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) {
super.onCreateContextMenu(menu, v, menuInfo);
menu.setHeaderTitle("Context Menu");
menu.add(0, v.getId(), 0, "Action 1");
menu.add(0, v.getId(), 0, "Action 2");
}

/**
* Se definen las funciones que se llamarán al pulsar las
* opciones del Context Menu
* @param MenuItem
*/
@Override
public boolean onContextItemSelected(MenuItem item) {
if (item.getTitle() == "Action 1") {
function1(item.getItemId());
}else if (item.getTitle() == "Action 2") {
//function2(item.getItemId());
return true; //pulsando sobre ella salgo
}else{
return false;
}
return true;
}

/**
* Se definen las acciones que se realizan al pulsar la Accion1 en
* del Context Menu.
* En este caso, como ejemplo, damos un mensaje en pantalla
* @param int
*/
public void function1(int id) {
Toast.makeText(this, "Accion 1 llamada", Toast.LENGTH_SHORT).show();
}

/**
* Se definen las acciones que se realizan al pulsar la Accion2 en
* del Context Menu.
* En este caso, como ejemplo, damos un mensaje en pantalla
* @param int
*/
public void function2(int id) {
Toast.makeText(this, "Accion 2 llamada", Toast.LENGTH_SHORT).show();
}

/**
* Funcion auxiliar que se utiliza para el boton2 solamente.
* Con ella conseguimos que al pulsar el boton2 de forma normal,
* aparezca el Context Menu.
* @param View
*/
public void funcionIniciarContextMenuParaBoton2(View v) {
registerForContextMenu(v);
openContextMenu(v);
}

}
[/sourcecode]

 

Código fuente XML (main.xml):

[sourcecode language=”xml”]
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="fill_parent"
android:layout_height="fill_parent">

<!– Texto Inicial para la aplicación –>
<TextView android:layout_width="fill_parent"
android:layout_height="wrap_content" android:text="Aprendiendo Context Menu" />

<!– Creacion boton1. Dejándolo pulsado aparecerá el Context Menu, pero eso
se define el en .java, no aquí –>
<Button android:text="Button01" android:id="@+id/button_example"
android:layout_width="wrap_content" android:layout_height="wrap_content"></Button>

<!– Creacion boton2. Haciendo clic en él llamamos a la funcion que
inicializa el Context Menu manualmente –>
<Button android:text="Button02" android:id="@+id/button_example2"
android:onClick="funcionIniciarContextMenuParaBoton2"
android:layout_width="wrap_content" android:layout_height="wrap_content"></Button>

</LinearLayout>
[/sourcecode]

 

Descárgate el código aquí

Utilizar el led de la camara como linterna

Objetivo:

Programar un botón para controlar el led de la cámara y poder utilizarlo como linterna.

Logística adicional necesaria:

Para poder probarlo necesitaremos un móvil con led en la cámara, ya que el emulador no muestra información al respecto.

Con este código podremos realizar el apagado y encendido del flash del móvil. Hay que tener en cuenta que el flash consume mucha batería, por lo que se recomienda no realizar un uso continuado del mismo.

Un ejemplo de aplicación creada a partir del código fuente siguiente, sería “Quick Light and Strobe”, donde se muestra una linterna, con posibilidad de cambios de color e incluso funcionar como estroboscopio.

Dejo un enlace de la misma de la misma en la seccion Aplicaciones Recomendadas

Código fuente java (principal.java):

[sourcecode language=”java”]
package com.ejemplo.linternaled;

import android.app.Activity;
import android.hardware.Camera;
import android.hardware.Camera.Parameters;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;

public class principal extends Activity {

Camera camera = null;
Parameters parameters;
Button FlashLightControl;

// Called when the activity is first created.
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);

//Creamos un boton con el texto adecuado
FlashLightControl = (Button)findViewById(R.id.flashcontrol);
FlashLightControl.setText("ENCENDER LED CAMARA");
}

/**
* Control LED Camera.
* Esta funcion se ejecuta al clickar el boton que hemos incluido
* @param arg0
*/
public void onClickLED(View arg0) {
try{
// Al pulsar, si el Led estaba encendido se apaga y viceversa
if(camera == null){
camera = Camera.open();
parameters = camera.getParameters();
parameters.setFlashMode(Parameters.FLASH_MODE_TORCH);
camera.setParameters(parameters);
FlashLightControl.setText("APAGANDO LED CAMARA");
}else{
parameters.setFlashMode(Parameters.FLASH_MODE_OFF);
camera.setParameters(parameters);
camera.release();
camera = null;
FlashLightControl.setText("ENCENDIENDO LED CAMARA");
}
}catch(Exception e){
//Control errores
}
}

/**
* Si al salir está el LED encendido, lo apagamos.
* Esta funcion es llamada cuando se cierra una aplicación.
*/
public void finish(){
if (camera != null){
parameters.setFlashMode(Parameters.FLASH_MODE_OFF);
camera.setParameters(parameters);
camera.release();
camera = null;
}
super.finish();
}
}
[/sourcecode]

Código fuente XML (main.xml):

[sourcecode language=”xml”]
<!–?xml version="1.0" encoding="utf-8"?–>

<!– Titulo de nuestra aplicacion –>

<!– Boton para encender o apagar el led de la camara –>
<button>

[/sourcecode]

Añadir el permiso necesario al AndroidManifest.xml :

[sourcecode language=”xml”]
<!– NECESARIO PARA EL LED FLASH –>

[/sourcecode]

Eclipse error: Could not find app.apk

Error:

Could not find app.apk!

donde app es el nombre de tu aplicación.

Causa:

Tras algún proceso (como actualización del SDK, por ejemplo), quedan “restos” o han sido borrados los autogenerados apk de los proyectos, por lo que se debe proceder a su limpieza.

Solución:

  1. Limpiar los proyectos para que Eclipse compile de nuevo:
    Eclipse -> Proyect -> Clean y selecciona todos los proyectos.
  2. Reinicia Eclipse.

 

Eclipse error: could not find adb.exe al actualizar el SDK de Android

Al actualizar el SDK de Android podemos encontrarnos con problemas en Eclipse.

Error:

Could not find adb.exe!

Causa:

El fichero adb.exe se ha movido de sitio, y en vez de encontrarse en “C:\android-sdk-windows\tools“, se encuentra en “C:\android-sdk-windows\platform-tools

Solución (Windows):

  1. Añadir la nueva ubicación de adb.exe al PATH:

    – Botón derecho en MiPC -> Propiedades -> Pestaña Opciones Avanzadas -> Botón Variables de entorno

    – En la lista de Variables del sistema, hacemos doble clic en la variable Path, y en Valor de la variable, agregamos al final de todos los valores que contiene, el siguiente texto:

    ; C:\android-sdk-windows\platform-tools

    Nota: es importante que tenga el punto y coma delante. Este directorio es el que ha creado por defecto el SDK de Android al ser instalado. Conviene revisarlo por si no fuera así ( y que esté situado por ejemplo, en C:\Archivos de programas)

  2. Actualización de los plugins de Eclipse:

    Eclipse -> Help -> Check for Updates y actualizar todo lo referente a Android.

 

Nota: tras este proceso reinicia Eclipse. Si al intentar ejecutar un proyecto en el entorno tal se da este error Could not find app.apk (donde app es tu aplicación), revisa la solución aquí