image


indigitall Android SDK


Índice

  1. Introducción
    1. Obtención del SDK de Indigitall
    2. Obtención del “App Token” de la aplicación
    3. Obtención del “Sender ID” y “Api Key” de la aplicación
    4. Obtención del archivo json de google services para la app
  2. Integración
    1. SDK de indigitall
      1. Importación mediante Gradle
      2. Importación mediante fichero .aar
    2. Configuración de Gradle
    3. Configuración de ProGuard
    4. Configuración de Android Manifest
  3. Uso del SDK
    1. Inicialización
    2. Ajustes
    3. Sincronización con el registro del dispositivo y obtención del deviceID
    4. Funciones disponibles
    5. Clases
    6. Mensajes push
    7. Capturar push
    8. Servicio de External Apps
    9. Notificaciones con GIF
  4. Change Log
  5. Actualizaciones en la implementación
    1. Cómo actualizar a la versión 4.2 desde versiones anteriores del SDK
  6. F.A.Q
  7. Contacto

1. Introducción

En este documento se muestra toda la información necesaria para realizar la integración del SDK de Indigitall en una aplicación desarrollada para dispositivos con el sistema operativo Android. En él se muestra todo lo necesario para integrar el SDK en una aplicación ya existente para poder utilizar los servicios que ofrece la plataforma indigitall.

Es importante consultar este manual antes de realizar el desarrollo y seguir todos los pasos que en él se indican para garantizar el correcto funcionamiento de la integración. El documento está dirigido a desarrolladores Android, por lo que se utilizará un lenguaje técnico y se mostrarán ejemplos de código fuente cuando sea necesario.

1.1. Obtención del SDK de Indigitall

El SDK se puede obteener mediante la configuración de gradle (opción que recomendamos y que se explica en el punto 2.1.1) o desde el siguiente enlace: SDK de indigitall para Android

Será necesario poseer el identificador único (App Token) para que la app, en la que se desea integrar el SDK, pueda realizar la comunicación con el entorno de Indigitall. Para recibir este identificador el desarrollador deberá proporcionar a Indigitall los datos necesarios para enviar las notificaciones (Sender ID y Api Key) obtenidos en de la herramienta FCM (Firebase Cloud Messaging) de Google.

1.2. Obtención del "App Token" de la aplicación

Cada aplicación registrada en el Panel de Control de Indigitall dispondrá de un identificador único denominado App Token. Este identificador se utilizará para inicializar el SDK y será el responsable de vincular la aplicación con la plataforma de indigitall, de esta forma indicará a qué aplicación pertenecen las notificaciones que lleguen al dispositivo. El App Token de una aplicación puede ser obtenido desde el Panel de Control de indigitall por un usuario administrador en el apartado de “Detalles” de la aplicación.

1.3. Obtención del “Sender ID” y “Api Key” de la aplicación

Anteriormente, para que la aplicación pudiera recibir notificaciones con la herramienta GCM de Google, se necesitaban unos identificadores llamados Sender ID y Api Key. Actualmente, con la nueva herramienta FCM de Google, estos parámetros son llamados “ID del remitente” y “Clave del servidor”, aunque seguiremos llamándolos Sender ID y Api Key para facilitar el trabajo a los usuarios que ya los tengan de GCM.

Estos identificadores se utilizarán en el SDK para conectar la herramienta GCM/FCM de Google con los dispositivos que instalen la aplicación.

En el siguiente enlace explicamos cómo obtener estos identificadores para GCM y FCM.

1.4 Obtención del archivo json de google services para la app

Para descargar el archivo de configuración de google-services, debes seguir los siguientes pasos:

  1. Entra en la consola de Firebase y abre tu proyecto.
  2. Presiona en el icono de Ajuste y selecciona la opción "Press in the settings icon and select "Configuración de Proyecto".

    project_configuration

  3. Añade tu app a Firebase. Desde la pestaña "General", presiona el botón que te mostramos en la siguiente imagen:

    add_firebase

  4. Registra la app en Firebase. Debes setear el nombre de paquete de tu app y el certificado de firma SHA-1 (este último es opcional) y presionar en "Registrar app".

    register_app

  5. Descarga el archivo google-services.json:

    download_json

Una vez tengas el archivo google-services.json, debes añadirlo a la carpeta de tu app, como se muestra en la imagen anterior.

2. Integración

2.1. SDK de indigitall

La librería de indigitall consiste en un fichero con extensión .aar que se ha de importar mediante la configuración de gradle o directamente al directorio ‘libs’ del proyecto (en caso de haber descargado el fichero .zip).

2.1.1 Importación mediante Gradle

build.gradle del proyecto ([project]/build.gradle):

buildscript {
...
dependencies {

    classpath 'com.google.gms:google-services:4.1.0'

    }
}
allprojects {
    repositories {
        mavenCentral()
    }
}

build.gradle del módulo ([project]/[app-module]/build.gradle):

dependencies {
    ...

    implementation 'net.indigitall:pushsdk:4.2.+'

    ...
}
apply plugin: 'com.google.gms.google-services'

2.1.2 Importación mediante fichero .aar

build.gradle del proyecto ([project]/build.gradle):

