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:
@@ -32,4 +32,24 @@
|
|||||||
<!-- Permissions -->
|
<!-- Permissions -->
|
||||||
|
|
||||||
<uses-permission android:name="android.permission.INTERNET" />
|
<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>
|
</manifest>
|
||||||
|
|||||||
@@ -27,7 +27,7 @@
|
|||||||
<key>LSRequiresIPhoneOS</key>
|
<key>LSRequiresIPhoneOS</key>
|
||||||
<true/>
|
<true/>
|
||||||
<key>NSCameraUsageDescription</key>
|
<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>
|
<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>
|
<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>
|
<key>NSHealthUpdateUsageDescription</key>
|
||||||
@@ -41,7 +41,7 @@
|
|||||||
<key>NSSupportsLiveActivities</key>
|
<key>NSSupportsLiveActivities</key>
|
||||||
<true/>
|
<true/>
|
||||||
<key>NSPhotoLibraryUsageDescription</key>
|
<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>
|
<key>UIBackgroundModes</key>
|
||||||
<array>
|
<array>
|
||||||
<string>remote-notification</string>
|
<string>remote-notification</string>
|
||||||
|
|||||||
Reference in New Issue
Block a user