[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 !
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 :