Contexte
J’avais un besoin simple sur le papier : permettre à des utilisateurs Android de partager directement une photo depuis leur galerie ou Google Photos vers mon application Oracle APEX, qui est packagée en PWA.
Objectif : que l’utilisateur choisisse Partager → mon appli et que la photo soit automatiquement transmise à APEX.
2. Défi technique
Oracle APEX n’intègre pas nativement la fonctionnalité Web Share Target API, qui permet aux PWA de recevoir des fichiers depuis le menu de partage du mobile.
Problème supplémentaire : l’architecture ORDS sur le cloud impose des chemins fixes (/pls/apex/<workspace>/...
), compliquant l’intégration directe dans le service worker.
3. La solution
Après plusieurs tests et un dialogue avec ChatGPT, la clé a été de :
- Déclarer un
share_target
dans lemanifest.json
de l’appli APEX. - Utiliser un Service Worker custom pour intercepter le
POST
envoyé par Android au partage. - Récupérer le fichier envoyé (
formData
) dans le SW, compresser l’image pour limiter la taille (500 Ko max), et l’envoyer vers un REST ORDS dédié. - Retourner un script de redirection vers une page APEX publique avec l’
ID
de la photo.
4. Points techniques clés
- Activation immédiate du Service Worker (
skipWaiting()
etclients.claim()
). - Compression côté client via
OffscreenCanvas
et réduction progressive de qualité. - Possibilité d’extraire les données EXIF GPS avant compression.
- Gestion des erreurs (
405 Method Not Allowed
sur mauvais endpoint, écran blanc Android lors du premier partage). Ce point est encore à améliorer.
5. Résultat
✅ Les utilisateurs peuvent désormais partager une photo directement depuis Google Photos ou la galerie vers l’appli APEX.
✅ Temps d’envoi réduit grâce à la compression locale.
✅ Intégration fluide dans un environnement cloud sans modification du serveur APEX.
6. Conclusion / Call to Action
Cette approche montre que même avec les contraintes d’APEX et ORDS sur le cloud, il est possible de tirer parti des APIs modernes du Web pour offrir une expérience mobile plus naturelle.
Ce post a été rédigé avec ChatGPT