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) ! :

Nom : Screenshot_20200107-095154[1].png
Affichages : 830
Taille : 764,3 Ko

Voici mon code source :

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;
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 :

...
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
...
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
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