Bienvenue à Blogs CodeS-SourceS Identification | Inscription | Aide

[WP7] Utiliser le flash comme lampe torche

Windows Phone 7 ne proposait jusque-là pas d’API permettant de contrôler l’allumage du flash, aussi toutes les applications de prétendues lampe torche se contentaient d’afficher une image blanche sur l’écran. Mango offre un plus grand contrôle sur la camera, mais toujours pas de moyen direct de piloter le flash. Cependant, une solution de contournement existe.

Cette solution de contournement c’est la fonction d’autofocus. En effet, l’application peut paramétrer la caméra pour que le flash soit toujours allumé lors des prises de photos. Dans ce cas-là, la caméra reste également allumée pendant le focus. Du coup, la technique est simple : il suffit de demander au système d’effectuer l’autofocus en boucle.

Tout d’abord, nous initialisons la caméra lors du chargement de la page, dans la méthode “OnNavigatedTo”. L’initialisation de la caméra est asynchrone, nous nous abonnons donc à l’évènement “Initialized” :

   1: protected PhotoCamera Camera { get; set; }
   2:  
   3: protected override void OnNavigatedTo(System.Windows.Navigation.NavigationEventArgs e)
   4: {
   5:     base.OnNavigatedTo(e);
   6:  
   7:     this.Camera = new PhotoCamera(CameraType.Primary);
   8:  
   9:     this.Camera.Initialized += this.Camera_Initialized;
  10: }

Notez que le constructeur de l’objet “PhotoCamera” prend un paramètre permettant de choisir entre la caméra frontale ou la caméra “normale”.

Dans la fonction “Camera_Initialized”, nous vérifions que l’initialisation s’est correctement déroulée, et nous indiquons à la caméra de toujours utiliser le flash, à l’aide de la propriété “FlashMode”. Finalement, nous nous abonnons à l’évènement signalant la fin de l’autofocus, et nous demandons à la caméra de lancer le focus une première fois.

   1: private void Camera_Initialized(object sender, CameraOperationCompletedEventArgs e)
   2: {
   3:     if (!e.Succeeded)
   4:     {
   5:         this.Dispatcher.BeginInvoke(() => MessageBox.Show("Initialization error: " + e.Exception));
   6:         return;
   7:     }
   8:  
   9:     this.Camera.FlashMode = FlashMode.On;
  10:  
  11:     this.Camera.AutoFocusCompleted += this.Camera_AutoFocusCompleted;
  12:  
  13:     this.Camera.Focus();
  14: }

Dans la méthode “Camera_AutoFocusCompleted”, nous nous contentons de relancer le focus pour que celui-ci se fasse en boucle :

   1: private void Camera_AutoFocusCompleted(object sender, CameraOperationCompletedEventArgs e)
   2: {
   3:     this.Camera.Focus();
   4: }

Après test, ça fonctionne ! Le flash reste allumé, avec un léger clignotement de temps à autres signalant l’intervalle entre la fin du focus et le lancement d’un nouveau.

Un petit problème demeure : en quittant l’application, une exception est levée indiquant que la méthode Focus ne peut pas être appelée sur l’objet “PhotoCamera” disposé. Pour y remédier, nous nous désabonnons de l’évènement “AutoFocusCompleted” lorsque l’utilisateur navigue hors de la page :

   1: protected override void OnNavigatedFrom(System.Windows.Navigation.NavigationEventArgs e)
   2: {
   3:     this.Camera.AutoFocusCompleted -= this.Camera_AutoFocusCompleted;
   4:  
   5:     base.OnNavigatedFrom(e);
   6: }

Et nous voilà avec une application de lampe torche fonctionnelle !

Publié lundi 19 septembre 2011 21:17 par KooKiz
Ce post vous a plu ? Ajoutez le dans vos favoris pour ne pas perdre de temps à le retrouver le jour où vous en aurez besoin :

Commentaires

# re: [WP7] Utiliser le flash comme lampe torche

Désolé mais l'appli Flash HTC qui date du lancement de WP7 allume bel et bien le flash.

mardi 20 septembre 2011 08:23 by richardc

# re: [WP7] Utiliser le flash comme lampe torche

Exact, mais elle utilise des API natives qui ne sont pas accessibles au développeurs tiers. Les utilisateurs de téléphone d'autres constructeurs (Samsung par exemple) n'avaient aucune solution disponible. A part quelques applications homebrew qui s'appuyaient sur des fonctions normalement non accessibles, et qui ne pouvaient donc pas être publiées sur le marketplace.

mardi 20 septembre 2011 16:43 by KooKiz
Les commentaires anonymes sont désactivés

Les 10 derniers blogs postés

- Intégration Yammer et SharePoint Online (Office 365), étape 1 … par Le blog de Patrick [MVP SharePoint] le 06-12-2013, 17:37

- [Dynamics CRM] Ajouter les dossiers de CRM au dossier Favoris d’Outlook par Christine Dubois le 06-10-2013, 15:50

- Visual Studio 2013 par Etienne Margraff le 06-04-2013, 10:26

- Configurer la collation SQL Server pour SharePoint par Blog de Jérémy Jeanson le 06-03-2013, 19:48

- Etendre le Team Web Access de TFS 2012 – Step 1: Création du plugin par Philippe Didiergeorges Aka Philess le 06-03-2013, 07:30

- Livre Blanc : Développer des applications NUI par Fathi Bellahcene le 06-01-2013, 11:35

- [Dynamics CRM 2011] Copier une vue d'entité par Christine Dubois le 05-29-2013, 13:20

- [Conf’SharePoint 2013] Mes présentations… par Le blog de Patrick [MVP SharePoint] le 05-28-2013, 09:04

- [wpdev] Storage bug in MediaLibrary.SavePicture par Kévin Gosse le 05-26-2013, 19:08

- VMMap en mode instrumentation sur système 64bit : attention à la plateforme cible du build .NET par CoqBlog le 05-25-2013, 22:25