IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Composants FMX Delphi Discussion :

Utilisation de l'appareil photo dans mon appli mobile [Android]


Sujet :

Composants FMX Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Mai 2007
    Messages
    79
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 79
    Par défaut Utilisation de l'appareil photo dans mon appli mobile
    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 : 849
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

  2. #2
    Membre Expert
    Avatar de ALWEBER
    Homme Profil pro
    Expert Delphi
    Inscrit en
    Mars 2006
    Messages
    1 543
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 70
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Expert Delphi

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 543
    Billets dans le blog
    10
    Par défaut
    Je crois qu'il y a un programme à ce sujet dans les exemples fournis en standard
    Pour XE7 :
    C:\Users\Public\Documents\Embarcadero\Studio\15.0\Samples\Object Pascal\Mobile Snippets\AccessCameraApp

  3. #3
    Membre confirmé
    Inscrit en
    Mai 2007
    Messages
    79
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 79
    Par défaut
    Citation Envoyé par ALWEBER Voir le message
    Je crois qu'il y a un programme à ce sujet dans les exemples fournis en standard
    Pour XE7 :
    C:\Users\Public\Documents\Embarcadero\Studio\15.0\Samples\Object Pascal\Mobile Snippets\AccessCameraApp
    Tout à fait, ce tutoriel fonctionne parfaitement !

    Après plusieurs heures à chercher des solutions, je pense savoir d'où viens le problème : il n'est pas logiciel, mais matériel. En effet, mon application tourne à merveille sur un Samsung S10+ qui a une quantité de RAM nettement supérieure aux appareils utilisés pour mes tests. J'ai voulu vérifier cette hypothèse d'une autre manière : j'ai relancé mon application sur des téléphones moins performants (Samsung A5 2017 et Motorola G7) en ayant au préalable pris le soin de baisser la résolution de l'appareil photo au plus bas ; et depuis, mon application fonctionne très bien avec ces nouveaux réglages !

    Je confirme donc que les tutos Delphi fonctionne car l'application n'est pas très grosse, et ça permet d'utiliser l'appareil photo sans problème.
    En revanche, mon application est nettement plus grosse (plusieurs dizaines de fiches et plusieurs dizaines de milliers de lignes), et l'utilisation de l'appareil photo nécessite un réglage de la résolution des photos prises !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Peux-t'on utiliser un assemby 2.0 dans une appli 1.1 ?
    Par RamDevTeam dans le forum Framework .NET
    Réponses: 1
    Dernier message: 19/09/2006, 17h32
  2. [Framework] que des SELECT dans mon appli Web.
    Par ohyes_ dans le forum JDBC
    Réponses: 16
    Dernier message: 03/08/2006, 19h25
  3. Utiliser une ligne de commande dans mon programme.
    Par Someonelse dans le forum MFC
    Réponses: 3
    Dernier message: 20/06/2006, 16h11
  4. Réponses: 3
    Dernier message: 03/04/2006, 18h30
  5. [] Utiliser AVI d'une DLL dans mon programme
    Par seb.49 dans le forum VB 6 et antérieur
    Réponses: 5
    Dernier message: 02/05/2003, 14h52

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo