Bonnes feuilles : Développer pour l'Iphone et l'Ipad Ajouter des photos ou des vidéos

UIKit [le framework graphique du runtime de l'iPhone NDLR] propose un accès unifié pour ajouter des photos ou des vidéos à l'intérieur d'une application. La fonction exacte est déterminée en indiquant un type de source :

 UIImagePickerControllerSourceTypePhotoLibrary : permet de choisir (en lecture seule) une photo parmi les albums.

 UIImagePickerControllerSourceTypeCamera : permet de réaliser un cliché avec l'appareil photo.

 UIImagePickerControllerSourceTypeSavedPhotosAlbum : permet de choisir (en lecture ou modification) une photo dans l'album "pellicule".

L'interface utilisateur de la fonction correspondante est gérée par une instance de la classe UIImagePickerController. La première fonction de cette classe est d'indiquer les fonctionnalités disponibles sur le périphérique.

La méthode de classe availableMediaTypesForSourceType: indique la liste des types de sources disponibles.

La méthode de classe isSourceTypeAvailable: permet de connaître la disponibilité d'une source.


Il est important de réaliser ces tests avant d'accéder à une source. En effet, une source peut être physiquement présente sur le périphérique mais être occupée par une autre opération.


Les autres propriétés de cette classe précisent le mode d'accès aux photos ou aux vidéos :

 sourceType indique le type de source que gère le contrôleur.

 mediaTypes est un tableau contenant les types de données à considérer par le capteur :
  - kUTTypeImage : photo
  - kUTTypeMovie : vidéo

 allowsEditing autorise la modification du contenu.

 videoQuality précise la qualité vidéo avec trois valeurs possibles :
  - UIImagePickerControllerQualityTypeMedium : qualité par défaut.
  - UIImagePickerControllerQualityTypeHigh : meilleure qualité possible. La vidéo obtenue est destinée à être jouée sur le périphérique ou bien transférée par Wifi.
  - UIImagePickerControllerQualityTypeLow : faible qualité pour permettre le transfert de la vidéo sur le réseau cellulaire.

 videoMaximumDuration fixe une durée maximale d'enregistrement.

L'instruction suivante donne accès à l'ensemble des possibilités du capteur :

 picker.mediatypes = [UIImagePickerController
availableMediaTypesForSourceType:
UIImagePickerControllerSourceTypeCamera];

Cette classe dérive de UINavigationController. L'écran géré par ce contrôleur est généralement invoqué et révoqué par les méthodes classiques détaillées lors de l'enchaînement modal au chapitre 11 :

 presentModalViewController:animated: pour afficher l'interface.

 dismissModalViewControllerAnimated: pour faire disparaître l'interface.

Les éléments d'interface déclenchent des actions qui sont prises en compte par le contrôleur. Si l'application souhaite réaliser des opérations sur ces différentes actions, elle peut fournir au contrôleur un délégué. Ce délégué implémente le protocole UIImagePickerControllerDelegate.

Ce protocole définit deux méthodes :

 Avec imagePickerController:didFinishPickingMediaWithInfo: le contrôleur indique que l'utilisateur a récupéré une image ou une vidéo. Le dictionnaire
info permet d'obtenir les détails de cette action :
  - La clé UIImagePickerControllerMediaType est associée à la chaîne kUTTypeImage ou kUTTypeMovie pour indiquer s'il s'agit d'une photo ou d'une vidéo.
  - La clé UIImagePickerControllerOriginalImage est associée à une instance de UIImage contenant l'image originale.
  - La clé UIImagePickerControllerEditedImage est associée à une instance de UIImage contenant l'image telle que l'a modifiée l'utilisateur.
  - La clé UIImagePickerControllerCropRect est associée à un objet de type NSValue qui contient le rectangle de rognage de l'image. La méthode
CGRectValue permet de récupérer ce rectangle.
  - La clé UIImagePickerControllerMediaURL est associée à l'URL du fichier contenant la vidéo sélectionnée par l'utilisateur.

 Si le délégué est appelé avec la méthode imagePickerControllerDidCancel:, cela signifie que l'utilisateur n'a pas souhaité récupérer d'élément.

En général, ces deux méthodes se terminent en révoquant l'interface utilisateur du contrôleur avec un appel à dismissModalViewControllerAnimated:.

Voici un exemple de code permettant à l'utilisateur de choisir une image dans les albums :

 @interface ChooseImageController : UIViewController
<UINavigationControllerDelegate, UIImagePickerControllerDelegate> {
}
- (IBAction)test:(id)sender;
@end
...
- (IBAction)test:(id)sender {
UIImagePickerController *picker = [[UIImagePickerController alloc] init];
picker.sourceType = UIImagePickerControllerSourceTypePhotoLibrary;
picker.mediaTypes = [UIImagePickerController
availableMediaTypesForSourceType:
UIImagePickerControllerSourceTypePhotoLibrary];
picker.delegate = self;
[self presentModalViewController:picker animated:YES];
}
- (void)imagePickerController:(UIImagePickerController *)picker
didFinishPickingMediaWithInfo:(NSDictionary *)info {
UIImage *image = [info objectForKey:UIImagePickerControllerOriginalImage];
// Utilisation de l'image
[self dismissModalViewControllerAnimated:YES];
}
- (void)imagePickerControllerDidCancel:(UIImagePickerController *)picker {
[self dismissModalViewControllerAnimated:YES];
}


Le chapitre 15 démontre comment mettre en oeuvre la "réalité augmentée" à partir de ces fonctions.