Le scan de code-barres ne pouvait pas fonctionner sur Android

Le manifest ne declarait que INTERNET. Or /meals scanne via
navigator.mediaDevices.getUserMedia() : Capacitor 8 relaie bien la demande
(BridgeWebChromeClient.onPermissionRequest mappe VIDEO_CAPTURE sur
Manifest.permission.CAMERA, puis lance le permissionLauncher), mais il ne peut
demander a l'utilisateur que ce qui est declare dans le manifest. La permission
etant absente, le scan etait le seul chemin casse - <input capture> continuait
de marcher, puisqu'il delegue a l'app appareil photo par intent.

CAMERA implique android.hardware.camera ET android.hardware.camera.autofocus en
fonctionnalites REQUISES, donc filtrage au Play Store, tant qu'on ne les
redeclare pas en required="false". Les deux sont donc declarees explicitement :
le scan demande facingMode ideal, pas exact, l'app reste utilisable sans.

Cote iOS, les libelles de permission ne decrivaient que le scan de code-barres
et la photo de profil, alors que la camera et la photothèque servent aussi a
photographier une assiette et une etiquette nutritionnelle pour analyse. Un
libelle qui ne couvre pas l'usage reel est un motif classique de rejet App
Store. NSPhotoLibraryAddUsageDescription reste inutile : rien n'ecrit dans la
photothèque (aucun PHPhotoLibrary ni UIImageWriteToSavedPhotosAlbum dans ios/).

Les deux fichiers sont bien formes (xml.etree, plistlib). Rien n'est compile
ici : reste a verifier sur un appareil que le dialogue camera apparait et que
le flux video s'affiche.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
Sylvain Bettinelli
2026-08-10 08:10:10 +00:00
parent 1c0e0320a9
commit ebb9273dc3
2 changed files with 22 additions and 2 deletions

View File

@@ -32,4 +32,24 @@
<!-- Permissions -->
<uses-permission android:name="android.permission.INTERNET" />
<!-- Caméra : la page /meals de l'app web utilise navigator.mediaDevices.getUserMedia()
pour le scan de code-barres (BarcodeDetector natif, repli ZXing) et des
<input type="file" accept="image/*" capture="environment"> pour photographier
une assiette / une étiquette nutritionnelle.
Capacitor 8 relaie ces demandes au runtime :
- getUserMedia -> BridgeWebChromeClient.onPermissionRequest() (VIDEO_CAPTURE -> Manifest.permission.CAMERA)
- input capture -> BridgeWebChromeClient.onShowFileChooser() (isMediaCaptureSupported() -> permissionLauncher)
mais il ne peut demander que ce qui est déclaré ici. -->
<uses-permission android:name="android.permission.CAMERA" />
<!-- La permission CAMERA implique android.hardware.camera ET
android.hardware.camera.autofocus en fonctionnalités REQUISES (donc filtrage
Play Store) tant qu'on ne les redéclare pas explicitement en required="false".
Réf. https://developer.android.com/guide/topics/manifest/uses-feature-element
(§ "Permissions that Imply Feature Requirements").
Le scan demande facingMode: { ideal: 'environment' } — "ideal", pas "exact" —
donc l'app reste utilisable sans caméra arrière ni autofocus. -->
<uses-feature android:name="android.hardware.camera" android:required="false" />
<uses-feature android:name="android.hardware.camera.autofocus" android:required="false" />
</manifest>

View File

@@ -27,7 +27,7 @@
<key>LSRequiresIPhoneOS</key>
<true/>
<key>NSCameraUsageDescription</key>
<string>Coach Hypnotruck peut utiliser l'appareil photo pour scanner les codes-barres alimentaires.</string>
<string>Coach Hypnotruck utilise l'appareil photo pour scanner les codes-barres des aliments, photographier vos assiettes et photographier les étiquettes nutritionnelles. Ces images servent à identifier l'aliment et à estimer ses valeurs nutritionnelles, puis à alimenter votre journal alimentaire.</string>
<key>NSHealthShareUsageDescription</key>
<string>Coach Hypnotruck lit vos données de santé (FC, pas, calories, VO2max) pour adapter vos séances et tracker votre progression.</string>
<key>NSHealthUpdateUsageDescription</key>
@@ -41,7 +41,7 @@
<key>NSSupportsLiveActivities</key>
<true/>
<key>NSPhotoLibraryUsageDescription</key>
<string>Coach Hypnotruck peut accéder à vos photos pour ajouter une photo de profil.</string>
<string>Coach Hypnotruck accède à vos photos pour importer une image déjà prise : photo d'assiette ou d'étiquette nutritionnelle à analyser, photo de séance, ou photo de profil. Seules les images que vous choisissez sont envoyées, pour alimenter votre journal alimentaire et votre compte.</string>
<key>UIBackgroundModes</key>
<array>
<string>remote-notification</string>