Bonjour,
Je développe une application mobile pour Android et iOS. J'ai besoin d'utiliser l'appareil photo dans mon appli et je rencontre des soucis exclusivement sous Android
En effet, lorsque je valide la photo que j'ai prise, mon application redémarre (mais ce n'arrive pas systématiquement à chaque prise de photo) ! :
Voici mon code source :
Après avoir cherché les raisons de ces redémarrages (cela survient à la validation de la photo prise mais pas de manière systématique), j'ai lu la description de la classe TMessageDidFinishTakingImageFromCamera :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59 procedure TFRapportInterventionFrm.btnTakePhotoClick(Sender: TObject); begin // Demande d'autorisations PermissionsService.RequestPermissions([PermissionCamera, PermissionReadExternalStorage, PermissionWriteExternalStorage], TakePicturePermissionRequestResult, DisplayRationale); end; procedure TFRapportInterventionFrm.TakePicturePermissionRequestResult( Sender: TObject; const APermissions: TArray<string>; const AGrantResults: TArray<TPermissionStatus>); var Service: IFMXCameraService; Params: TParamsPhotoQuery; begin // 3 permissions involved: CAMERA, READ_EXTERNAL_STORAGE and WRITE_EXTERNAL_STORAGE if (Length(AGrantResults) = 3) and (AGrantResults[0] = TPermissionStatus.Granted) and (AGrantResults[1] = TPermissionStatus.Granted) and (AGrantResults[2] = TPermissionStatus.Granted) then begin if TPlatformServices.Current.SupportsPlatformService(IFMXCameraService, Service) then begin Params.Editable := False; // Specifies whether to save a picture to device Photo Library Params.NeedSaveToAlbum := True; Params.RequiredResolution := TSize.Create(1024, 1024); Params.OnDidFinishTaking := DoDidFinish; Service.TakePhoto(btnTakePhoto, Params); end else TDialogService.ShowMessage('L''appareil photo n''est pas supporté par cet appareil'); end else TDialogService.ShowMessage('Impossible de prendre une photo car les autorisations n''ont pas été accordées'); end; procedure TFRapportInterventionFrm.DoDidFinish(Image: TBitmap); var bmp: TBitmap; begin if Assigned(Image) then begin bmp := TBitmap.Create; try bmp.Assign(Image); bmp.SaveToFile(TPath.Combine(TPath.GetSharedPicturesPath, 'picture_' + FormatDateTime('yyyymmdd_hhnnss', Now) + '.png')); AjouterImage(bmp, '', ''); finally FreeAndNil(bmp); end; end; end; procedure TFRapportInterventionFrm.AjouterImage(const AImage: TBitmap; const ANomFichier: String; const ACommentaires: String); begin // Traitement de mon image pour mon application mobile ... end;
Mais j'avoue que ça ne me dit pas comment faire pour ne plus avoir ces problèmes de redémarrage sous Android (ça marche nickel sous iOS), c'est pourquoi je poste ce message...
Les messages TMessageDidFinishTakingImageFromCamera sont envoyés uniquement si l'appel à IFMXCameraService.TakePhoto ne spécifie pas un gestionnaire d'événement permettant de prendre une photo. Toutefois, même si vous spécifiez ce gestionnaire d'événement, Android peut décharger votre application alors que votre utilisateur est en train de prendre une photo. Quand votre application a à nouveau la focalisation, il se peut qu'elle ait redémarré et que toutes les informations d'événement transmises lors de l'appel à IFMXCameraService.TakePhoto soient perdues, ce qui explique pourquoi un message TMessageDidFinishTakingImageFromCamera est envoyé à la place.
...
FireMonkey envoie uniquement ce type de message sur Android
...
Merci pour vos retours !
PS : j'ai testé mon code sur un Motorola G7 Android 9.0 et Samsung A5 2017 Android 8.0 mais le comportement est le même sur les 2 appareils
Partager