buildscript {
...
dependencies {

    classpath 'com.google.gms:google-services:4.1.0'

    }
}
allprojects {
    repositories {
            flatDir {
                    dirs 'libs'
            }
    }
}

build.gradle del módulo ([project]/[app-module]/build.gradle):

dependencies {
    ...

    implementation name: 'indigitall', ext: 'aar'

    ...
}
apply plugin: 'com.google.gms.google-services'

2.2. Configuración de Gradle

Para poder usar la librería de indigitall se debe configurar el proyecto para que la versión de compilación (compileSDKVersion) sea la 26 y añadir las siguientes librerías:

  • Librería de soporte v4 de Android (al menos en su versión 26.1.0).
  • Librería de Google Play Services en su versión 15.0.0 (mínimo los módulos ‘fcm’ y ‘location’).
  • Librería Okhttp de Square en su versión 3.6.0 (para las llamadas al servidor de indigitall).

Como esta versión del SDK da soporte a Android Oreo (Android 8, api 26) es necesario:

  • La versión de compilación del SDK de android (compileSDKVersion) este configurada a la versión 26.
  • La versión para la que se programa la app (targetSdkVersion)este configuradas a la versión 26.

Esta configuración normalmente se establece en el archivo build.gradle de la aplicación. El resultado final de este archivo debería ser parecido al siguiente ejemplo:

android {
    compileSDKVersion 26
    buildToolsVersion “27.0.3”

    defaultConfig {
        applicationId “net.indigitall.app”
        minSdkVersion 16
        targetSdkVersion 26
        versionCode 1
        versionName “1.0.0”    
        ...
    }    
    ...
}
...

dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])

    implementation 'net.indigitall:pushsdk:4.2.+'

    implementation 'com.android.support:support-v4:26.1.0'
    implementation 'com.google.firebase:firebase-messaging:17.3.2'
    implementation 'com.google.android.gms:play-services-location:15.0.1'
    implementation 'com.squareup.okhttp3:okhttp:3.6.0'
    ...
}
apply plugin: 'com.google.gms.google-services'

2.3. Configuración de ProGuard

Las aplicaciones que utilicen ProGuard deberán incluir la siguiente línea en su archivo de ProGuard para asegurar el correcto funcionamiento de la librería:

-dontwarn okio.**
-dontwarn com.squareup.**
-keep class com.squareup.** { *; }
-keep class net.indigitall.pushsdk.** { *; }

2.4. Configuración de Android Manifest

El siguiente paso es configurar el archivo AndroidManifest de la aplicación. En él se establecerán los permisos, servicios y receptores necesarios para recibir las notificaciones correctamente.

Para empezar hay que añadir los permisos necesarios para la correcta ejecución de la aplicación y la utilización de la librería de FCM. Los permisos a añadir son los siguientes:

<!-- Permisos Obligatorios -->
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.EXPAND_STATUS_BAR"/>
<uses-permission android:name="android.permission.BROADCAST_STICKY"/>
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
<uses-permission android:name="android.permission.VIBRATE"/>

<!-- Permisos Opcionales -->
<!--Permisos de Localización-->
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<!--Permisos de teléfono-->
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.CALL_PHONE"/>

Los permisos de localización y de telefonía son opcionales y se utilizan para traquear la posición del usuario y realizar llamadas respectivamente en caso de que se vayan a usar estas funciones de indigitall.

Para el correcto registro del dispositivo en FCM y la correcta recepción de notificaciones, es necesario declarar los siguientes servicios en el AndroidManifest.xml:

    <!--Servicio para recibir notificaciones de FCM-->
     <service android:name="net.indigitall.pushsdk.service.IndigitallMessagingService">
         <intent-filter>
             <action android:name="com.google.firebase.MESSAGING_EVENT"/>
         </intent-filter>
     </service>
    <!--Servicio para registrar el dispositivo en FCM-->
     <service
         android:name="net.indigitall.pushsdk.service.IndigitallInstanceIDService">
         <intent-filter>
             <action android:name="com.google.firebase.INSTANCE_ID_EVENT"/>
         </intent-filter>
     </service>

Es necesario declarar una serie de servicios dentro de la aplicación para que ésta pueda hacer un uso correcto de la librería de indigitall. Son los siguientes:

Servicios para Android 8 (Oreo):

    <!-- Servicios Android 8-->
    <service android:name="net.indigitall.pushsdk.service.IndigitallJobService"
     android:permission="android.permission.BIND_JOB_SERVICE"/>
    <service android:name="net.indigitall.pushsdk.service.LocationJobService"
     android:permission="android.permission.BIND_JOB_SERVICE"/>
    <service android:name="net.indigitall.pushsdk.service.GifJobService"
          android:permission ="android.permission.BIND_JOB_SERVICE"/>
    <!-- Fin servicios Android 8-->

Servicios para versiones inferiores a Android 8 (Oreo):

    <!-- Inicio servicios indigitall -->
    <service android:name="net.indigitall.pushsdk.service.IndigitallService"/>
    <service android:name="net.indigitall.pushsdk.service.NotificationService"/>
    <service android:name="net.indigitall.pushsdk.service.LocationService"/>
    <service android:name="net.indigitall.pushsdk.service.GifService"/>
    <!-- Fin servicios indigitall -->

