EN

  |  ES

/Guía Rápida SDKs /App push /Android

SDK de Android

Guía avanzada para configurar el SDK de Android


Tabla de contenidos



1. Propiedades configurables


En esta sección encontrarás una serie de funcionalidades más avanzadas y que requieren de un desarrollo más complejo. Aconsejamos que sea un desarrollador el encargado de esta configuración.


1.1. Activar las notificaciones geolocalizadas


El SDK de indigitall puede gestionar la localización del usuario. Esto te permite usar los filtros de localización en la pantalla de enviar campaña push (Campañas>Push>Nueva campaña push>Filtros>Filtros geográficos)


Location path on console

Una vez hayamos habilitado esta funcionalidad, el usuario final tendrá que dar su consentimiento al permiso de localización y habilitar los servicios de localización de su smartphone, para que la aplicación obtenga la ubicación exacta del usuario.


Añade los permisos de localización incluyendo esta línea en el archivo AndroidManifest.xml:


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


Puedes encontrar el archivo AndroidManifest.xml en la siguiente ruta:


Ruta al fichero AndroidManifest.xml

Opciones que debes tener en cuenta


Hay dos modos de gestionar los permisos de localización:


A continuación te explicamos cómo configurar los permisos de localización en modo automático.


Hay que añadir el parámetro AutoRequestPermissionLocation cuando se inicialice el SDK. Esto se hace mediante el siguiente extracto de código:


//Cuando quieres inicializar indigitall
Configuration config = new Configuration
    .Builder("<YOUR-APP-KEY>", "<YOUR-SENDER-ID>")
    .setAutoRequestPermissionLocation(true)
    .build();
Indigitall.init(context, config);


En Android hay una clase donde se recibe el estado de los permisos después de que el usuario los haya cambiado mediante la configuración. Habría que añadir el siguiente trozo de código para capturar el estado de los permisos:


//En la clase que usas para recibir los resultados de pedir los permisos
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
    Indigitall.onRequestPermissionsResult(this, requestCode, permissions, grantResults);
}


1.2. Establecer la Activity por defecto


La Activity por defecto es la pantalla inicial de tu app que se lanza cuando un usuario pulsa en una notificación que no lleva deeplink. También es el punto donde debes inicializar el SDK. Se establece mediante el parámetro DefaultActivity:


//Cuando quieres iniciar indigitall
Configuration config = new Configuration
    .Builder("<YOUR-APP-KEY>", "<YOUR-SENDER-ID>")
    .setDefaultActivity("YOUR_ACTIVITY")
    .build();
Indigitall.init(context, config);


1.3. Asociar el dispositivo a un usuario


Puedes asociar tu propio ID a cada dispositivo. De esta forma te será más sencillo e intuitivo trabajar con nuestra herramienta. Por ejemplo:


Para realizar esta asociación entre tu ID personalizado (externalId), y el identificador que maneja indigitall (deviceId), hay que invocar el método setExternalCode:


//Recuerda poner aquí tu código externo
Indigitall.setExternalCode(this, "YOUR_EXTERNAL_ID", new DeviceCallback(context) {
    @Override
    public void onSuccess(Device device) {
        //DO SOMETHING
    }
    @Override
    public void onFail() {
        //LOG ERROR
    }
});


No te preocupes por nada. Tus IDs se cifran de forma irreversible en el propio teléfono y se mandan de forma segura a nuestros servidores. Ni siquiera el equipo de indigitall puede conocer esta información.


1.4. Filtro WiFi


Si se requiere recoger la información de la WiFi del usuario, además de la configuración del panel de Indigitall, deberás añadir en el manifest los permisos que se exponen a continuación, el servicio correspondiente al filtro y añadir el parámetro wifiFilterEnabled cuando se inicialice el SDK:


<uses-permission android:name="android.permission.CHANGE_WIFI_STATE"/>
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />

//Servicio WiFi
<service
    android:name="com.indigitall.android.services.WifiStatusService"
    android:permission="android.permission.BIND_JOB_SERVICE" >
