Prendre des photos en utilisant des interfaces FireMonkey

De RAD Studio
Aller à : navigation, rechercher

Remonter à Tutoriel mobile : Prendre une photo et la partager, et partager du texte (iOS et Android)


Ce tutoriel explique comment prendre et gérer des photos sur vos périphériques mobiles en utilisant les interfaces IFMXPhotoLibrary et IFMXCameraService.

Construction de l'interface utilisateur pour votre application

Déposez les composants suivants sur le Concepteur de fiches :

  • Composant TToolBar
    • Sur la barre d'outils, placez deux composants TSpeedButton. Vous allez utiliser ces boutons pour prendre des photos avec la caméra du périphérique et les sélectionner dans la bibliothèque de photos du périphérique.
    • Dans l'inspecteur d'objets, spécifiez les propriétés suivantes pour ces boutons :
      • Définissez la propriété StyleLookup sur cameratoolbuttonbordered et searchtoolbuttonbordered, respectivement.
      • Définissez la propriété Align sur Left et Right, respectivement.
  • Composant TImage
    • Définissez la propriété Align sur Client.

Avant que vous définissiez le style ou la vue dans le Concepteur de fiches, la fiche de cette application exemple doit maintenant ressembler à l'écran suivant :

CameraAppUIElements1.png

Remarque : Pour plus d'informations sur la sélection du style et des vues, voir Sélecteur de style et Utilisation des vues FireMonkey.

Prise d'une photo avec la caméra du périphérique

Pour prendre des photos avec une caméra de périphérique mobile, vous pouvez utiliser l'interface IFMXCameraService. Procédez comme suit :

  1. Ouvrez l'éditeur de code et ajoutez les lignes suivantes à votre code si elles ne sont pas déjà présentes :
    Delphi :
    uses
      FMX.MediaLibrary, FMX.Platform, System.Messaging;
    
    C++ :
    #include <FMX.Platform.hpp>
    #include <FMX.MediaLibrary.hpp>
    #include <System.Messaging.hpp>
    
  2. Ajoutez l'en-tête de procédure suivant à la section private de la définition de fiche :
    Delphi :
     procedure DoDidFinish(Image: TBitmap);
     procedure DoMessageListener(const Sender: TObject; const M: TMessage);
    
    C++ :
    void __fastcall DoDidFinish(TBitmap *Image);
    void __fastcall DoMessageListener(const TObject *Sender, TMessage const *M);
    
  3. Dans la section implementation, définissez DoDidFinish et DoMessageListener comme suit :
    Delphi :
     procedure TForm1.DoDidFinish(Image: TBitmap);
    begin
      Image1.Bitmap.Assign(Image);
    end;
    
    procedure TForm1.DoMessageListener(const Sender: TObject; const M: TMessage);
    begin
      if M is TMessageDidFinishTakingImageFromLibrary then
        Image1.Bitmap.Assign(TMessageDidFinishTakingImageFromLibrary(M).Value);
    end;
    
    C++ :
    void __fastcall TForm1::DoDidFinish(TBitmap *Image) {
    	Image1->Bitmap->Assign(Image);
    }
    
    void __fastcall TForm1::DoMessageListener(const TObject *Sender, TMessage const *M) {
    	TMessageDidFinishTakingImageFromLibrary const *v = dynamic_cast<TMessageDidFinishTakingImageFromLibrary const *>(M);
    	if (v) {
    		Image1->Bitmap->Assign(v->Value);
    	}
    }
    
  4. Sur le Concepteur de fiches, double-cliquez sur le bouton SpeedButton1 puis, dans l'éditeur de code, implémentez le gestionnaire d'événement onClick suivant :
    Delphi :
     procedure TForm1.SpeedButton1Click(Sender: TObject);
    var
      Service: IFMXCameraService;
      Params: TParamsPhotoQuery;
    begin
      if TPlatformServices.Current.SupportsPlatformService(IFMXCameraService,
        Service) then
      begin
        Params.Editable := True;
        // Specifies whether to save a picture to device Photo Library
        Params.NeedSaveToAlbum := True;
        Params.RequiredResolution := TSize.Create(640, 640);
        Params.OnDidFinishTaking := DoDidFinish;
        Service.TakePhoto(SpeedButton1, Params);
      end
      else
        ShowMessage('This device does not support the camera service'); 
    end;
    
    C++ :
    void __fastcall TForm1::SpeedButton1Click(TObject *Sender) {
    	_di_IFMXCameraService service;
    	TParamsPhotoQuery params;
    	if (TPlatformServices::Current->SupportsPlatformService
    		(__uuidof(IFMXCameraService)) && (service =
    		TPlatformServices::Current->GetPlatformService
    		(__uuidof(IFMXCameraService)))) {
    		params.Editable = true;
    		// Specifies whether to save a picture to device Photo Library
    		params.NeedSaveToAlbum = true;
    		params.RequiredResolution = TSize(640, 640);
    		params.OnDidFinishTaking = DoDidFinish;
    		service->TakePhoto(SpeedButton1, params);
    
    	}
    	else {
    		ShowMessage("This device does not support the camera service");
    	}
    }
    

