Les applications Android s'exécutent sur plus de facteurs de forme que les téléphones tenus en mode Portrait. Avec l'introduction du fenêtrage du bureau, des écrans connectés et des appareils pliables, votre application d'appareil photo doit s'adapter aux tailles de fenêtre dynamiques, aux formats variables et au matériel externe.
Pourquoi la logique du téléphone est-elle interrompue ?
Les applications de caméras font souvent des hypothèses qui entraînent des échecs critiques dans les environnements multifactoriels.
Orientation naturelle
- Hypothèse : l'orientation naturelle de l'appareil
ROTATION_0est toujours en mode portrait. - Réalité : Sur les tablettes, l'écran intérieur de certains appareils pliables et les écrans d'ordinateur,
ROTATION_0est souvent en mode paysage. - Résultat : l'aperçu est incorrectement pivoté de 90 degrés.
Alignement des capteurs
- Hypothèse : le bord long du capteur de l'appareil photo est aligné sur le bord long de l'écran.
- Réalité : une fenêtre redimensionnable peut être carrée ou au format paysage, tandis que le capteur reste fixe (généralement au format 4:3).
- Résultat : images étirées ou déformées
Densité et taille de l'écran
- Hypothèse : la densité et la taille de l'écran ne changent pas au moment de l'exécution.
- Réalité : dans les environnements de bureau, les utilisateurs redimensionnent librement les fenêtres.
- Résultat : le redémarrage de la session de caméra à chaque événement de déplacement perturbe l'expérience utilisateur et peut entraîner des plantages.
Solution 1 : Utiliser les intents système
Si votre application doit prendre une photo ou enregistrer une vidéo, mais n'a pas besoin d'une interface de caméra personnalisée spécialisée, la meilleure façon de gérer les différents facteurs de forme est de lancer la caméra système préinstallée de l'appareil (voir Intents de l'appareil photo).
L'utilisation d'un intent système délègue l'intégralité de l'expérience de capture à l'application d'appareil photo développée par le fabricant d'équipement d'origine (OEM) de l'appareil. Cela permet d'externaliser la complexité de la prise en charge des facteurs de forme, y compris :
Prise en charge intégrée du redimensionnement et de la rotation : l'application Appareil photo par défaut sur un appareil pliable ou une tablette est explicitement conçue par le fabricant pour gérer la géométrie spécifique de cet appareil. L'application est conçue pour se comporter correctement lorsque l'appareil est déplié, pivoté ou mis en mode multifenêtre.
Accès aux fonctionnalités matérielles avancées : les applications d'appareil photo OEM ont un accès exclusif aux algorithmes optimisés pour le matériel (mode Nuit, HDR, changement d'objectif spécifique) qui sont difficiles, voire impossibles à reproduire manuellement.
Solution 2 : Utiliser Jetpack CameraX
CameraX est une bibliothèque Jetpack conçue pour faciliter le développement d'applications d'appareil photo. CameraX tient compte du cycle de vie et est orienté surface. Contrairement à Camera2, qui nécessite un recalcul manuel de l'orientation du capteur et des tailles de surface chaque fois qu'un appareil se plie, pivote ou est redimensionné, CameraX gère automatiquement la reconfiguration des sessions de caméras lors du redimensionnement multifenêtre ou lorsqu'une application est déplacée vers un écran connecté, ce qui garantit que le flux d'aperçu s'adapte sans saccades ni étirements.
Les composants tels que PreviewView gèrent intelligemment le format et les types de mise à l'échelle dans différents états, par exemple lorsqu'un appareil pliable passe de l'écran de couverture à l'écran intérieur. Vous pouvez ainsi prendre en charge un large éventail de matériel avec une implémentation unique et cohérente, plutôt qu'avec une collection complexe de cas extrêmes spécifiques à chaque appareil.
Compose
Avec Jetpack Compose, utilisez la bibliothèque dédiée androidx.camera:camera-compose. La bibliothèque fournit le composable CameraXViewfinder, qui est spécifiquement conçu pour gérer la géométrie complexe du redimensionnement, de la rotation et des formats dans le cycle de vie de Compose.
Le composant CameraXViewfinder élimine les sources d'erreurs les plus courantes dans les applications d'appareil photo :
- Transformation automatique des coordonnées : l'une des parties les plus difficiles de la création d'une application d'appareil photo consiste à mapper l'appui d'un utilisateur (coordonnées x et y à l'écran) au système de coordonnées du capteur de l'appareil photo (0-1, 0-1 rotation) pour la mise au point et la mesure de l'exposition.
CameraXViewfinderfournit unCoordinateTransformerqui gère automatiquement les calculs, même lorsque la fenêtre est redimensionnée ou que l'appareil est plié. - Comportement de mise en page correct : contrairement à
SurfaceViewouTextureView,CameraXViewfinderfonctionne correctement avec l'ordre Z de Compose. Vous pouvez superposer des éléments d'interface utilisateur (anneaux de sélection, commandes) ou appliquer des modificateurs (arrondir les angles, animations) sans artefacts de rendu. - Redimensionnement et format :
CameraXViewfindergère en interne la logique recadrer au centre vs ajuster au centre, ce qui garantit que l'aperçu ne s'étire pas lorsque la fenêtre de l'application est redimensionnée dans des formats non standards (par exemple, en mode écran partagé ou fenêtré sur ordinateur).
Vues
Dans les applications basées sur les vues, utilisez PreviewView ou ViewFinderView.
Si vous utilisez directement SurfaceView ou TextureView, vous devez calculer vous-même le format et appliquer la matrice de transformation appropriée.
Solution 3 : Gérer l'orientation et le redimensionnement de manière dynamique
Lorsque vous utilisez directement les API de plate-forme, gardez à l'esprit la rotation de l'appareil, les redémarrages d'activité et le format.
Arrêter d'utiliser la rotation de l'appareil
Ne vous fiez pas uniquement à Display#getRotation() ou à l'orientation du capteur physique pour déterminer la mise en page de votre UI.
- Utilisez les métriques de fenêtre : déterminez votre mise en page (interface utilisateur en mode paysage ou portrait) en comparant la largeur et la hauteur de la fenêtre de votre application à l'aide de
WindowManager#getCurrentWindowMetrics(). - Ignorer l'orientation naturelle : votre application peut se trouver dans une fenêtre en forme de portrait sur un écran paysage. L'orientation de l'appareil n'a aucune incidence sur les limites de votre UI.
Éviter les redémarrages d'activité
Le comportement Android par défaut détruit l'activité de votre application lors des modifications de configuration (comme le redimensionnement de la fenêtre). Pour les applications de caméras, cela se manifeste par un scintillement de l'écran ou une perte de connexion lors des appels vidéo.
- Configuration du fichier manifeste : déclarez les modifications de configuration dans votre fichier manifeste pour gérer le redimensionnement sans redémarrer.
- Mises à jour dynamiques : dans
onConfigurationChanged(), mettez à jour les paramètres de mise en page de l'aperçu de votre caméra pour qu'ils correspondent à la nouvelle taille de la fenêtre.
Format et recadrage
Un problème courant sur les appareils pliables et les fenêtres de bureau est l'étirement de l'aperçu, où un flux de caméra 4:3 est forcé dans une fenêtre 16:9 ou 1:1.
- Ne pas étirer : ne forcez jamais le tampon de la caméra à correspondre exactement aux limites de la vue si les formats de l'aperçu et de la fenêtre diffèrent.
- Recadrer au centre (recommandé) : mettez à l'échelle l'aperçu pour qu'il remplisse la dimension la plus courte de la fenêtre et recadrez l'excédent. Cela permet de s'assurer que le sujet reste non déformé et remplit le cadre.
- Centrer (alternative) : si l'affichage du champ de vision complet est essentiel (par exemple, pour numériser un document), mettez l'aperçu au format Letterbox dans la fenêtre.
- Centrer (alternative) : si l'affichage du champ de vision complet est essentiel (par exemple, pour numériser un document), mettez l'aperçu au format Letterbox dans la fenêtre.
Bonus : Compatibilité avec les expériences axées sur les appareils pliables
Les appareils pliables ne sont pas de simples téléphones qui se plient. Ils offrent des états matériels uniques qui peuvent améliorer fondamentalement la façon dont les utilisateurs prennent des photos et des vidéos. Au lieu de considérer le pli comme un problème à résoudre, utilisez-le pour créer des fonctionnalités impossibles sur les appareils non pliables.
Mode sur table (capture mains libres)
Le mode sur table permet aux utilisateurs de plier l'appareil à moitié et de le poser sur une surface pour les appels vidéo prolongés, les photos en accéléré et les photos de nuit à longue exposition.
Mode d'affichage arrière (selfies de haute qualité)
- Sur les appareils pliables, les caméras arrière sont généralement de meilleure qualité que les caméras frontales. Le mode d'affichage arrière permet à l'utilisateur de déplier l'appareil et de le retourner, en utilisant le petit écran de couverture comme viseur en direct pour la caméra arrière principale.
- Le mode écran arrière permet de prendre des selfies de 50 Mpx ou plus, des photos de groupe ultra grand-angle et des vlogs de haute qualité sans avoir à transporter d'équipement supplémentaire.
Mode Dual Screen (aperçu de la fonctionnalité)
- Le mode Dual Screen vous permet d'afficher l'aperçu de la caméra sur les écrans intérieur et extérieur simultanément. Cette fonctionnalité est idéale pour photographier des personnes : les sujets peuvent se voir sur l'écran extérieur et ajuster leur pose pendant que vous cadrez la photo sur l'écran intérieur.
- Contrairement au mode d'affichage arrière (qui déplace l'intégralité de l'application), le mode double écran crée une fenêtre de présentation secondaire sur l'écran de couverture.