</service>
<receiver android:name="com.indigitall.android.receivers.AlarmReceiver">
    <intent-filter>
        <action android:name="AlarmReceiver.Action.NETWORK_ALARM" />
    </intent-filter>
</receiver>

//Cuando quieres iniciar indigitall
Configuration config = new Configuration
    .Builder("<YOUR-APP-KEY>", "<YOUR-SENDER-ID>")
    .wifiFilterEnabled(true)
    .build();
Indigitall.init(context, config);


1.5. Layout custom


Si por alguna razón no se desea mostrar la push como la muestra android nativo, dejamos esta opción para mostrar la push con nuestro layout custom. Para ello añade el siguiente código en la configuración antes de llamar al init:


//Cuando quieres iniciar indigitall
Configuration config = new Configuration
    .Builder("<YOUR-APP-KEY>", "<YOUR-SENDER-ID>")
    .setLayoutBasic(LayoutBasic.custom)
    .build();
Indigitall.init(context, config);

2. Callbacks que ofrece el SDK


Nuestro SDK ofrece diversos callbacks que te ayudan tener mayor control del flujo de ejecución y a implementar comportamientos personalizados.


Para suscribirte a estos callbacks tienes que:


Indigitall.init(context, config, new InitCallBack(context){
   @Override
    public void onIndigitallInitialized(Permission[] permissions, Device device) {}
    @Override
    public void onNewUserRegistered(Device device) {}
    @Override
    public void onErrorInitialized(String error) {}
});


 2.1. SDK inicializado


El método onIndigitallInitialized del objeto InitCallBack se ejecutará cuando el SDK termine de inicializarse y el dispositivo esté preparado para recibir notificaciones de indigitall.


Recibe como parámetro:


A continuación te mostramos un ejemplo que imprime logs sobre el estado de los permisos y la información del dispositivo.


Indigitall.init(context,config, new InitCallBack(context){
   @Override
    public void onIndigitallInitialized(Permission[] permissions, Device device) {
        super.onIndigitallInitialized(permissions, device);
        Log.d("Push Permission: ", permissions[0].toString());
        Log.d("Location Permission: ", permissions[1].toString());
        Log.d("Device: ", device.toString());
    }
});


 2.2. Nuevo dispositivo registrado


El método onNewUserRegistered del objeto InitCallBack se ejecutará cuando el dispositivo ha sido registrado por primera vez, es decir, en la primera ejecución de la app tras ser instalada.


Recibe como parámetro el objeto Device con la información asociada al dispositivo.


Indigitall.init(context, config, new InitCallBack(context){
    @Override
    public void onNewUserRegistered(Device device) {
        super.onNewUserRegistered(device);
        Log.d("Device: ", device.toString());
    }
});


 2.3. Se ha producido un error


El método onErrorInitialized del objeto InitCallBack se ejecutará sólo si se produce un error durante la inicialización del SDK.


Recibe como parámetro la descripción del error.


Indigitall.init(context, config, new InitCallBack(context) {
    @Override
    public void onErrorInitialized(String error) {
        super.onErrorInitialized(error);
        Log.d("Error on Indigitall.init: ", error);
    }
});


3. Administrar dispositivo


3.1. Consultar información y estado del dispositivo


Puedes usar el método deviceGet para obtener la información que ha registrado el SDK en referencia al dispositivo.


Debes instanciar un objeto DeviceCallback y pasarlo como segundo parámetro del método deviceGet. Este callback recibirá como parámetro el objeto device que contiene toda la información asociada al dispositivo.


Indigitall.deviceGet(context, new DeviceCallback() {
    @Override
    public void onSuccess(Device device) {
        Log.d("Device: ", device.toString());
    }
    @Override
    public void onFail() {}
});


3.2. Habilitar / deshabilitar el dispositivo


Puedes elegir deshabilitar el dispositivo para bloquear la recepción de notificaciones. Es un método muy útil para:


Para ello, dispones de los métodos deviceEnable y deviceDisable.


