Mostrando entradas con la etiqueta Android. Mostrar todas las entradas
Mostrando entradas con la etiqueta Android. Mostrar todas las entradas

Alert de Javascript en un WebView (Vista Web) de Android

Para crear un contendor web en Android para una aplicación que hemos creado debemos usar la clase WebView y crearnos una vista en un fichero de configuración xml de Android. Sobre esto se puede encontrar mucha información en la web. Sin embargo, en este ejemplo, veremos como mostrar un "alert" que se realice mediante Javascript en las páginas que visitemos en el navegador que vamos a crear. También veremos como configurar algunas opciones del navegador como el zoom y cómo se habilita o deshabilita el código Javascript de las páginas visitadas. Al lío.

 Lo primero es crearnos la vista web y meterla en la carpeta /res/layout. Creamos un nuevo xml y le ponemos un nombre, en nuestro ejemplo: "web.xml". El contenido debe ser algo como esto:

<webview android:id="@+id/webview" 
android:layout_height="fill_parent" 
android:layout_width="fill_parent" 
xmlns:android="http://schemas.android.com/apk/res/android">
</webview>


Hasta aquí todo bien ¿no?. Queremos que ocupe toda la pantalla (los dos fill_parent). Vamos a ver la clase que extiende de Activity:

package com.prueba;

import android.app.Activity;
import android.app.AlertDialog;
import android.os.Bundle;
import android.webkit.JsResult;
import android.webkit.WebChromeClient;
import android.webkit.WebSettings;
import android.webkit.WebView;
import android.webkit.WebViewClient;

public class VistaWeb extends Activity
{
    WebView mWebView;
        
    public void onCreate(Bundle savedInstanceState) 
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.web);
        

        
        mWebView = (WebView) findViewById(R.id.webview);
        mWebView.getSettings().setJavaScriptEnabled(true);
        WebSettings webSettings = mWebView.getSettings();
        webSettings.setSupportZoom(true);
        webSettings.setBuiltInZoomControls(true);
        
        //Esta es la url que vamos a cargar en este caso un html en local:
        mWebView.loadUrl("file:///android_asset/prueba.html");   

        //Asignamos a la vista web el cliente (navegador)
        //que hemos creado como clase privada (ver más abajo
        //y que extiende del que trae Android por defecto. 
        //Esta clase maneja el navegador: 
        mWebView.setWebViewClient(new MiWebViewClient());

        //Asignamos a la vista web la clase MiWebViewClient 
        //que hemos creado como clase privada (ver más abajo)
        //y que extiende del que trae Android por defecto.
        //Esta clase permite controlar los eventos que se producen
        //en el navegador:
        mWebView.setWebChromeClient(new MiWebCromeClient());
    }
   
    //Extendemos el navegador por defecto
    private class MiWebViewClient extends WebViewClient 
    {
        @Override
        public boolean shouldOverrideUrlLoading(WebView view, String url) 
        {
            view.loadUrl(url);
            return true;
        }
    }
    
    //Con esta clase controlamos algunos eventos javascript del navegador
    final class MiWebCromeClient extends WebChromeClient 
    {
        @Override
        public boolean onJsAlert(WebView view, String url, String message, JsResult result) 
        {
            new AlertDialog.Builder(view.getContext()).setMessage(message).setCancelable(true).show();
            result.confirm();
            return true;
        }       
     }
}

Con esto ya podemos usar un alert de Javascript en la página web que mostramos en la vista web del navegador de nuestro Android. En el ejemplo propuesto, dentro del código de "prueba.html" podemos incluir alertas Javascript.

Eso es todo de momento.

Un saludo!
spacer

Iniciar un servicio en Android al encender el teléfono

Buenas,

En esta entrada voy a recordar cómo se crea e inicia un servicio en Android cuando arrancamos el sistema. Lo dejo por si a alguien le sirve y me vendrá muy bien para que no se me olvide.

Un servicio es un proceso que se ejecuta en segundo plano y no necesita de una interfaz para hacerlo. Lo que pretendemos es que se ejecute al iniciar el sistema Android.

Cuando un sistema Android se inicia hace una llamada a un procedimiento "broadcast" que avisa a todos los demás procesos de que el sistema se ha iniciado: android.intent.action.BOOT_COMPLETED. Lo que hacemos es crear una clase que "escuche" esta llamada e inicie nuestro servicio. La clase que es capaz de escuchar estas llamadas broadcast es BroadcastReceiver. Por tanto, lo primero es crear una clase que extienda de la clase anterior:
public class IniciadorServicio extends BroadcastReceiver
{
    @Override
    public void onReceive(Context context, Intent intent) 
    {
        Intent servicio = new Intent();
        servicio.setAction("MiServicio");
        context.startService(servicio);
    }
}

Al método startService le pasamos el Intent servicio, que es el servicio que queremos ejecutar, cuyo nombre será MiServicio:

public class Servicio extends Service
{
    private static final String TAG = "EjemploServicio";
     private Timer timer;
 
    @Override
    public IBinder onBind(Intent intent) 
    {
        return null;
    }
 
    @Override
    public void onCreate()
    {
        super.onCreate();
        Log.d(TAG, "El servicio se ha creado");
        timer = new Timer();
    }
 
    @Override
    public void onStart(final Intent intent, final int startId)
    {
        super.onStart(intent, startId);
        timer.scheduleAtFixedRate(new TimerTask() 
        {
            @Override
            public void run() 
            {
                Log.i(TAG, "Ejecutando la tarea del servicio");
            }
        }, 0, 30000);
    }
}

Lo que hace nuestro servicio es sencillo, al crearse inicializamos un Timer para ejecutar una tarea cada cierto tiempo. Cuando comienza el servicio, en el método onStart configuramos el Timer creado indicando lo que debe hacer (en esta caso imprime en el log del emulador "Ejecutando la tarea del servicio") cada 30 segundos.

Finalmente, tenemos que configurar el manifiesto del servicio registrando el IniciadorServicio y el propio servicio MiServicio:

 <manifest android:versioncode="1" android:versionname="1.0" package="foo.bar"   
 xmlns:android="http://schemas.android.com/apk/res/android">  
   <application>  
     <service android:name=".MiServicio">  
       <intent-filter>  
         <action android:name="MiServicio">  
       </action></intent-filter>  
     </service>  
     <receiver android:name=".IniciadorServicio">  
       <intent-filter>  
         <action android:name="android.intent.action.BOOT_COMPLETED">  
       </action></intent-filter>  
     </receiver>  
   </application>  
   <uses-sdk android:minsdkversion="3">  
   <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED">  
 </uses-permission></uses-sdk></manifest>  

Lo que hacemos en el manifiesto es registrar el servicio MiServicio y registrar el tipo de señal que espera nuestro IniciadorServicio para ejecutarse. También indicamos que nuestro servicio requiere permisos para conocer cuando se ha iniciado el sistema (linea 15).
spacer