También, como componentes de la aplicación, se debe declarar un BroadcastReceiver llamado IndigitallBroadcastReceiver (estos ya vienen implementados en la librería de Indigitall).

<!-- Inicio indigitall Receivers -->
<receiver android:name="net.indigitall.pushsdk.broadcast.IndigitallBroadcastReceiver"
    android:enabled="true"
    android:exported="true">
    <intent-filter>
        <action android:name="android.intent.action.BOOT_COMPLETED" />
        <category android:name="android.intent.category.DEFAULT" />
    </intent-filter>
</receiver>
<!-- Fin indigitall Receivers -->

3. Uso del SDK

Para poder utilizar la librería es necesario tener el APP_TOKEN de indigitall para la aplicación y darla de alta en el servicio FCM de Google para obtener el API_KEY y el SENDER_ID.

3.1 Inicialización

En el SDK el campo APPLICATION_ID corresponde al APP_TOKEN mencionado anteriormente.

El primer paso en el proceso de integración es obligatorio para llevar a cabo el registro del dispostivo y consiste en crear un archivo de configuración llamado indigitall_values.xml en (res/values/). Dentro deberá ir seteado el valor del SENDER_ID tal y como mostramos a continuación:

<?xml version="1.0" encoding="utf-8"?>
<resources>
        <!-- Cambiar por el Sender ID propio  -->
        <string name="indigitall_sender_id">999999999999</string>
</resources>

Tras esto tendremos dos formas de inicializar la librería, indicándole todos los parámetros en el constructor del objeto indigitall o añadiéndolos al archivo de configuración que creamos previamente. Veamos ambas posibilidades:

  1. Indicando todos los parámetros en el constructor:

    private static final String SENDER_ID = "999999999999";
    private static final String APPLICATION_ID = "99961644752e0e8e1e1f4d2.95374830";
    private static final String MAIN_CLASS_NAME = “MainActivity”;
    private static final String USE_EXTERNAL_APPS = false;
    
    Indigitall indigitall = new Indigitall(MainActivity.this, SENDER_ID,
        APPLICATION_ID, MAIN_CLASS_NAME, USE_EXTERNAL_APPS);
  2. Indicando todos los parámetros en un fichero de configuración (res/values/indigitall_values.xml):

    <?xml version="1.0" encoding="utf-8"?>
    <resources>
            <!-- Cambiar por el Sender ID propio -->
            <string name="indigitall_sender_id">999999999999</string>
            <!-- Cambiar por el token de la app proporcionado por indigitall -->
            <string name="indigitall_application_id">99961644752e0e8e1e1f4d2.95374830</string>
            <!-- Cambiar por el nombre de su paquete -->
            <string name="indigitall_app_package_name">net.indigitall.app</string>
            <!-- Cambiar por el nombre de su Activity principal -->
            <string name=”indigitall_main_class_name”>MainActivity</string>
            <!-- Cambiar a true en caso de utilizar esta funcionalidad -->
            <string name=”indigitall_use_external_apps”>false</string>
    </resources>
  3. Ahora solo habrá que inicializar el SDK de Indigitall en el constructor:
Indigitall indigitall = new Indigitall(ActivityMain.this); // Llamar si se usa el recurso xml
indigitall.initialize();

De las dos maneras anteriores, la librería obtendrá el contexto de la aplicación, el sender_id y el application_id proporcionado una vez dado de alta nuestra aplicación en Indigitall.

La llamada a indigitall.initialize() es la que arranca todo el proceso de autentificación contra el servicio FCM y la plataforma de Indigitall, además de arrancar los servicios que cada cierto tiempo, mandarán al servidor posición, código postal, aplicaciones instaladas etc.

3.2 Ajustes

Una vez hemos realizado el proceso anterior, disponemos de nuestro propio objeto indigitall, el cual nos permite cambiar algunos de los ajustes de la librería. Podemos indicarle el icono de nuestra aplicación para visualizarlo en las notificaciones, el icono para la barra de notificaciones que aparece en Android 5.0 o superior y el color que queremos que tenga este último icono en las notificaciones. Podemos establecer estos parámetros de la siguiente manera:

