Bienvenidos sean a este post, hoy hablaremos sobre BroadcastReceiver (receptor de anuncios) el cual es el encargado de recibir y actuar sobre los mensajes que llegan de tipo broadcast, este tipo de mensajes algunos son generados por el S.O como puede ser un aviso de bateria baja o de llamada entrante pero como hemos visto en uno de los posts anteriores nuestras aplicaciones pueden enviar mensajes de broadcasts.

Anuncios

La ventaja de trabajar con este tipo de mensajes o anuncios, es que se envia y recibe por medio de intencion, permitiendo describir el evento o la accion que ha ocurrido y tambien adjuntar informacion adicional.

Los receptores de anuncios no tienen interfaz de usuario pero pueden iniciar una actividad o enviar una notificacion al usuario, el ciclo de vida es simple solo dispone del metodo onReceive(), este este objeto solo existe durante la llamada al metodo y una vez finalizada se destruye al mismo.

Este metodo es creado en el hilo principal de la aplicacion pero en caso de ejecutar una accion que puede bloquear al sistema esta debera ser ejecutada en un hilo secundario, ahora si necesitamos una accion persistente en el tiempo deberemos utilizar un servicio, tal como vimos en el post de IntentService, desde BroadcastReceiver no podremos mostrar un cuadro de dialogo o unirse a un servicio (bindService()). Para solucionar estos inconvenientes podriamos lanzar una notificacion para el primer caso y para el segundo caso se puede usar el startService(). Las dos formas de registrar un servicio puede ser por: AndroidManifest.xml o por el metodo registerReceiver() como vimos en el post de IntentService, a continuacion veremos como registrarlo por medio de AndroidManifest.xml.

Para entender un poco mejor el como manejarlo por medio de este archivo hagamos el siguiente ejemplo. Para ello abramos Android Studio y creemos un nuevo proyecto con los siguientes datos:

  • Application Name: LlamadaEntrante
  • Domain Company: example.org
  • Minimum API SDK (Phone and Tablet)14
  • Add an ActivityEmpty Activity

Una vez creada nuestra app procederemos a modificar nuestro archivo AndroidManifest.xml donde agregaremos algunas lineas, el siguiente bloque debera ser agregado dentro del bloque application:

<receiver android:name="ReceptorLlamadas">
    <intent-filter>
        <action
            android:name="android.intent.action.PHONE_STATE" />
    </intent-filter>
</receiver>

Este bloque se encargara de crear el receptor de anuncios, el cual estara relacionado con una clase que aun no existe llamada ReceptorLlamadas, observen como utilizamos un filtro de intentos y relacionamos una accion para permitirnos ver el estado de nuestro telefono, nuestra siguiente modificacion en este archivo sera:

<uses-permission
    android:name="android.permission.READ_PHONE_STATE" />
Anuncios

Esta linea nos concedera el permiso para poder ver el estado de nuestro dispositivo, es decir concedera los permisos para poder ejecutar la accion antes configurada, nuestro archivo AndroidManifest.xml quedara de la siguiente forma:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="org.example.llamadaentrante">

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action
                    android:name="android.intent.action.MAIN" />

                <category
                    android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    <receiver android:name="ReceptorLlamadas">
        <intent-filter>
            <action
                android:name="android.intent.action.PHONE_STATE" />
        </intent-filter>
    </receiver>
    </application>
    <uses-permission
        android:name="android.permission.READ_PHONE_STATE" />
</manifest>

Nuestro siguiente paso sera crear una nueva clase, para ello haremos click con el boton derecho sobre el contenedor y selecciona New -> Java Class, aparecera un nuevo cuadro donde solo modificaremos el campo Name con el valor ReceptorLlamadas, el resto debe quedar como aparece, pulsen Ok para crear la nueva clase, una vez creada modificaremos a su codigo con el siguiente:

package org.example.llamadaentrante;

import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.support.v4.app.NotificationCompat;
import android.telephony.TelephonyManager;
import android.util.Log;

public class ReceptorLlamadas extends BroadcastReceiver {