Exécution de l'application

Exécutez l'application sur votre périphérique mobile en appuyant sur F9 ou en choisissant Exécuter > Exécuter. Pour activer la caméra du périphérique, appuyez sur l'icône de la caméra sur la barre d'outils de votre application :

iOS Android

TakePicture IOS.png

TakePicture Android.png

Pour utiliser cette photo :

  • Sur les périphériques Android, cliquez sur OK.
  • Sur les périphériques iOS, cliquez sur Use.

Enregistrement d'une photo dans la bibliothèque de photos du périphérique

Pour que votre application enregistre automatiquement les photos prises par la caméra du périphérique dans la bibliothèque de photos de ce périphérique, définissez le champ NeedSaveToAlbum du second paramètre de la méthode TakePhoto sur True (voir les extraits de code à l'étape 4 de la procédure ci-dessus).

Votre application enregistre les photos dans un album au sein de la bibliothèque de photos du périphérique. Le nom de l'album dépend du système d'exploitation du périphérique, comme indiqué ci-dessous :

Version du système d'exploitation   Nom de l'album  
iOS Pellicule
Android Caméra

Sélection d'une photo dans la bibliothèque de photos du périphérique

FireMonkey définit l'interface IFMXTakenImageService qui vous permet de sélectionner une photo à partir de la bibliothèque de photos du périphérique.

Pour que votre application sélectionne une photo à partir de la bibliothèque de photos du périphérique, procédez comme suit :

  1. Sur le Concepteur de fiches, double-cliquez sur le bouton SpeedButton2 (afin de choisir une photo), puis dans l'éditeur de code, implémentez le gestionnaire d'événement onClick suivant :
    Delphi :
    procedure TForm1.SpeedButton2Click(Sender: TObject);
    var
      ImageService: IFMXTakenImageService;
      Params: TParamsPhotoQuery;
    begin
      if TPlatformServices.Current.SupportsPlatformService(IFMXTakenImageService,
        IInterface(ImageService)) then
      begin
        Params.RequiredResolution := TSize.Create(640, 640);
        Params.OnDidFinishTaking := DoDidFinish;
        ImageService.TakeImageFromLibrary(SpeedButton2, Params);
      end;
    end;
    
    C++ :
    void __fastcall TForm1::SpeedButton2Click(TObject *Sender) {
    	_di_IFMXTakenImageService service;
    	TParamsPhotoQuery params;
    	if (TPlatformServices::Current->SupportsPlatformService
    		(__uuidof(IFMXTakenImageService)) && (service =
    		TPlatformServices::Current->GetPlatformService
    		(__uuidof(IFMXTakenImageService)))) {
    		params.RequiredResolution = TSize(640, 640);
    		params.OnDidFinishTaking = DoDidFinish;
    		service->TakeImageFromLibrary(SpeedButton2, params);
    
    	}
    	else {
    		ShowMessage("This device does not support the photo library service");
    	}
    }
    
  2. Dans la vue Structure, sélectionnez Form1, puis dans l'inspecteur d'objets, ouvrez l'onglet Evénements, double-cliquez sur un champ vide en regard de OnCreate, et implémentez le gestionnaire d'événement onFormCreate suivant :
    Delphi :
     procedure TForm1.FormCreate(Sender: TObject);
    begin
    TMessageManager.DefaultManager.SubscribeToMessage(TMessageDidFinishTakingImageFromLibrary, DoMessageListener);
    end;
    
    C++ :
    void __fastcall TForm1::FormCreate(TObject *Sender) {
    	TMessageManager::DefaultManager->SubscribeToMessage(__classid(TMessageDidFinishTakingImageFromLibrary),
    		TMessageListenerMethod(&DoMessageListener));
    }
    
  3. Compilez et exécutez votre application. Pour sélectionner une photo, appuyez sur le bouton de recherche, puis sélectionnez la photo de votre choix dans la bibliothèque de photos du périphérique.
    iOS Android

    TakePhotoFromLibraryAction.PNG

    Android SelectfromLibrary.png

    Remarque : Sur les iPad, l'application affiche des miniatures des photos dans une fenêtre popup en regard de l'élément de contrôle spécifié dans le premier paramètre de la méthode TakeImageFromLibrary. Dans notre projet exemple, SpeedButton2 se réfère au bouton de recherche.

Voir aussi