Debes instanciar un onjeto DeviceCallback y pasarlo como segundo parámetro. Este callback recibirá como parámetro el objeto device que contiene toda la información asociada al dispositivo.


Indigitall.deviceEnable(context, new DeviceCallback(context) {
    @Override
    public void onSuccess(Device device) {
        Log.d("Device: ", device.toString());
    }
    @Override
    public void onFail() {}
});

Indigitall.deviceDisable(context, new DeviceCallback(context) {
    @Override
    public void onSuccess(Device device) {
        Log.d("Device: ", device.toString());
    }
    @Override
    public void onFail() {}
});


4. Grupos de interés


Nuestro SDK te permite clasificar a los usuarios en diferentes grupos personalizables. Esto es muy útil para:


Recuerda que primero debes definir los grupos con los que quieres trabajar en la consola de indigitall (Herramientas > Grupos de interés). Consulta nuestro manual de usuario para más info.


4.1. Listar grupos


Usa el método topicsList para obtener la lista de grupos que están configurados en tu proyecto de indigitall. El callback de este método recibe como parámetro un array de Topics, que contiene la información de todos los grupos disponibles, además de un flag que indica si el usuario está incluido en alguno de ellos.


Indigitall.topicsList(context, new TopicsCallback() {
    @Override
    public void onSuccess(Topic[] topics) {
        //DO SOMETHING
    }
    @Override
    public void onFail() {}
});


4.2. Gestionar suscripción


Para gestionar la suscripción del dispositivo a uno o varios grupos, existen dos métodos: topicsSubscribe y topicsUnsubscribe.

Opcionalmente ambos reciben un objeto TopicsCallback como tercer parámetro, que devolverá el listado de todos los Topic del proyecto.


//topics is typeof Topic[] or typeof string[]
Indigitall.topicsSubscribe(context, topics, new TopicsCallback() {
    @Override
    public void onSuccess(Topic[] topics) {}
    @Override
    public void onFail() {}
});

//topics is typeof Topic[] or typeof string[]
Indigitall.topicsUnsubscribe(context, topics, new TopicsCallback() {
    @Override
    public void onSuccess(Topic[] topics) {}
    @Override
    public void onFail() {}
});


5. Enviar eventos personalizados


Tu app puede mandar información a los servidores de indigitall para identificar las acciones y eventos que suceden en ella. Esto te permite automatizar acciones de retargeting.


Para registrar estos eventos hay que llamar al método sendCustomEvent, pasando como parámetro un ID descriptivo (puedes inventarte el que más te guste).


Indigitall.sendCustomEvent(this, "YOUR_EVENT_ID");


6. Mensajes In-App


Si quieres integrar los mensajes In-App en tu aplicación, puedes hacerlo con varios formatos complementarios:


6.1. Formato banner


A continuación te contamos como instanciar uno o varios mensajes In-App en formato banner.

Recuerda que primero deberías tenerlos definidos en la consola de indigitall. Consulta nuestro manual de usuario para más info.


Crea una vista de WebView en tus layouts. El tamaño debe coincidir con el que hayas definido en la consola de indigitall (Herramientas > Esquemas In-App/In-Web). Recuerda traducir las unidades de PX a DP.


6.1.1. Un único banner


Puedes seguir el ejemplo de a continuación:


<WebView
    android:id="@+id/myBanner"
    android:layout_width="230dp"
    android:layout_height="33.33dp"
/>


Instancia el mensaje In-App usando el método showInApp.


WebView view = findViewById(R.id.myBanner);

Indigitall.showInApp(getContext(), "myBanner_CODE", view, new ShowInAppCallback() {
    @Override
    public void onLoad(String inAppCode, WebView webView) {
        Log.d("In-App loaded: ", inAppCode);
    }
    @Override
    public void onFail(String inAppCode, WebView webView, String message) {}
});


6.1.2. Múltiples banner


Puedes seguir el ejemplo de a continuación:


<WebView
    android:id="@+id/myBanner"
    android:layout_width="230dp"
    android:layout_height="33.33dp"
