Changelog v1.5.0¶
⬇️ Télécharger cette page en Markdown
Support des Vidéos (5 secondes max)¶
Date : 03 Janvier 2026
Capture et Upload de Vidéos¶
Nouveau module VideoCompressor.kt¶
Fichier : utils/VideoCompressor.kt (240 lignes)
Fonctionnalités : - Durée maximale : 5 secondes (troncature automatique si dépassement) - Taille maximale : 5 MB - Format : MP4 (conversion automatique via MediaMuxer) - Validation automatique (dimensions, durée, taille)
Base de Données Étendue¶
PhotoEntity Modifié¶
Nouveaux champs :
mediaType: MediaType // PHOTO ou VIDEO
durationMs: Long? // Durée en millisecondes
photoData: String? // Données Base64 pour upload
Enum MediaType :
Migration : Version base de données 3 → 4
Interface Utilisateur Enrichie¶
ReportScreen Amélioré¶
4 boutons de capture : - Photo (caméra) - Galerie (photos) - Vidéo 5s (caméra) - Galerie ▶ (vidéos)
Aperçu vidéos avec indicateurs : - Bordure bleue (2dp) - Icône ▶ centrée - Badge durée en bas à droite (ex: "3s")
Compteur séparé : "2 photo(s) • 1 vidéo(s)"
Traitement des Vidéos¶
ReportViewModel Étendu¶
Nouvelle méthode : addVideo(uri: Uri)
Pipeline : 1. Validation avec VideoCompressor.getVideoInfo() 2. Troncature automatique si durée > 5 secondes 3. Conversion Base64 pour upload API 4. Stockage dans PhotoEntity (isVideo=true)
Algorithme de Troncature¶
trimVideoTo5Seconds()¶
Fonctionnement : - Utilise MediaExtractor pour lire la vidéo source - Utilise MediaMuxer pour écrire la vidéo tronquée - Copie toutes les pistes (vidéo + audio) - Arrêt à 5000ms (5 secondes exactement)
Fichier : VideoCompressor.kt:119-188
API et Backend¶
Nouveau Format JSON¶
Endpoint : submit_incident.php
Méthode : submitIncidentJson() avec @Body
Structure VideoData :
Request SubmitIncident :
{
"mairie_id": 1,
"type_id": 1,
"photos": ["data:image/jpeg;base64,..."],
"videos": [
{
"video": "data:video/mp4;base64,...",
"latitude": 43.7102,
"longitude": 7.2620
}
]
}
Nouvelle Table videos_incident¶
Colonnes : - id, incident_id, type, filename, filepath, description - duration (secondes), filesize (bytes), mime_type - latitude, longitude, encrypted
Contraintes : - Foreign key vers incidents (CASCADE DELETE) - Indexes : incident_id, type, encrypted, GPS
Stockage : /uploads/videos/ (fichiers MP4)
Migration : database/migration_videos.sql
Backend PHP - Upload Vidéos avec Validation GPS¶
API submit_incident.php Étendue¶
Lignes 175-245
Traitement :
1. Décodage Base64 : data:video/{type};base64,...
2. Extraction GPS depuis VideoData.latitude/longitude
3. Validation GPS automatique :
- Comparaison distance vidéo ↔ incident (Haversine)
- Seuil alerte : 100 mètres
- Warning logged si distance > 100m
Sauvegarde :
- Format : {incident_id}_video_{timestamp}_{index}.{ext}
- Insertion BDD avec métadonnées complètes
- Réponse JSON enrichie : videos_uploaded, gps_warnings[]
Backoffice Mairies - Lecteur Vidéo¶
incident_detail.php Modifié¶
Validation GPS vidéos (lignes 506-519) :
- Comparaison avec incident (tolérance 0.0001° ≈ 11m)
- Flag gps_differs si écart détecté
Section "Vidéos du signalement" (lignes 1248-1317) :
- Lecteur HTML5 <video controls preload="metadata">
- Grid responsive : minmax(400px, 1fr)
- Affichage métadonnées : nom, date, taille MB
- Alerte GPS si coordonnées différentes :
- Badge orange ⚠️ "Localisation différente du signalement"
- Coordonnées exactes (6 décimales)
- Liens Google Maps + OpenStreetMap
- Badge vert ✓ si localisation conforme
Avertissement RGPD pour les Vidéos¶
Dialogue d'Avertissement Obligatoire¶
Déclenchement : Avant capture/sélection vidéo
Contenu : - Icône ⚠️ orange (48dp) - Titre : "⚠️ Important - Protection des données" - Message explicatif : Floutage automatique non disponible pour vidéos
Recommandations RGPD : - Évitez de filmer des personnes identifiables - Concentrez-vous sur le problème à signaler - Respectez la vie privée des passants
Boutons : "Annuler" ou "J'ai compris, continuer"
Engagement : Confirmation explicite requise
Fichier : ReportScreen.kt:691-782
Limitations Connues¶
Floutage Vidéos Non Implémenté
⚠️ Floutage des visages non implémenté pour les vidéos
Raison : Complexité élevée (traitement frame par frame requis)
Solution future : ML Kit Face Detection sur chaque frame
Mitigation actuelle : Dialogue d'avertissement RGPD obligatoire
Fichiers Modifiés¶
utils/VideoCompressor.kt(nouveau, 240 lignes)data/local/entities/PhotoEntity.kt- Ajout mediaType, durationMsdata/local/AppDatabase.kt- Version 4data/local/Converters.kt- TypeConverters pour MediaTypeui/screens/report/ReportScreen.kt- Interface capture vidéoui/screens/report/ReportViewModel.kt- Traitement vidéo
Dépendances¶
Android SDK : - MediaExtractor - MediaMuxer - MediaMetadataRetriever
Aucune dépendance externe ajoutée
Tests¶
- ✅ Compilation réussie (BUILD SUCCESSFUL)
- ⏳ Tests sur appareil physique requis
- ⏳ Validation de l'upload vers l'API backend