Java
Suivre les écrans, les sessions et les événements d'une application Android écrite en Java, avec le SDK io.sessio:sessio-android.
Sessio mesure les applications Android natives : écrans vus, visiteurs, sessions, temps passé par écran, rétention, pays, appareil, version de l'app et événements personnalisés. Les données arrivent dans le même dashboard que vos sites web et vos autres applications.
Cette page donne tous les exemples en Java. Votre application est écrite en Kotlin ? Voyez Kotlin : c'est le même SDK, io.sessio:sessio-android, avec les mêmes fonctions. Pour une application React Native, voyez React Native.
#1. Créer l'application dans Sessio
- Dans le dashboard, ouvrez Sites puis Nouveau site ou app.
- Choisissez Application mobile, puis la plateforme Android.
- Une fois l'application créée, ouvrez sa fenêtre d'installation et choisissez Android (Kotlin et Java), puis Java : elle affiche votre code de suivi et les extraits prêts à copier.
#2. Ajouter le SDK
Le SDK est servi par le serveur Sessio, dans un dépôt Maven. Ajoutez ce dépôt, puis la dépendance.
Gradle en Groovy (.gradle), le plus fréquent dans les projets Java :
// settings.gradle
dependencyResolutionManagement {
repositories {
google()
mavenCentral()
maven { url "https://api-sessio.flamme.work/sdk/maven" }
}
}
// app/build.gradle
dependencies {
implementation "io.sessio:sessio-android:0.1.0"
}Si votre projet utilise les fichiers Gradle en Kotlin (.gradle.kts) :
// settings.gradle.kts
dependencyResolutionManagement {
repositories {
google()
mavenCentral()
maven { url = uri("https://api-sessio.flamme.work/sdk/maven") }
}
}
// app/build.gradle.kts
dependencies {
implementation("io.sessio:sessio-android:0.1.0")
}- Android 5 (API 21) et plus, Java 8 et plus.
- Une app 100 % Java n'a rien à installer de plus, ni le plugin Kotlin : la seule dépendance du SDK, la bibliothèque standard de Kotlin, est ajoutée par Gradle tout seul. Rien n'est à ajouter dans les règles ProGuard / R8.
- La permission
INTERNETest déclarée par le SDK.
#3. Démarrer le SDK
Dans votre classe Application :
import android.app.Application;
import io.sessio.android.Sessio;
public class MonApplication extends Application {
@Override
public void onCreate() {
super.onCreate();
Sessio.init(this, "VOTRE_CODE_DE_SUIVI");
}
}Déclarez-la dans AndroidManifest.xml : <application android:name=".MonApplication" …>.
Les réglages se passent avec SessioOptions. En Java, les valeurs se donnent dans l'ordre du tableau ci-dessous, et on peut s'arrêter à tout moment : les suivantes gardent leur valeur par défaut.
import io.sessio.android.SessioOptions;
// endpoint, flushIntervalSeconds, maxBatch, debug
Sessio.init(this, "VOTRE_CODE_DE_SUIVI",
new SessioOptions("https://api-sessio.flamme.work", 10, 50, true));| Ordre | Option | Défaut | Rôle |
|---|---|---|---|
| 1 | endpoint |
https://api-sessio.flamme.work |
l'adresse du serveur Sessio |
| 2 | flushIntervalSeconds |
10 |
l'intervalle d'envoi |
| 3 | maxBatch |
50 |
le nombre maximal d'événements par envoi (100 au plus) |
| 4 | debug |
false |
écrit les opérations du SDK dans Logcat, étiquette Sessio |
| 5 | trackActivities |
true |
un écran par Activity affichée |
| 6, 7 | appVersion, appBuild |
ceux de l'app | pour remplacer la version et le build lus dans le PackageManager |
#4. Suivre les écrans
#Une Activity par écran (automatique)
Rien à faire : chaque Activity affichée est un écran, nommé d'après sa classe sans le suffixe Activity (ProduitActivity devient Produit). Une rotation ou un retour dans l'app ne le recompte pas.
#Navigation avec des Fragments
Avec une seule Activity et la bibliothèque Navigation, ce sont les destinations qui comptent. Branchez le suivi sur le NavController :
import androidx.navigation.NavController;
import androidx.navigation.Navigation;
import io.sessio.android.SessioNavigation;
NavController navController = Navigation.findNavController(this, R.id.nav_host);
SessioNavigation.track(navController);Chaque destination est enregistrée sous le modèle de sa route, produit/{id} et non produit/42 : un même écran n'est compté qu'une fois, quel que soit le produit affiché. Le suivi par Activity est alors coupé de lui-même, pour éviter les doublons.
#À la main
Sessio.screen("Panier");
Map<String, Object> props = new HashMap<>();
props.put("categorie", "thé");
Sessio.screen("Produit/Détail", props);Le nom de l'écran sert d'identifiant : gardez toujours la même orthographe.
#5. Envoyer des événements
Map<String, Object> props = new HashMap<>();
props.put("montant", 5000);
props.put("devise", "XAF");
Sessio.track("achat", props);
Sessio.track("inscription");Les propriétés acceptent des textes, des nombres, des booléens, des listes et des Map imbriquées.
#6. Reconnaître un visiteur
Sessio.identify("[email protected]"); // un libellé lisible pour ce visiteur
Sessio.identify(""); // l'effacer
Sessio.reset(); // nouvel identifiant visiteur (déconnexion, changement de compte)#Comment ça marche
- Visiteurs : un identifiant aléatoire est créé au premier lancement et conservé. C'est lui qui compte les visiteurs uniques, nouveaux et récurrents.
- Sessions : une session démarre à chaque lancement à froid, et une nouvelle quand l'application est restée plus de 30 minutes en arrière-plan. Au retour dans l'app, le même écran continue : il ne compte pas comme une nouvelle vue.
- Hors-ligne : les événements sont conservés sur le téléphone (1 000 au plus) et envoyés par lots dès que le réseau revient, avec un délai croissant entre les essais, de 2 secondes à 5 minutes. Chaque événement porte un identifiant unique : un lot renvoyé n'est jamais compté deux fois.
- Aucun blocage : toutes les méthodes rendent la main tout de suite ; le stockage et le réseau se font sur un fil à part.
- Pays et ville : déduits de l'adresse IP par le serveur, comme pour un site web.
#Ce qui est collecté
| Collecté | Détail |
|---|---|
| Vos données | les écrans vus et les événements que vous envoyez, avec leurs propriétés |
| Le contexte | l'heure, l'identifiant d'installation, la langue, le fuseau horaire |
| L'appareil | la version d'Android, le modèle et le fabricant, la taille et la densité de l'écran |
| L'application | la version et le build |
Ce qui n'est pas collecté : pas de replay ni d'enregistrement d'écran, pas de capture des appuis, pas de rapport de plantage, pas d'identifiant publicitaire, pas de contacts, pas de position précise.
#Vie privée
Le SDK n'utilise pas l'identifiant publicitaire. L'identifiant d'installation est propre à votre application ; Sessio.reset(); en crée un nouveau. N'envoyez pas de données personnelles dans les noms d'écrans ni dans les propriétés des événements.
#Consentement
Sessio.optOut(); // l'utilisateur refuse : plus rien n'est envoyé, même après un redémarrage
Sessio.optIn(); // il accepte, ou revient sur son refus
boolean refus = Sessio.isOptedOut(); // true s'il a refuséPour ne rien envoyer avant d'avoir demandé, appelez Sessio.optOut(); au premier lancement, puis Sessio.optIn(); quand la personne accepte.
#Dépannage
#Rien n'arrive dans le dashboard
- Activez le mode
debug(4ᵉ valeur deSessioOptions, voir plus haut) et lisez Logcat (adb logcat -s Sessio) : chaque envoi y est écrit. - Vérifiez le code de suivi : un code inconnu est refusé et les données sont abandonnées.
- En développement sur l'émulateur, le serveur de votre machine se joint en
http://10.0.2.2:<port>, et le HTTP en clair doit être autorisé (android:usesCleartextTraffic="true").
#Gradle ne trouve pas io.sessio:sessio-android
Le dépôt doit être déclaré là où votre projet déclare les siens : dans settings.gradle (dependencyResolutionManagement) pour un projet récent, sinon dans le build.gradle racine (allprojects { repositories { … } }).
#Un écran est compté deux fois
Un suivi par SessioNavigation.track et des Sessio.screen() à la main pour les mêmes écrans : gardez l'un ou l'autre.