/>
<WebView
    android:id="@+id/otherBanner"
    android:layout_width="250dp"
    android:layout_height="36dp"
/>


Instancia los mensajes In-App usando el método showInApp.


ArrayList<WebView> views = new ArrayList<>();
views.add(findViewById(R.id.myBanner));
views.add(findViewById(R.id.otherBanner));

ArrayList<String> codes = new ArrayList<>();
codes.add("myBanner_CODE");
codes.add("otherBanner_CODE");

Indigitall.showMultipleInApp(getContext(), codes, views, new ShowInAppCallback() {
    @Override
    public void onLoad(String inAppCode, WebView webView) {
        Log.d("In-App loaded: ", inAppCode);
    }
    @Override
    public void onFail(String inAppCode, WebView webView, String message) {}
});


6.2. Formato Popup


A continuación te contamos como instanciar un mensaje In-App en formato popup.

Recuerda que primero deberías tenerlo definido en la consola de indigitall. Consulta nuestro manual de usuario para más info.


Crea una vista de WebView en tus layouts. El tamaño debe coincidir con el que hayas definido en la consola de indigitall (Herramientas > Esquemas In-App/In-Web). Recuerda traducir las unidades de PX a DP.


ConstraintLayout view = findViewById(R.id.myPopupParentLayout)

Indigitall.showPopUp(view, getContext(), "myPopup_CODE", new ShowInAppCallback() {
    @Override
    public void onLoad(String inAppCode, WebView webView) {
        Log.d("In-App loaded: ", inAppCode);
    }
    @Override
    public void onFail(String inAppCode, WebView webView, String message) {}

    @Override
    public void didClicked() {
        Log.d("popUp","didClicked")
    }

    @Override
    public void  didClosed() {
        Log.d("popUp","didClosed")
    }
    @Override
    public void  didDismissed() {
        Log.d("popUp","didDismissed")
    }
});


Si quieres personalizar el icono de cerrar el Popup, puedes hacerlo con el siguiente método al que le podrás pasar un ImageButton personalizado, si quisieras usar nuestro icono, bastaría con pasar un null. El parámetro closeIconDisabled es por si no quieres mostrar ningún icono, definiendo éste a true para ocultarlo o false para mostrarlo.


ConstraintLayout view = findViewById(R.id.myPopupParentLayout)

ImageButton myImageButton = ImageButton(context);
.
.//set ImageButton params
.
boolean closeIconDisabled = false

Indigitall.showPopUp(view, getContext(), "myPopup_CODE", myImageButton, closeIcon, new ShowInAppCallback() {
    @Override
    public void onLoad(String inAppCode, WebView webView) {
        Log.d("In-App loaded: ", inAppCode);
    }
    @Override
    public void onFail(String inAppCode, WebView webView, String message) {}

    @Override
    public void didClicked() {
        Log.d("popUp","didClicked")
    }

    @Override
    public void  didClosed() {
        Log.d("popUp","didClosed")
    }
    @Override
    public void  didDismissed() {
        Log.d("popUp","didDismissed")
    }
});


7. Inbox


7.1. Configuración Inbox


En esta sección encontrarás una serie de funcionalidades más avanzadas y que requieren de un desarrollo más complejo. Aconsejamos que sea un desarrollador el encargado de esta configuración.


7.1.1. Identificación de usuarios


Para poder obtener las notificaciones del Inbox de Indigitall, el usuario debe identificarse. Primero hay que inicializar la SDK de Indigitall para que genere nuestro identificador (deviceId) y poder asociarlo al ID personalizado que asocies a dispositivo, similar a como se explica aquí.


Para realizar las tareas de registro, se usan estos dos métodos:


//Identificación de usuario
Indigitall.logIn(this, "YOUR_EXTERNAL_ID", new DeviceCallback(context) {
    @Override
    public void onSuccess(Device device) {
        //DO SOMETHING
    }
    @Override
    public void onFail() {
        //LOG ERROR
    }
});