    @Override
    public void onReceive(Context contexto, Intent intento){
        String estado = "", numero ="";
        Bundle extras = intento.getExtras();
        if (extras!=null) {
            estado = extras.getString(TelephonyManager.EXTRA_STATE);
            if (estado.equals(TelephonyManager.EXTRA_STATE_RINGING)){
                numero = extras.getString(
                        TelephonyManager.EXTRA_INCOMING_NUMBER);
                String info = estado + " " + numero;
                Log.d("ReceptorAnuncio",info+" intento=" + intento);
                NotificationManager nm = (NotificationManager) contexto.
                        getSystemService(Context.NOTIFICATION_SERVICE);
                NotificationCompat.Builder notificacion = 
                        new NotificationCompat.Builder(contexto)
                        .setSmallIcon(R.mipmap.ic_launcher)
                        .setContentTitle("Llamada Entrante")
                        .setContentText(info)
                        .setWhen(System.currentTimeMillis());
                PendingIntent intencionPendiente = PendingIntent.getActivity(
                        contexto,0,
                        new Intent(contexto,MainActivity.class),0);
                notificacion.setContentIntent(intencionPendiente);
                notificacion.setAutoCancel(true);
                nm.notify(1,notificacion.build());
            }
        }
    }
}
Anuncios

En este caso tendremos un metodo para sobreescribir a onReceive(), tendremos dos variables una llamada contexto y otra intento, despues crearemos dos variables de tipo String llamadas estado y numero donde no tendran ningun valor, despues habra un objeto llamado extras, el cual recibira los datos de la intencion, despues veremos si extras es distinto de null almacenara en estado el estado del dispositivo, despues chequeara si estado es igual a RINGING, si es verdad asigna el numero entrante a numero, luego crearemos una variable llamado info donde le asignaremos los valores de estado y numero, luego asignara al log los datos para hacer un seguimiento, nuestro siguiente paso sera crear un objeto de tipo NotificationManager llamado nm, donde le asignaremos el servicio de notificacion (NOTIFICATION_SERVICE), luego crearemos un mensaje de notificacion por medio de NotificationCompat, en este caso usaremos a builder y crearemos un objeto llamado notificacion, en este caso no solo lo construiremos sino ademas setearemos el icono, el titulo, el texto y cuando esta siendo llamado. Nuestro siguiente paso sera crear una intencion pendiente llamada intencionPendiente, la intencion sera sobre la clase MainActivity, nuestro siguiente paso sera setear el contenido de la intencion, luego le diremos que se auto cancele y por ultimo crearemos la notificacion, el primer digito es el id del mismo y luego la notificacion que creamos, con todo esto solo nos resta probarlo, podemos hacerlo por medio de un dispositivo fisico o por un emulador, si utilizamos la segunda opcion a continuacion les explicare como hacerlo.

Primero deberan clicquear sobre la opcion resaltada del emulador como se ve en la siguiente imagen

Una vez presionado aparecera el siguiente cuadro

Anuncios

En este cuadro deberan seleccionar la opcion Phone, a lo cual pasaremos al siguiente cuadro

Aca tienen dos opciones, dejan el numero que les aparece por defecto o lo modifican por alguno en particular, el siguiente paso sera apretar el boton Call Device y con esto comenzaremos a llamar a nuestro emulador, con esto explicado ahora si procedamos a probar nuestra app como se ve en el siguiente video

Como pueden ver en el video al entrar la llamada nos aparecera la opcion de poder ignorar o responder y en la notificacion nos quedara el registro de la llamada entrante con el estado (RINGING) y el numero que utilicemos para emular la llamada.

Anuncios

En resumen, hoy hemos visto que es y como es el receptor de anuncios, para que se utilizan, cual es el verdadero uso, hoy hemos visto como habilitarlo por medio de AndroidManifest.xml, un ejemplo de practica, hemos visto como utilizar el emulador de llamadas, hemos visto como nos notifica en la barra, espero les haya sido util sigueme en Twitter o Facebook para recibir una notificacion cada vez que subo un nuevo post en este blog, nos vemos en el proximo post.

Tambien podes donar

Es para mantenimiento del sitio, gracias!

$1.50

Anuncio publicitario