indigitall.setIcon(R.drawable.your_icon_push);
indigitall.setSmallIcon(R.drawable.your_icon_5_0);
indigitall.setSmallIconColor(“#FF6600”);

A partir de Android 5.0 las notificaciones llevan 2 iconos, uno normal (que suele ser el propio de la aplicación) y otro icono monocromo (hecho en blanco y transparente) que será el que se muestre en la barra de notificaciones y en la propia notificación, pudiendo establecerse un color para el fondo de este icono desde Android 5.0 o para el propio icono a partir de Android 7.0. Puede ver cómo aparecerá en nuestro Especificaciones de diseño

3.3 Sincronización con el registro del dispositivo y obtención del deviceID

Para evitar posibles conflictos con el registro del dispositivo, como realizar acciones que requieran el deviceId del dispositivo (que se genera durante el registro), Indigitall provee de un listener que permite saber cuando dicho registro se ha completado.

  Indigitall indigitall = new Indigitall(ActivityMain.this);
  ...

  indigitall.setReadyListener(new ReadyListener() {
          @Override
          public void onReady(DataModel data) {
              // Obtención del deviceId
              String deviceID = data.getDeviceID();
          }
      });
  ...

  indigitall.initialize();

3.4 Funciones disponibles

Indigitall provee de una serie de métodos para las aplicaciones que hagan uso de la librería. Estos métodos ofrecen funcionalidades que van desde poder suscribirse y manejar Tags hasta operaciones para habilitar o deshabilitar el dispositivo.

Los Tags han de estar previamente creados en el panel para poder listarlos, suscribirse o desinscribirse de ellos.

Los métodos disponibles en la clase Indigitall son los siguientes:

/**
 * Comprueba el estado del dispositivo para saber si recibe o no notificaciones.
 * Implementar #DeviceStatusListener.onChangeDeviceStatus(isDisabled);
 */
void checkDeviceStatus(Context context);

/**
 * Habilita el dispositivo para que le lleguen notificaciones.
 * Implementar #DeviceStatusListener.onChangeDeviceStatus(isDisabled);
 */
void enableDevice(Context context);

/**
 * Desahabilita el dispositivo para que no le lleguen notificaciones.
 * Implementar #DeviceStatusListener.onChangeDeviceStatus(isDisabled);
 */
void disableDevice(Context context);
/**
 * Comprueba si el SDK esta habilitado o no para enviar localización.
 */
boolean checkLocationStatus(Context context);
/**
 * Habilita la localización para que el SDK la envíe.
 */
void enableLocation(Context context);
/**
 * Desahabilita la localización para que el SDK no la envíe.
 */
void disableLocation(Context context);

/**
 * Pide la lista de tags creados en el panel.
 * Implementar #TagsListener.onGetTagsList(tagsList);
 */
void tagsList(Context context);

/**
 * Pide la lista de tags a los que está suscrito el dispositivo.
 * Implementar #TagsListener.onGetTagsSubscriptions(tagsList);
 */
void tagsSubscriptions(Context context);

/**
 * Suscribe el dispositivo a una lista de tags.
 * Implementar #TagsListener.onGetTagsSubscribe(wasSubscribed);
 */
void tagsSubscribe(Context context, ArrayList<TagModel> tags);

/**
 * Desinscribe el dispositivo a una lista de tags.
 * Implementar #TagsListener.onGetTagsUnsubscribe(wasUnsubscribed);
 */
void tagsUnsubscribe(Context context, ArrayList<TagModel> tags);

/**
 * Devuelve el identificador único de indigitall por dispositivo.
 */
String getDeviceID();

/**
 * Establece el DeviceStatusListener en la clase Indigitall.
 */
void setDeviceStatusListener(DeviceStatusListener listener);

/**
 * Establece el TagsListener en la clase Indigitall.
 */
void setTagsListener(TagsListener listener);

/**
 * Establece el ReadyListener en la clase Indigitall.
 */
void setReadyListener(ReadyListener readyListener);

El método getDeviceID puede devolver un valor nulo la primera vez que se ejecuta la librería si aún no ha dado tiempo a que se genere.

3.5 Clases

La librería de indigitall proporciona una serie de clases para hacer más cómoda la interacción con ésta y facilitar la recogida e introducción de datos.

Estas clases se dividen en dos grupos (Objetos y Listeners) y son los siguientes:

/**
 * Objeto que recoge datos del dispositivo
 */
net.indigitall.pushsdk.model.DataModel {
    // Recoge el identificador único de dispositivo de indigitall.
    String getDeviceID();
    // Recoge la versión de la librería de indigitall.
    String getvLibrary();
    // Recoge el número de versión del SDK de Android.
    String getvAndroidSDK();
    // Recoge el código de la versión de Android.
    String getvAndroidCode();
    // Recoge el nombre de la versión de Android.
    String getvAndroidName();
    // Recoge el nombre del fabricante.
    String getBrandName();
    // Recoge el nombre del modelo.
    String getModelName();
    // Recoge el código del dispositivo.
    String getDeviceCode();
    // Recoge el nombre de la compañía si tiene permisos de telefonía.
    String getCarrierName();
}

/**
 * Objeto que recoge los datos de las Push enviadas.
 */
net.indigitall.pushsdk.model.PushModel {
    // Usado para recoger la push del Intent en la Activity principal.
        static final String PUSH_EXTRA;

    // Devuelve el identificador de la push.
    int getId();
    // Devuelve el tipo de la push.
    int getType();
    // Devuelve el subtipo de la push.
    int getSubtype();
    // Devuelve el título de la push.
    String getTitle();
    // Devuelve el cuerpo de la push.
    String getBody();
    // Devuelve la URL del icono de la push si se ha establecido.
    String getIconURL();
    // Devuelve la URL de la imagen de la push si se ha establecido.
    String getImageURL();
    // Devuelve la URL del GIF de la push si se ha establecido.
    String getGifURL();
    // Devuelve los datos de la push enviados a la app si se han establecido.
    String getData();
    // Devuelve la descripción de la campaña a la que pertenece la push si se ha establecido.
    String getDescCampaign();

}

/**
 * Objeto que recoge o establece los datos de los Tags para manejarlos.
 */
net.indigitall.pushsdk.model.TagModel {
    // Devuelve el identificador del tag.
    String getId();
    // Establece el identificador del tag.
    void setId(String id);
    // Devuelve el nombre del tag.
    String getName();
    // Establece el nombre del tag.
    void setName(String name)
    // Devuelve el padre del tag.
    String getParent();
    // Establece el padre del tag.
    void setParent(String parent);
    // Devuelve si el dispositivo se ha suscrito al tag.
    boolean isSubscribe();
    // Establece si el dispositivo se ha suscrito al tag.
    void setSubscribe(boolean subscribe);
}

/**
 * Listener que controla el estado del dispositivo para recibir notificaciones.
 * Tipo: interface.
 */
net.indigitall.pushsdk.listeners.DeviceStatusListener {
    // Método llamado cuando se recibe el estado del dispositivo.
    void onChangeDeviceStatus(boolean isDisabled);
}

/**
 * Listener que controla el manejo de los Tags.
 * Tipo: interface.
 */
net.indigitall.pushsdk.listeners.TagsListener {
    // Método llamado cuando se recibe el listado de tags de la aplicación.
    void onGetTagsList(ArrayList<TagModel> tagList);
    // Método llamado cuando se reciben los tags a los que está suscrito el dispositivo.
    void onGetTagsSubscriptions(ArrayList<TagModel> tagList);
    // Método llamado cuando se suscribe el dispositivo a uno o varios tags.
    void onSubscribe(boolean wasSubscribed);
    // Método llamado cuando se desinscribe el dispositivo de uno o varios tags.
    void onUnsubscribe(boolean wasUnsubscribed);
}

/**
 * Listener que controla la sincronización con el registro.
 * Tipo: interface.
 */
net.indigitall.pushsdk.listeners.ReadyListener {
    // Método llamado cuando se termina el registro del dispositivo.
    void onReady(DataModel data);
}

3.6 Mensajes push

Una vez que hemos realizado todo el proceso de registro e inicialización, la aplicación se encuentra en disposición de recibir los mensajes push, la librería se encargará de tratar los mensajes y mostrar las notificaciones adecuadas. La aplicación tendrá la posibilidad de recoger los datos de los mensajes push cuando se envíen notificaciones de tipo “Abrir App”.

La forma de recoger estos datos es gracias al Intent recibido por la Activity principal en los métodos onCreate y/o onResume de la siguiente forma:

PushModel push = null;
Intent intent = getIntent();
if (intent != null) {
    if (intent.hasExtra(PushModel.PUSH_EXTRA)) {
        intent.setExtrasClassLoader(PushModel.class.getClassLoader());
        push = intent.getParcelableExtra(PushModel.PUSH_EXTRA);
    }
}

3.7 Capturar Push

En caso de quere capturar todos lo mensajes push que lleguen a la aplicación, el SDK de indigitall cuenta con un BroadcastReceiver que podrá sobreescribir y que se levantará cada vez que llegue una push. El PushBroadcastReceiver discriminará entre push de indigitall u otro servicio de notificaciones aportando un método a sobreescribir para cada caso.

Deberá sobreescribir y declarar el nuevo BroadcastReceiver de la siguiente forma:

// En la nueva clase que llamaremos SampleBroadcast.java
public class SampleBroadcast extends PushBroadcastReceiver {
    @Override
    public void onIndigitallPushReceived(PushModel push) {
        Log.d("SampleBroadcast", "IndigitallPush");
    }

    @Override
    public void onOtherPushReceived(Bundle data) {
        Log.d("SampleBroadcast", "OtherPush");
    }
}
<!-- En el AndroidManifest.xml -->
<receiver android:name=".SampleBroadcast"
    android:enabled="true">
    <intent-filter>
        <action android:name="net.indigitall.action.PUSH_INDIGITALL"/>
        <action android:name="net.indigitall.action.PUSH_OTHER"/>
    </intent-filter>
</receiver>

3.8 Servicio de External Apps

El servicio de external Apps permite enviar notificaciones en función de si el usuario tiene o no instalada una determinada aplicación. Para ello es necesario que queden definidas en el panel las aplicaciones que se desean comprobar.

Para poder activar el servicio de externalApps en Android será necesario:

  • Dependiendo de la forma de inicializar la librería:

    1. Si para inicializar la librería del SDK utilizamos constantes y se las pasamos al constructor, poner la constante USE_EXTERNAL_APPS a true:

        ...
        private static final String USE_EXTERNAL_APPS = true;
        ...
        Indigitall indigitall = new Indigitall(MainActivity.this, SENDER_ID,
            APPLICATION_ID, MAIN_CLASS_NAME, USE_EXTERNAL_APPS);
    2. Si para inicializar la librería del SDK utilizamos el fichero .xml, poner el indigitall_use_external_apps a true en el fichero de configuración (res/values/indigitall_values.xml):

        <?xml version="1.0" encoding="utf-8"?>
        <resources>
                ...
                <string name=”indigitall_use_external_apps”>true</string>
                ...
        </resources>
  • Tener definidas en el panel los packages de las aplicaciones que se desean chequear.

3.9 Notificaciones con GIF

Para poder envíar notificaciones con GIF, es necesario declarar el servicio en el archivo AndroidManifest.xml:

<!-- Start indigitall Services -->
...
<service android:name="net.indigitall.pushsdk.service.GifJobService"
        android:permission ="android.permission.BIND_JOB_SERVICE"/>
<service android:name="net.indigitall.pushsdk.service.GifService"/>
<!-- End indigitall Services -->

Una vez declarado el servicio quedará activo y funcionando. Para envíar notificaciones de este tipo solo será necesario seguir los pasos que se indican en el manual de usuario del panel: Manual de usuario del Panel

4. Change Log

Change Log v4.2

  • Actualizada las librería de localilización a la version 15.0.1
  • Actualizada la librería de mensajería de firebase a la versión 17.3.2
  • Añadido campo desCampaign al modelo de la push para enviar la descripción de campaña.
  • Añadido el classLoader de la clase PushModel al intent que es recibido cuando la notificación es enviada para poder leer los datos de la push.
  • Añadidas medidas de seguridad para evitar crasheo de la app cuando la push recibida es leida.

Change Log v4.1

  • Añadida comprobación del estado de la red antes de llamadas a endPoints.
  • Añadida configuración de la alarma cuando el dispositivo esta en modo low_power.
  • Traslado del GeoCoder al LocationManager.
  • Eliminación de la librería Picasso para cargar la imagen.
  • Eliminación de la asyncTask para el reintento de registro.
  • Creación de la clase TimeUtils y arreglo de errores al imprimir los objetos Date.
  • Añadidas comprobaciones de seguridad antes de mostrar la notificación con el notificationManager.
  • Eliminados handlers de inicialización DataListener e IDL para no crashear el gestor de hilos.
  • Creación de la clase DeviceDataUtils para conformar la petición de deviceData.
  • Creación de la clase NightServiceUtils para los métodos que se usan durante el servicio de mantenimiento nocturno.
  • Eliminación de la tarea asíncrona de la alarma para aliviar de carga al gestor de hilos.

Change Log v4.0

  • Migración de GCM a FCM para el envío de notificaciones.
  • Añadida AsyncTask para obtener la dirección del GeoCoder y evitar problemas de tipo ANR.
  • Añadida AsycTask para crear el PendingIntent que lanza el servicio principal del SDK en versiones inferiores a Android Oreo y asi evitar problemas de tipo ANR.
  • Añadido nuevo GifDecoder para evitar problemas de ejecución del gif.

Change Log v3.3

  • Añadido checkeo de mensaje vacío en el sevicio de recepcioón de notificaciones GCM.
  • Blindado el aceso a las funciones de conversión de tiempo con datos incorrectos.
  • Blindado el acceso al geocode para obtener la dirección con datos de latitud y longitud incorrectos.
  • Bloqueadas las acciones de usuario sobre los botones de las pushes interactivas cuando el dispositivo esta bloqueado.
  • Actualizada la librería de Picasso y optimizada la manera de cargar la imagen en la notificación.
  • Optimizado el algoritmo que determina si se deben lanzar los servicios nocturnos.
  • Añadido checkeo del appToken cuando se recoge la push.
  • Modificada la manera de recoger las pushes para Android 8 (Oreo).
  • Blindado el acceso a datos internos del SDK.
  • Optimizado el proceso de registro del dispositivo cuando se produce algún error.
  • Refactorización de los servicios para dar soporte a Android 8 (Oreo) en background.
  • Arreglo de la activación de localización si se piden los permisos en una activity que no es la principal.
  • Servicio de localización iniciado por el de indigitallService para permitir la cancelación/activación de la localización con la app cerrada.
  • Optimizada la creación de petición de deviceData.
  • Optimizados los métodos para la programación de servicios de Android 8
  • Añadidos los ids de los layouts manualmente en vez de automáticamente

Change Log v3.2

  • Añadida la posibilidad de activas/desactivar la localización
  • Añadido sincronismo con el proceso de registro del dispositivo.
  • Solucionada la dependencia entre onReadyListener y dataListener.
  • Distribuidas las llamadas al servidor durante los servicios nocturnos para balancear la carga hacia el servidor.
  • Creados canales de notificaciones para soportar Android 8 (Oreo).
  • Adaptados los servicios para dar soporte a Android 8 (Oreo).
  • Añadida la posibilidad de enviar notificaciones con GIF.
  • Refactorizados los Logs que se muestran por consola.

Change Log v3.1

  • Arreglado error en estadísticas.
  • Añadido algoritmo para incrementar cuadráticamente el tiempo de reintento de envío de información del dispositivo al servidor en caso de error.
  • Añadida la opción de envío de pushes silenciosas o vacías.
  • Solucionado error en funcionalidad de external apps.
  • Añadida la opción de distribuir el sdk mediante mavenCentral
  • Optimizado el proceso de trackeo de la localización mediante alarma para reducir el consumo de batería.
  • Notificaciones adaptadas a Android N.

5. Actualizaciones en la implementación

5.1. Cómo actualizar a la versión 4.2 desde versiones anteriores del SDK.

  • Actualización de la versión 4.1 a la versión 4.2:
  1. Incrementar la versión de la librería del SDK a la 4.2.+:

    dependencies {
        ...
    
        implementation 'net.indigitall:pushsdk:4.2.+'
        ....
    }
    
  2. Aumentar la version de las librerias de localización y mensajerí en el build.gradle de la app, de forma que las dependencias queden de la siguiente manera:

    dependencies {
        implementation fileTree(dir: 'libs', include: ['*.jar'])
    
        implementation 'net.indigitall:pushsdk:4.2.+'
    
        implementation 'com.android.support:support-v4:26.1.0'
        implementation 'com.google.firebase:firebase-messaging:17.3.2'
        implementation 'com.google.android.gms:play-services-location:15.0.1'
        implementation 'com.squareup.okhttp3:okhttp:3.6.0'
        ...
    }
  3. Aumentar el classpath de los servicios de google en el build.gradle del proyecto ([project]/build.gradle):

    buildscript {
    ...
    dependencies {
    
        classpath 'com.google.gms:google-services:4.1.0'
    
        }
    }
    allprojects {
        repositories {
            mavenCentral()
        }
    }
  • Actualización de la versión 4.0 a la versión 4.1:
  1. Incrementar la versión de la librería del SDK a la 4.1.+:

    dependencies {
        ...
    
        implementation 'net.indigitall:pushsdk:4.1.+'
        ....
    }
    
  2. Eliminar la dependencia de la librería Picasso en el build.gradle de la app, de forma que las dependencias queden de la siguiente manera:

    dependencies {
        implementation fileTree(dir: 'libs', include: ['*.jar'])
    
        implementation 'net.indigitall:pushsdk:4.1.+'
    
        implementation 'com.android.support:support-v4:26.1.0'
        implementation 'com.google.firebase:firebase-messaging:15.0.0'
        implementation 'com.google.android.gms:play-services-location:15.0.0'
        implementation 'com.squareup.okhttp3:okhttp:3.6.0'
        ...
    }
  • Actualización de la versión 3.3 a la versión 4.0:
  1. Añadir el archivo google.services.json como se indica en el punto 1.4 de la documentación: Obtención del archivo json de google services para la app

  2. Cambiar el build.gradle del proyecto: 

    buildscript {
    ...
    dependencies {
    
        classpath 'com.google.gms:google-services:3.2.0'
    
        }
    }
  3. Cambiar el build.gradle de la app, añadiendo el plugin de google services, incrementando la versión del sdk de indigitall, añadiendo la librería de firebase e incrementando la versión de la librería de localización:

    dependencies {
        ...
    
        implementation 'net.indigitall:pushsdk:4.0.+'
    
        implementation 'com.google.firebase:firebase-messaging:15.0.0'
        implementation 'com.google.android.gms:play-services-location:15.0.0'
        ...
    }
    apply plugin: 'com.google.gms.google-services'
  4. Eliminar varios permisos, servicios y broadcastReceiver de GCM del AndroidManifest.xml:

      <!-- Borrar los siguientes permisos-->
      <permission android:name="{yourpackage}.permission.C2D_MESSAGE"
          android:protectionLevel="signature" />
      <uses-permission android:name="{yourpackage}.permission.C2D_MESSAGE" />
      <uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" />
      <uses-permission android:name="android.permission.WAKE_LOCK" />
      <!-- Borrar los siguientes servicios-->
      <service android:name="net.indigitall.pushsdk.service.GCMIntentJobService"
            android:permission ="android.permission.BIND_JOB_SERVICE"/>
      <service android:name="net.indigitall.pushsdk.GCMIntentService"/>
      <!--Borrar el siguiente BroadcastReceiver-->
      <receiver android:name="net.indigitall.pushsdk.broadcast.GCMBroadcastReceiver"
          android:permission="com.google.android.c2dm.permission.SEND" >
          <intent-filter>
              <action android:name="com.google.android.c2dm.intent.RECEIVE" />
              <action android:name="com.google.android.c2dm.intent.REGISTRATION"/>
              <category android:name="{yourpackage}" />
          </intent-filter>
      </receiver>
  5. Añadir el servicio para llevar a cabo el registro y para recibir notificaciones al AndroidManifest.xml:

          <!--Servicio para recibir notificaciones de FCM-->
            <service android:name="net.indigitall.pushsdk.service.IndigitallMessagingService">
                <intent-filter>
                    <action android:name="com.google.firebase.MESSAGING_EVENT"/>
                </intent-filter>
            </service>
          <!--Servicio para registrar el dispositivo en FCM-->
            <service
                android:name="net.indigitall.pushsdk.service.IndigitallInstanceIDService">
                <intent-filter>
                    <action android:name="com.google.firebase.INSTANCE_ID_EVENT"/>
                </intent-filter>
            </service>
  6. Guardar el SENDER_ID en el archivo de configuración res/values/indigitall_values.xml:

      <?xml version="1.0" encoding="utf-8"?>
      <resources>
              <!-- Cambiar por el Sender ID propio-->
              <string name="indigitall_sender_id">999999999999</string>
      </resources>
  • Actualización de la versión 3.2 a la versión 3.3:

    Para realizar la actualización del SDK será necesario:

    1. Incrementar el valor medium de la dependencia en el gradle del módulo:

              dependencies {
                  ...
                  implementation 'net.indigitall:pushsdk:3.3.+'
                  ...
              }
    2. Aumentar la versión de la librería support-v4, picasso, gcm y localización:

             dependencies {
                ...
                implementation 'net.indigitall:pushsdk:3.3.+'
      
                implementation 'com.android.support:support-v4:26.1.0'
                implementation 'com.google.android.gms:play-services-gcm:10.2.1'
                implementation 'com.google.android.gms:play-services-location:10.2.1'
                implementation 'com.squareup.picasso:picasso:2.71828'
                ...
            }
  • Actualización de la versión 3.1 a la versión 3.2:

    Para realizar la actualización del SDK será necesario únicamente incrementar el valor medium de la dependencia en el gradle del módulo:

        dependencies {
            ...
    
            compile 'net.indigitall:pushsdk:3.2.+'
    
            ...
        }
  • Actualización de la versión 3.0 a la versión 3.1:

    Para llevar a cabo la actualización del SDK de la versión 3.0.x a la 3.1.x es necesario seguir los pasos indicados en el siguiente enlace: Cómo actualizar de la versión 3.0 a la versión 3.1 del SDK

6. F.A.Q

  • Q: No llegan las notificaciones ¿Qué puedo hacer?
  • A: Busque en logs el siguiente mensaje “RegisterService: Device registered”. Si este mensaje llega es porque el registro de notificaciones se está efectuando correctamente. Si aún así no recibe notificaciones, revise su “App Token” y “Sender ID” y compruebe que sean correctos. Algunos dispositivos como Huawei y Xiaomi tienen economizadores de batería que evitan que lleguen correctamente las notificaciones. Si tiene un dispositivo de este tipo, configúrelo para recibir siempre notificaciones y, a poder ser, haga pruebas con la app en primer plano.

  • Q: ¿A qué versiones de Android da soporte indigitall?
  • A: La librería de indigitall se compila con minSdkVersion 16, por tanto la versión mínima de Android a la que da soporte es Jelly Bean (Android 4.1).

  • Q: La imagen me llega pequeña, ¿hay forma de arreglar esto?
  • A: Las notificaciones de indigitall pueden incluir dos imágenes, una imagen pequeña y cuadrada en el espacio del icono y una imágen grande panorámica debajo del cuerpo de la notificación. Las imágenes grandes sólo aparecen en las notificaciones de tipo foto. Revisar que, al crear el mensaje en el panel, la imágen se establece en su correspondiente campo y no en el del icono de la notificación.

  • Q: Me aparece un icono cuadrado en la barra de estado del dispositivo ¿por qué?
  • A: Desde Android 5.0 (Lollipop) el sistema utiliza un icono monocromo para representar las notificaciones de la aplicación en la barra de estado. Si este icono no se ha establecido manualmente, cogerá el icono por defecto de la aplicación, rellenándolo de color blanco y respetando únicamente las transparencias de éste. La librería de indigitall provee de métodos para configurar a gusto los iconos de las notificaciones. Ver sección Ajustes de la librería.

  • Q: No me llegan las notificaciones Geolocalizadas ¿cómo puedo arreglarlo?
  • A: Revise que tiene habilitada la geolocalización en el dispositivo y los permisos concedidos (en caso de ser Android 6.0 o superior). Abra la app y busque los logs correspondientes a “LocationManager” e “indigitallService”, en ellos podrá ver cómo cambia la localización y si esta es significativa. Hablamos de cambios significativos en la localización cuando el dispositivo se mueve más de 100 m de la última posición conocida. Este servicio se ejecuta cada 20 min por defecto, siendo posible modificar el tiempo en el panel de indigitall.

  • Q: ¿Es obligatorio que pida permisos de localización o telefonía a mis usuarios?
  • A: Los permisos de localización y de telefonía son opcionales, puedes excluirlos del manifest de la aplicación. En estos casos se pierden algunas funcionalidades relacionadas con estos permisos, como pueden ser las notificaciones Geolocalizadas y Geofencing o las notificaciones de tipo Click to Call.

  • Q: Mis notificaciones no se posicionan las primeras ¿Cómo hago que esto ocurra?
  • A: Las notificaciones de indigitall tienen la máxima prioridad que Android permite, las únicas notificaciones que pueden aparecer por encima son las que tengan la misma prioridad. En estos casos la notificación que llegue última será la que aparezca más arriba en el listado de notificaciones si ambas tienen la misma prioridad.

  • Q: ¿Cómo hago pruebas en desarrollo sin afectar a los usuarios de producción?
  • A: Los “App Token” de la aplicación de desarrollo y la de producción son distintos, esto es así para evitar que puedan llegarle a usuarios de producción notificaciones creadas en desarrollo. Por este motivo las pruebas en desarrollo no conllevan ningún riesgo. Aun así, siempre puede filtrar en el panel de indigitall por DeviceID creando y subiendo un .csv que contenga los identificadores de los dispositivos a los que quiere que llegue la notificación.

  • Q: ¿Cómo hago pruebas en producción sin afectar a los usuarios?
  • A: Las pruebas en producción son muy sensibles, ya que cometer un fallo aquí puede hacer que nuestra notificación llegue a usuarios reales. Por este motivo aconsejamos que a la hora de hacer pruebas en producción se hagan envíos geolocalizados o que se filtre por DeviceID como se explica en el caso anterior.

7. Contacto

En indigitall estamos encantados de ayudarle con cualquier duda o problema que le surja al integrar nuestra solución. Para contactar con nosotros puede escribirnos a soporte@indigitall.net. Nos pondremos en contacto con usted lo antes posible.