//Desconexión
Indigitall.logOut(this, new DeviceCallback(context) {
    @Override
    public void onSuccess(Device device) {
        //DO SOMETHING
    }
    @Override
    public void onFail() {
        //LOG ERROR
    }
});


7.1.2. Generar token de autentificación


En esta sección verás cómo se genera un token de validación para una aplicación que tenga configurado una autentificación con webhook. Para generar dicho token, se necesita añadir el JSON con la configuración.


El token tiene una fecha predeterminada de caducidad, una vez caducado en nuestro sistema, se lanzará un evento listener de tipo InboxAuthListener que indicará dicha caducidad y tendrá que devolvernos el JSON de configuración. Para recoger el listener, hay que implementarlo en la clase correspondiente, y sobreescribir el siguiente método:



public class YOUR_CLASS implements InboxAuthListener{
.
.
.
@Override
public JSONObject getAuthConfig() {
    return MY_JSON;
}


7.2. Funcionalidades principales del Inbox


Una vez hecho el registro del dispositivo correctamente, se puede empezar a realizar las peticiones del Inbox. Hay que tener en cuenta las siguientes características del Inbox, que opcionalmente son configurables.

7.2.1. Propiedades del Inbox


Las notificaciones del Inbox tendrán los siguiente estados de la clase InboxStatus:



Las notificaciones también vendrán con un estado leído o 'read', para ayudar a diferenciar dichos estados.


Cada notificación vendrá asignada con un sendingId entero y único, para poder diferenciarlos y usarlos para algunas de las funcionalidades.


En el caso particular de Android, cuando llega una nueva push de Indigitall al dispositivo del cliente, se genera una acción definida en un intent, que se puede utilizar para avisar al usuario de que tiene un nuevo mensaje en el Inbox. Para recogerlo hay que implementarlo de la siguiente manera:


@Override
protected void onResume() {
    super.onResume();
    if (getIntent() != null && getIntent().getExtras() != null){
        Bundle extras = getIntent().getExtras();
        if( extras != null && extras.containsKey(Push.EXTRA_PUSH)) {
            //DO SOMETHING
        }
    }
}


7.2.2. Obtener las notificaciones


Como se ha explicado anteriormente, para obtener las notificaciones se usa el siguiente método:


