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

- Emportez votre sélection de la MSDN dans la poche ? par Blog de Jérémy Jeanson le il y a 9 heures et 56 minutes

- [ #Office365 ] Pb de connexion du flux Yammer ajouté à un site SharePoint par Le blog de Patrick [MVP SharePoint] le il y a 15 heures et 18 minutes

- NFluent & Data Annotations : coder ses propres assertions par Fathi Bellahcene le il y a 15 heures et 26 minutes

- Installer un site ASP.net 32bits sur un serveur exécutant SharePoint 2013 par Blog de Jérémy Jeanson le 04-17-2014, 06:34

- [ SharePoint Summit 2014 ] Tests de montée en charge SharePoint par Le blog de Patrick [MVP SharePoint] le 04-16-2014, 20:44

- [ SharePoint Summit 2014 ] Bâtir un site web public avec Office 365 par Le blog de Patrick [MVP SharePoint] le 04-16-2014, 18:30

- Kinect + Speech Recognition + Eedomus = Dommy par Aurélien GALTIER le 04-16-2014, 17:17

- [ SharePoint Summit 2014 ] Une méthodologie simple pour concevoir vos applications OOTB SharePoint de A à Z par Le blog de Patrick [MVP SharePoint] le 04-16-2014, 16:51

- //Lean/ - Apprendre à faire des Apps Windows universelles par Blog de Jérémy Jeanson le 04-16-2014, 12:57

- Une culture de la donnée pour tous… par Le blog de Patrick [MVP SharePoint] le 04-16-2014, 11:00