RDS
Digital Signage RDS — Documentación
ES EN CA FR PT

Agent Android — Exploitation

Cycle de vie

Boot → MyReceiver (BOOT_COMPLETED) → AutoStartUp service → MainActivity
                                          │
                                          ▼
                                 Heartbeat au serveur
                                          │
                              ┌───────────┴────────────┐
                              ▼                        ▼
                  Serveur répond "0"            Pas d'internet / non
                       (autorisé)              autorisé → réessai
                              │
                              ▼
                       PlayerActivity (plein écran)
                              │
                              ▼
                     Lit playlist.txt local
                              │
                              ▼
                Boucle MP4 / JPG / PNG

Synchronisation des contenus

Le service en arrière-plan AutoStartUp :

  1. Sonde le serveur toutes les N secondes (configurable).
  2. Compare la liste de fichiers du serveur avec celle en local.
  3. Télécharge ceux qui manquent ou ont changé, en vérifiant l'intégrité par CRC32. Lorsqu'un fichier est entièrement téléchargé, un fichier compagnon .ok est créé à côté.
  4. Réécrit playlist.txt (JSON) avec l'ordre actuel et les durées par élément.
  5. Le lecteur relit playlist.txt au début de chaque tour de boucle — les changements s'appliquent sans redémarrer l'app.

Formats supportés

Type Détails
Vidéo MP4 (H.264). Joue intégralement à chaque tour.
Image statique JPG, PNG. Durée configurée dans la playlist.
GIF Détecté mais omis (non joué).
Fallback Si aucun contenu n'est disponible, affiche une image par défaut (sat.jpg).

Modes d'affichage

Deux layouts sélectionnables depuis les paramètres Admin :

Rapport d'état

À chaque heartbeat l'agent envoie :

Ces valeurs sont celles affichées dans la colonne État playlist du panneau.

Captures d'écran distantes

Depuis le panneau, Actions → Capture d'écran déclenche une capture de l'appareil. Le serveur injecte un drapeau (screenshot:1) dans la prochaine réponse gps (≤ 60 s) ; AutoStartUp le détecte et délègue à ScreenshotCapture.

L'agent essaie trois voies dans l'ordre, de la plus à la moins capable :

Voie 1 — AccessibilityService (recommandé, setup unique requis)

ScreenshotAccessibilityService est un service système qui capture tout l'écran de l'appareil — inclut l'UI système, autres apps, dialogues d'erreur / ANR, lockscreen et, surtout, le dialogue "app crashed" si le kiosk a planté. Survit aux crashs d'Activity / Service car Android relance automatiquement les bindings d'accessibilité.

Exigences :

Si le service n'est pas activé, l'agent enregistre dans agent.log au démarrage :

[SCREENSHOT] Full-screen captures disabled — enable 'Digital Signage RDS' in
              Settings → Accessibility for captures that work even when the
              kiosk app is not foreground.

Voie 2 — Frame du média en lecture (PlayerActivity)

Si l'AccessibilityService n'est pas actif et que le mode actif est playlist, l'agent :

Cela évite le problème du rectangle noir causé par PixelCopy(Window) qui ne peut pas lire l'overlay matériel du SurfaceView où la vidéo est rendue.

Voie 3 — PixelCopy de la fenêtre (KioskBrowserActivity / fallback)

Pour le mode Web (WebView, sans overlay matériel) ou en dernier recours : PixelCopy.request(Window, …) sur API ≥ 26 — capture WebView/Surface accélérés par GPU. View.draw(Canvas) sur API 24-25.

Commun aux trois voies

Détail du flux dans le panneau.

Crash recovery

MyExceptionHandler capture les exceptions non gérées et redémarre l'app automatiquement. Cela garantit que l'appareil reprend la lecture du contenu même après une défaillance ponctuelle.

Logs

L'agent envoie des logs opérationnels au serveur. Pour les voir depuis le panneau : Appareils → Actions → Logs.

Mises à jour

L'APK vérifie actuellement la version la plus récente et, si une nouvelle existe, télécharge le nouveau APK depuis le serveur (descarregar_apk.php). Le comportement exact dépend de la configuration du fabricant ; dans certains déploiements la mise à jour est poussée à distance depuis Promotienda.

Limitations connues

Endpoints HTTP utilisés

Endpoint Fonction
suport/WebServiceTablet.php?accio=esticViu Heartbeat / auth
suport/WebServiceTablet.php?accio=estat&estat=N Rapport d'état de la playlist
descarregar_apk.php Auto-update de l'APK