Añadir un Badge en Android (BadgeProvider)

¿Qué es un Badge?

badge_2

Es un pequeño contador ubicado normalmente en la parte superior derecha en los iconos de las aplicaciones. Generalmente se usa para cuantificar las tareas que el usuario tiene pendientes por hacer. Esta funcionalidad es habitual en iOS pero no en Android. En Android sólo ciertas marcas de móviles como son Samsung, Sony y Xiaomi entre otras son las que lo proporcionan. Esta “capa” la proporciona una aplicación de sistemas que viene preinstalada en estas plataformas y que aportan una capa visual a los iconos o launchers de las aplicaciones. Por lo que se puede decir que esta funcionalidad no es nativa y no funcionará en todos los dispositivos. Puesto que es una aplicación de sistema la que coloca o no el Badge en las aplicaciones, la única forma que tenemos de colocar un badge en nuestra aplicación es añadiéndolo directamente a la aplicación y será ésta la que modificará el contador.

¿Cómo añadimos un Badge a nuestra app?

La aplicación que gestiona todos los badges se llama BadgeProvider (puede cambiar en función del móvil y la versión de TouchWiz). Todo el código de esta entrada será útil para móviles Samsung y no se garantiza que funcione en otros dispositivos y su funcionamiento depende de los cambios que tenga BadgeProvider en sus posteriores versiones.

A continuación se detallan los pasos a seguir:

1.- Permisos

Es necesario añadir permisos de escritura y/o lectura de la aplicación a la que queremos acceder. En este caso serían:

1
2
uses-permission android:name="com.sec.android.provider.badge.permission.READ"
uses-permission android:name="com.sec.android.provider.badge.permission.WRITE"

2.- Estructura de la Base de Datos

La estructura de la tabla en Base de datos en la siguiente:

1
2
3
4
5
_id         --> Integer
package     --> text
class       --> text
badgecount  --> integer
icon        --> blob

3.- Consultar todos los Badges

Para consultar el Badge de las aplicaciones, es necesario el uso de un cursor para sacar la información de la Base de Datos.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
//- Esta es la Uri para poder acceder al content del BadgePrider
Uri uri = Uri.parse("content://com.sec.badge/apps");
 
Cursor c = getContentResolver().query(uri, null, null, null, null);
 
//- Si es null indica que o no estamos en un móvil que soporte este tipo de badge o simplemente que el content ha cambiado
if (c == null) {
    return;
}
 
try {
    if (!c.moveToFirst()) {
        // No results. Nothing to query
        return;
    }
 
    c.moveToPosition(-1);
    while (c.moveToNext()) {
        String pkg = c.getString(1);
        String class = c.getString(2);
        int badgeCount = c.getInt(3);
        Log.d("Badge", "package: " + pkg + ", class: " + class + ", count: " + badgeCount);
    }
} finally {
    c.close();
}

4.- Añadir un nuevo registro

Tenemos que especificar tanto el package de nuestra app, la main activity y el contador.

1
2
3
4
5
6
7
8
9
ContentValues cv = new ContentValues();
cv.put("package", getPackageName());
//- Nombre de la activity declarada en el manifest como android.intent.action.MAIN junto con la package de nuestra aplicación.
cv.put("class", "com.franlopez.pruebabadge.activities.TestActivity");
//- Entero con el número que queremos mostrar
cv.put("badgecount", 1);
 
//- Lanzamos el intent
getContentResolver().insert(Uri.parse("content://com.sec.badge/apps"), cv);

5.- Modificar un registro existente

Si queremos modificar el badge de nuestra aplicación sólo tenemos que actualizar el registro (si existe) en la BD de la aplicación.

1
2
3
ContentValues cv = new ContentValues();
cv.put("badgecount", 0);
getContentResolver().update(Uri.parse("content://com.sec.badge/apps"), cv, "package=?", new String[] {getPackageName()});

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos necesarios están marcados *

Puedes usar las siguientes etiquetas y atributos HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>