 Inbox.Companion.getInbox(context, new InboxCallback(context) {
    @Override
    public void onSuccess(Inbox inbox) {
        //DO SOMETHING
    }

    @Override
    public void onError(Error error) {
        //LOG ERROR
    }
});


7.2.2.1 Siguiente página


Una vez obtenida la instancia Inbox, la usaremos para pedir la siguiente página, que se realizada con el siguiente métoto, en el caso de que no haya más páginas te lo indicará en el error con el códigoo 410:


inbox.getNextPage(context,new InboxCallback() {
    @Override
    public void onSuccess(Inbox inbox, newNotifications: ArrayList<InboxNotification>?) {
        //DO SOMETHING
    }

    @Override
    public void onError(Error error) {
        if (code == 410){
            //LOG NO HAY MÁS PÁGINAS
        }else{
            //LOG ERROR
        }
    }
});


Ten en cuenta que el callback del Inbox a parte de devolver el Inbox actualizado, devuelve un array que se llama newNotifications, en el que se irán las nuevas notificaciones que añadir al Inbox, para que, en caso de ser necesario, poder utilizar dicho array para moverte entre las páginas sin depender de las llamadas al Inbox.


7.2.3. Obtener la información de una notificación


Para obtener la información de una notificación en particular, hay que hacer la siguiente llamada con el sendingId de cada notificación:


inbox.getInfoFromNotification(context, SENDING_ID , new InboxNotificationsCallback(context) {
    @Override
    public void onSuccess(InboxNotification inboxNotification) {
        //DO SOMETHING
    }

    @Override
    public void onError(Error error) {
        //LOG ERROR
    }
});


7.2.4. Editar el estado de una o más notificaciones


Para editar el estado de una o más notificaciones a la vez, se realiza con el siguiente método en el que se deben indicar los sendingIds de las notificaciones a editar y el estado al que se quiere cambiar:

//Modificar una notificación
inbox.modifyStatusFromNotification(context,SENDING_ID,STATUS,new InboxNotificationsCallback(context) {
    @Override
    public void onSuccess(InboxNotification inboxNotification) {
        //DO SOMETHING
    }

    @Override
    public void onError(Error error) {
        //LOG ERROR
    }
});

//Modificar masivamente
inbox.massiveEditNotifications(context,[SENDING_IDS],STATUS,new BaseCallback() {
    @Override
    public void onSuccess(JSONObject json) {
        //DO SOMETHING
    }

    @Override
    public void onError(Error error) {
        //LOG ERROR
    }
});


7.2.5. Contadores de estado de las notificaciones


Para saber el número de notificaciones que hay en el Inbox según su estado, se reliza este método:

Inbox.Companion.getMessagesCount(context, new InboxCountersCallback(context) {
        @Override
        public void onSuccess(InboxCounters inboxCounters) {
            //DO SOMETHING
        }
    });


8. Firebase Utils

Si tienes clases personalizadas de Firebase, puede que necesites deshabilitar los siguientes servicios del SDK, definidos en el manifest.xml.


<!-- <service
    android:name="com.indigitall.android.services.FirebaseMessagingService">
    <intent-filter>
        <action android:name="com.google.firebase.MESSAGING_EVENT"/>
    </intent-filter>
</service>
    <service
    android:name="com.indigitall.android.services.FirebaseInstanceIdService">
    <intent-filter>
        <action android:name="com.google.firebase.INSTANCE_ID_EVENT"/>
    </intent-filter>
</service> -->


Si este es tu caso, debes agregar este código para asegurar que las notificaciones enviadas desde indigitall, se reciban y se muestren.


En el servicio asociado a la acción _com.google.firebase.INSTANCE_IDEVENT añade esta línea para registrar el push token.


@Override
public void onTokenRefresh() {
    FirebaseUtils.setPushToken(context);
}


En el servicio asociado a la acción _com.google.firebase.MESSAGINGEVENT, si la notificación proviene de indigitall, las siguientes líneas de código harán que se pinte.


@Override
public void onMessageReceived(RemoteMessage remoteMessage) {
    if(remoteMessage.getData() != null && !FirebaseUtils.pushNotificationIndigitall(remoteMessage, context)){
        //Your Code
    }
}


9. Recogida de los datos de la push


En el caso de que quisieras obtener el objeto push de tipo json para realizar comprobaciones o acciones que tu aplicación requiera, te dejamos este código que ayudará a su obtención:


@Override
protected void onResume() {
    super.onResume();
    if (getIntent() != null && getIntent().getExtras() != null){
        Bundle extras = getIntent().getExtras();
        if( extras != null && extras.containsKey(Push.EXTRA_PUSH)) {
            Push push = new Push(extras.getString(Push.EXTRA_PUSH));
        }
    }
}


10. Documentación de referencia


Javadoc del SDK 4.8 para Android


11. Changelog

[4.9.0] - 11/2020

Añadido

[4.8.6] - 10/2020

Correciones

[4.8.5] - 10/2020

Correciones

[4.8.4] - 10/2020

Correciones

[4.8.3] - 09/2020

Correciones

[4.8.2] - 09/2020

Correciones

[4.8.1] - 08/2020

Correciones

[4.8.0] - 08/2020

Añadido

[4.7.0] - 07/2020

Añadido

[4.6.0] - 06/2020

Añadido

[4.5.1] - 06/2020

Correcciones

[4.5.0] - 06/2020

Añadido

[4.4.0] - 06/2020

Añadido

[4.3.0] - 05/2020

Añadido

Correcciones

[4.2.0] - 04/2020

Añadido

[4.1.1] - 03/2020

Correcciones

[4.1.0] - 03/2020

Añadido

[4.0.2] - 03/2020

Correcciones

[4.0.1] - 01/2020

Correcciones

[4.0.0] - 03/2020

Añadido

[3.1.0] - 08/2019

Añadido