Photos et autres sensors sur Windows Phone

1,130 views
919 views

Published on

La photographie est devenue un scénario clé pour les smartphones. Nous sommes de plus en plus à délaisser nos appareils photo numériques au profit de notre téléphone. Le Nokia Lumia 1020, primé à de nombreuses reprises en est l'illustration. Nous verrons comment tirer partie de toute la puissance de votre smartphone, de la prise de vue au traitement d'image. Dans un deuxième temps, nous verrons comment enrichir une application en exploitant tous les capteurs embarqués : GPS, accéléromètre, bousole, gyroscope... Et pour finir, nous les combinerons tous en créant de la réalité augmentée.

Speakers : Nicolas Delabarre (Nokia), Nicolas Calvi (Wygwam)

Published in: Technology
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total views
1,130
On SlideShare
0
From Embeds
0
Number of Embeds
1
Actions
Shares
0
Downloads
23
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide
  • Image source: Utilisé en début de traitement, cette source fournit l’image originale générée ou créée depuis un stockage .Toutes les sources d’image implémentent l’interface IImageProvider.Effect: Prends une ou plusieurs images en entrée , exécute un traitement et délivre une nouvelle image en sortie. Toutes les classes de type « Effect » implémentent l’interface IImageConsumer, prenant en entrée une image source originale ; par ailleurs tout comme les classes de type « images sources », un objet « Effect » implémente l’interface IImageProvider pour la génération de l’image résultanteRenderer: Intervient à la fin du traitement. Il a pour rôle de convertir l’image résultante du traitement dans un format particulier (JPEG, bitmap …) consommé par l’application. Ce type d’objet implémente l’interface IImageConsumer
  • Queue : FIFO appartenant au namespaceSystem.Collections.GenericAction : Classe delegate appartenant au namespace System
  • Camera : Implementations de l’interfaceICameraCaptureDeviceinclut les objets de type PhotoCaptureDevice et AudioVideoCaptureDevice.Sourced’imagescompressées (PNG/JPEG) : StreamImageSource / BufferImageSource / StorageFileImageSource / RandomAccessStreamImageSource
  • Exemple implémentant une nouvelle classe, dérivée de CustomEffectBaseIl faudra surcharger la méthode OnProcess, donnant directement accès aux pixels d’originePixelRegionest utilisée comme “helper class” afin de parcourir les pixels de la source et la cible Dans l’exemple ci-joint, MyCustomFilterdouble la valeur de chaque composante RGB
  • Paramètres du filterChromakeyFilter :Couleur qui sera remplacée par de la transparenceTolérancedans la valeur de couleurremplacée (0 : tolerance faible, 1 : tolerance large)Niveau de suppression de bruit (0 : bruit faible, 1 : bruit visible)
  • Photos et autres sensors sur Windows Phone

    1. 1. Nokia Internal Use Only
    2. 2. Photos et autres Sensors sur Windows Phone Nicolas CALVI Consultant / Formateur MVP Hardware Interaction Design & Development Wygwam Nicolas DELABARRE Relations techniques développeurs Code/Developpement Code/developpement Nokia Internal Use Only
    3. 3. Donnez votre avis ! Depuis votre smartphone sur : http://notes.mstechdays.fr De nombreux lots à gagner toute les heures !!! Claviers, souris et jeux Microsoft… Merci de nous aider à améliorer les Techdays ! #mstechdays Code/developpement Nokia Internal Use Only
    4. 4. WINDOWS PHONE Un téléphone plein de ressources #mstechdays Code/developpement Nokia Internal Use Only
    5. 5. Qu’est-ce que Windows Phone ? Un OS créer par Microsoft à destination des Constructeurs de SmartPhone. Une expérience unique grâce a Modern UI Des usages multiples • • Grand public Entreprise #mstechdays Code/developpement Nokia Internal Use Only
    6. 6. Qu’est-ce que Windows Phone ? Un concentré de technologie - Caméra jusqu’à 41 MP - Flash - GPS - Accéléromètre - Baromètre (Altimètre) - Gyroscope - Wifi, Bluetooth, 4G - NFC - Magnétomètre (Boussole) - Capteur de lumière ambiant - Capteur de proximité -… #mstechdays Code/developpement Nokia Internal Use Only
    7. 7. Qu’allons nous aborder ? Les senseurs Non accessible - Caméra > Vidéo > Photo - Accéléromètre - Compas - GPS - Gyroscope - Inclinomètre - Motion API - Capteur de proximité - Capteur de luminosité On finira par de la Réalité Augmentée avec GART Le capteur NFC ne sera pas traiter dans cette session #mstechdays Code/developpement Nokia Internal Use Only
    8. 8. SENSEUR : LA CAMÉRA Il sait voir au-delà de votre perception #mstechdays Code/developpement Nokia Internal Use Only
    9. 9. Comment afficher le flux vidéo ? // Le namespace using System.Windows.Media; // Création du device de capture vidéo CaptureSource captureSource = new CaptureSource(); VideoCaptureDevice device = CaptureDeviceConfiguration.GetDefaultVideoCaptureDevice(); // On vérifie si la capture est possible if (device != null) { // On crée un Brush pour afficher la vidéo dans notre UI VideoBrush videoBrush = new VideoBrush(); videoBrush.SetSource(captureSource); VideoRect.Fill = videoBrush; // Rectangle dans notre XAML // On démarre la préview Vidéo captureSource.Start(); } #mstechdays Code/developpement Nokia Internal Use Only
    10. 10. Comment afficher le flux vidéo ? Ne pas oublier de fermer la camera video ! protected override void OnNavigatingFrom(NavigatingCancelEventArgs e) { if (captureSource != null) captureSource.Stop(); base.OnNavigatingFrom(e); } #mstechdays Code/developpement Nokia Internal Use Only
    11. 11. Comment prendre une photo ? // On vérifie si la caméra est disponible if ((PhotoCamera.IsCameraTypeSupported(CameraType.Primary) == true) || (PhotoCamera.IsCameraTypeSupported(CameraType.FrontFacing) == true)) { PhotoCamera photoCamera; // Initialise la caméra en fonction des capacitées trouvées if (PhotoCamera.IsCameraTypeSupported(CameraType.Primary)) photoCamera = new PhotoCamera(CameraType.Primary); else photoCamera = new PhotoCamera(CameraType.FrontFacing); // On se branche sur les événements photoCamera.Initialized += OnPhotoCameraInitialized; photoCamera.CaptureCompleted += OnPhotoCameraCaptureCompleted; photoCamera.CaptureImageAvailable += OnPhotoCameraCaptureImageAvailable; photoCamera.CaptureThumbnailAvailable += OnPhotoCameraCaptureThumbnailAvailable; // Création d'un Brush pour afficher le buffer dans notre UI VideoBrush photoBrush = new VideoBrush(); photoBrush.SetSource(photoCamera); // Affectation du Brush a notre zone de rendu PhotoRect.Fill = photoBrush; // Rectangle dans notre XAML } #mstechdays Code/developpement Nokia Internal Use Only
    12. 12. Comment prendre une photo ? // Déclenche la prise de photo photoCamera.CaptureImage(); OnPhotoCameraCaptureImageAvailable OnPhotoCameraCaptureCompleted OnPhotoCameraCaptureThumbnailAvailable #mstechdays Code/developpement Nokia Internal Use Only
    13. 13. Comment prendre une photo ? // On sauvegarde la photo dans la média MediaLibrary librarylibrary = new MediaLibrary(); library.SavePictureToCameraRoll("MonFichier.jpg", e.ImageStream); // On se repositionne au début du flux de l'image e.ImageStream.Seek(0, SeekOrigin.Begin); // Enregistrement de la photo en JPEG dans le répertoire local using (IsolatedStorageFile isStore = IsolatedStorageFile.GetUserStoreForApplication()) { using (IsolatedStorageFileStream targetStream = isStore.OpenFile(fileName, FileMode.Create, FileAccess.Write)) { // Initialisation du buffer (4ko) byte[] readBuffer = new byte[4096]; int bytesRead = -1; // On copie l'image dans le répertoire local while ((bytesRead = e.ImageStream.Read(readBuffer, 0, readBuffer.Length)) > 0) targetStream.Write(readBuffer, 0, bytesRead); } } // On ferme le fichier e.ImageStream.Close(); #mstechdays Code/developpement Nokia Internal Use Only
    14. 14. Comment prendre une photo ? Ne pas oublier de fermer la camera photo ! protected override void OnNavigatingFrom(NavigatingCancelEventArgs e) { if (photoCamera != null) { photoCamera.Initialized -= OnPhotoCameraInitialized; photoCamera.CaptureCompleted -= OnPhotoCameraCaptureCompleted; photoCamera.CaptureImageAvailable -= OnPhotoCameraCaptureImageAvailable; photoCamera.CaptureThumbnailAvailable -= OnPhotoCameraCaptureThumbnailAvailable; photoCamera.Dispose(); } base.OnNavigatingFrom(e); } #mstechdays Code/developpement Nokia Internal Use Only
    15. 15. Prise de photo haute résolution Lumia 1020 7712 x 4352 (16:9) 7136 x 5360 (4:3) Lumia 1520 5376 x 3024 (16:9) 4992 x 3744 (4:3) #mstechdays Code/developpement Nokia Internal Use Only
    16. 16. NOKIA IMAGING SDK 1.0 Allez plus loin avec ses photos #mstechdays Code/developpement Nokia Internal Use Only
    17. 17. Qu’est-ce que le SDK Nokia Imaging ? • Librairie native Windows Phone 8, accessible depuis des projets WP8 C#, VB et C++ • Inclus plus de 50 filtres de traitement d’images et effets visuels paramétrables • Ne nécessite aucune connaissance particulière en traitement algorithmique d’images • Décodage JPEG partiel – basée sur la technologie RAJPEG, afin d’accéder aux données sans décoder toute l’image JPEG : • Prévisualisation rapide • Application d’effets, tels que la rotation ou le cropping d’images haute résolution #mstechdays Code/developpement Nokia Internal Use Only
    18. 18. Liste de filtres et effets (1/3) #mstechdays Code/developpement Nokia Internal Use Only
    19. 19. Liste de filtres et effets (2/3) #mstechdays Code/developpement Nokia Internal Use Only
    20. 20. Liste de filtres et effets (3/3) #mstechdays Code/developpement Nokia Internal Use Only
    21. 21. Enchaînement de filtres Image originale +Milky +Flip +Crop +Lomo #mstechdays Code/developpement Nokia Internal Use Only
    22. 22. Architecture générale • Cette librairie est architecturée en 3 blocs : • Image sources (e.g. bitmaps, streams, files) • Effect (e.g. 50+ filtres) • Renderers (outputs bitmaps or files) • En combinant ces blocs, on va créer un tunnel de traitement d’image ( ou “rendering pipeline”) • Une fois le tunnel créé, il est possible de modifier les paramètres de filtres ou leur #mstechdays Code/developpement séquencement. Nokia Internal Use Only Image Source Filter Effects MagicPen Filter Filter Flip Rotation Filter Renderer
    23. 23. Producteur / Consommateur #mstechdays Code/developpement Nokia Internal Use Only
    24. 24. Comment appliquer un filtre à une photo ? // Création d'un nokia stream à partir d'un IO Stream using(var source = new StreamImageSource(e.ChosenPhoto)) // Création d'un effet initial à partir de la source stream nokia using (var effect = new FilterEffect(source)) // Instanciation d'un render de type "WriteableBitmap" using( var render = new WriteableBitmapRenderer(effect, _writeableBitmapTarget)) { // Création de la liste des filtres var filters = new List<IFilter>(); filters.Add(new MagicPenFilter()); // Affectation de la liste de filtres à notre objet "effet" effect.Filters = filters; // Exécution du rendu await render.RenderAsync(); // Force le repaint de l'image résultante _writeableBitmapTarget.Invalidate(); } #mstechdays Code/developpement Nokia Internal Use Only
    25. 25. Et plusieurs filtres ? // Création d'un nokia stream à partir d'un IO Stream using( var source = new StreamImageSource(e.ChosenPhoto)) // Création d'un effet initial à partir de la source stream nokia using( var effect = new FilterEffect(source)) // Instanciation d'un render de type "WriteableBitmap" using( var render = new WriteableBitmapRenderer(effect, _writeableBitmapTarget)) { // Création de la liste des filtres var filters = new List<IFilter>(); filters.Add(new MagicPenFilter()); filters.Add(new RotationFilter(15)); // Affectation de la liste de filtres à notre objet "effet" effect.Filters = filters; // Exécution du rendu await render.RenderAsync(); // Force le repaint de l'image résultante _writeableBitmapTarget.Invalidate(); } #mstechdays Code/developpement Nokia Internal Use Only
    26. 26. Modifier les paramètres de filtre Les paramètres peuvent être changés sans reconstruire le tunnel de traitement. • Néanmoins il faut garder à l’esprit : • Que le rendu est asynchrone, les paramètres ne peuvent pas être changés en cours. • Attention avec certains contrôles UI (e.g. sliders) qui peuvent générer des événements n’importe quand ! • Astuce : utiliser une file d’attente d’événements de type Queue<Action>. #mstechdays Code/developpement Nokia Internal Use Only
    27. 27. Modifier les paramètres de filtre UI (Slider) Imaging SDK ValueChanged event Rendering a new preview ValueChanged event ValueChanged event #mstechdays Code/developpement Nokia Internal Use Only Rendering a new preview
    28. 28. Modifier les paramètres de filtre Définir une queue d’attente: Queue<System.Action> _toDo = new Queue<System.Action>(); Quand la ressource est occupée, empiler l’action dans la queue d’attente: _toDo.Enqueue( () => { _warpFilter.Level = newValue; } ); Lambda expression directement mise en queue Quand la ressource est dispo, traitement des actions en attente : while (_toDo.Count > 0) { Action action = _toDo.Dequeue(); action(); } await _renderer.RenderAsync(); #mstechdays Exécution des lambda expression Code/developpement Nokia Internal Use Only
    29. 29. Image Source Type de source Class ImageSource Name Stream System.IO.Stream StreamImageSource Image Bitmap Windows.Media.Imaging.WriteableBitmap BitmapImageSource Nokia.Graphics.Imaging.Bitmap Windows Buffer Windows.Storage.Streams.IBuffer BufferImageSource Camera Windows.Phone.Media.Capture. ICameraCaptureDevice CameraPreviewImageSource Flat Color Windows.Ui.Color ColorImageSource File Windows.Storage.IStorageFile StorageFileImageSource Random Access Stream Windows.Storage.Streams. IRandomAccessStream RandomAccessStreamImage Source #mstechdays Code/developpement Nokia Internal Use Only Image Source Filter Effects MagicPen Filter Filter Flip Rotation Filter Renderer
    30. 30. Renderer Image Source Type de Destination Class ImageSource Name Imaging SDK Bitmap Nokia.Graphics.Imaging.Bitmap BitmapRenderer Writeable Bitmaps (XAML Image ) WriteableBitmap WriteableBitmapRenderer JPEG Windows.Storage.Streams.IBuffer Filter Effects JpegRenderer MagicPen Filter Filter Flip Rotation Filter Renderer #mstechdays Code/developpement Nokia Internal Use Only
    31. 31. Implémentation de filtre personnalisé // Création d'un effet personnalisé public class MyCustomFilter : CustomEffectBase { public MyCustomFilter(IImageProvider source): base(source) { } protected override void OnProcess(PixelRegion sourcePixelRegion, PixelRegion targetPixelRegion) { sourcePixelRegion.ForEachRow((index, width, pos) => { for (int i = 0; i < width; ++i, ++index) { Windows.UI.Color c = ToColor(sourcePixelRegion.ImagePixels[index]); c.R = (byte)Math.Min(255, c.R * 2); c.G = (byte)Math.Min(255, c.G * 2); c.B = (byte)Math.Min(255, c.B * 2); targetPixelRegion.ImagePixels[index] = FromColor(c); } }); } } #mstechdays Code/developpement Nokia Internal Use Only
    32. 32. APIs pour créer des images sources de type gradients • Facilité d’utilisation • Faible empreinte mémoire Radial Gradient #mstechdays Linear Gradient Code/developpement Nokia Internal Use Only
    33. 33. Création d’image source gradient // Affectation de la source de notre Image XAML avec un writeable bitmap imageTarget.Source = _writeableBitmapTarget; // Création d'un gradient de couleur de type "radial" var rad = new RadialGradient(new Windows.Foundation.Point(0.5, 0.5), new EllipseRadius(0.3, 0.3)); rad.Stops = new GradientStop[] { new GradientStop() { Color = Windows.UI.Color.FromArgb(255, 255, 0, 0), Offset = 0 }, new GradientStop() { Color = Windows.UI.Color.FromArgb(255, 0, 255, 0), Offset = 1 } }; // Création d'une image source de type gradient à partir du gradient using (var grad = new GradientImageSource( new Windows.Foundation.Size(imageTarget.Width, imageTarget.Height), rad)) { // Instantiation d'un render de type "WriteableBitmap" initialisé avec notre gradient // source et le writeable bitmap de sortie var render = new WriteableBitmapRenderer(grad, _writeableBitmapTarget); // Exécution du rendu await render.RenderAsync(); } #mstechdays Code/developpement Nokia Internal Use Only
    34. 34. Blend modes 1ère image Blend mode: Color Burn #mstechdays Blend mode: Color Code/developpement Nokia Internal Use Only 2nde image Blend mode: Add
    35. 35. Blend d’une photo avec un gradient // Affectation de la source de notre Image XAML avec un writeable bitmap imageTarget.Source = _writeableBitmapTarget; // Création d'un nokia stream à partir d'un IO Stream using (var backgroundSource = new StreamImageSource(e.ChosenPhoto)) // Création d'une image source de type gradient à partir du gradient using(var foregroundSource = new GradientImageSource( ...)) // Création d'un filtre d'effet sourcé avec l'image choisie par l'utilisateur using(var filterEffect = new FilterEffect(backgroundSource)) // Création d'un filtre de blending sourcé avec l'image source gradient using(var blendFilter = new BlendFilter(foregroundSource)) // Instantiation d'un render de type "WriteableBitmap" initialisé avec notre filtre d'effet et le bitmap de sortie using(var renderer = new WriteableBitmapRenderer(filterEffect, _writeableBitmapTarget)) { // Configuration de notre filtre d'effet avec un seul effet ... notre effet blend blendFilter.BlendFunction = BlendFunction.Color; filterEffect.Filters = new IFilter[] { blendFilter }; // Exécution du rendu await renderer.RenderAsync(); // Force le repaint de l'image resultante _writeableBitmapTarget.Invalidate(); } #mstechdays Code/developpement Nokia Internal Use Only
    36. 36. ChromaKey + Blend #mstechdays Code/developpement Nokia Internal Use Only
    37. 37. Pour aller plus loin Point d’entrée des ressources techniques relative au SDK Imaging : http://developer.nokia.com/resources/library/Lumia/nokia-imaging-sdk.html Projets d’exemples basés sur le SDK Imaging (avec code source) : http://developer.nokia.com/resources/library/Lumia/nokia-imagingsdk/sample-projects.html Forum de discussion dédié au SDK Imaging : http://developer.nokia.com/community/discussion Articles Wiki : http://developer.nokia.com/community/wiki/Portal:Windows_Phone_Multi media #mstechdays Code/developpement Nokia Internal Use Only
    38. 38. SENSEUR : ACCELEROMETRE Une bonne raison de bouger utile #mstechdays Code/developpement Nokia Internal Use Only
    39. 39. Qu’est-ce que c’est ? Un accéléromètre est un capteur qui, fixé à un mobile ou tout autre objet, permet de mesurer l’accélération linéaire de ce dernier. On parle encore d'accéléromètre même s'il s'agit en fait de 3 accéléromètres qui calculent les 3 accélérations linéaires selon 3 axes orthogonaux. Source Wikipédia : http://fr.wikipedia.org/wiki/Acc%C3%A9l%C3%A9rom%C3%A8tre #mstechdays Code/developpement Nokia Internal Use Only
    40. 40. API spécifique Windows Phone 8 // Le namespace using Microsoft.Devices.Sensors; // Comment savoir si le téléphone supporte cette fonctionnalité if (!Accelerometer.IsSupported) return; // Comment l’instancier accelerometer = new Accelerometer(); accelerometer.TimeBetweenUpdates = TimeSpan.FromMilliseconds(20); // Comment récupérer l’information accelerometer.CurrentValueChanged += OnAccelerometerCurrentValueChanged; // Comment le démarrer accelerometer.Start(); #mstechdays Code/developpement Nokia Internal Use Only
    41. 41. API spécifique Windows Phone 8 private void OnAccelerometerCurrentValueChanged(object sender, SensorReadingEventArgs<AccelerometerReading> args) { AccelerometerReading reading = args.SensorReading; this.Dispatcher.BeginInvoke(() => { TxtTimestamp.Text = reading.Timestamp.ToString(); TxtAccelerationX.Text = reading.Acceleration.X.ToString(); TxtAccelerationY.Text = reading.Acceleration.Y.ToString(); TxtAccelerationZ.Text = reading.Acceleration.Z.ToString(); }); } #mstechdays Code/developpement Nokia Internal Use Only
    42. 42. API spécifique Windows Phone 8 Ne pas oublier de fermer le senseur ! protected override void OnNavigatingFrom(NavigatingCancelEventArgs e) { if (accelerometer != null) accelerometer.Stop(); base.OnNavigatingFrom(e); } #mstechdays Code/developpement Nokia Internal Use Only
    43. 43. API partagées avec Windows 8 // Le namespace using Windows.Devices.Sensors; // Comment l’instancier accelerometer = Accelerometer.GetDefault(); // Comment savoir si le téléphone supporte cette fonctionnalité if (accelerometer != NULL) return; // Comment récupérer l’information accelerometer.ReadingChanged += OnAccelerometerReadingChanged; #mstechdays Code/developpement Nokia Internal Use Only
    44. 44. API partagées avec Windows 8 private void OnAccelerometerReadingChanged(Accelerometer sender, AccelerometerReadingChangedEventArgs args) { AccelerometerReading reading = args.SensorReading; this.Dispatcher.BeginInvoke(() => { TxtTimestamp.Text = reading.Timestamp.ToString(); TxtAccelerationX.Text = reading.Acceleration.X.ToString("0.00"); TxtAccelerationY.Text = reading.Acceleration.Y.ToString("0.00"); TxtAccelerationZ.Text = reading.Acceleration.Z.ToString("0.00"); } } #mstechdays Code/developpement Nokia Internal Use Only
    45. 45. SENSEUR : COMPAS Pour que tout cela est un sens #mstechdays Code/developpement Nokia Internal Use Only
    46. 46. Qu’est-ce que c’est ? le compas magnétique, dont le principe de fonctionnement est, comme une boussole, l'orientation d'une aiguille aimantée dans le champ du magnétisme terrestre. Source Wikipédia : http://fr.wikipedia.org/wiki/Compas_(navigation) #mstechdays Code/developpement Nokia Internal Use Only
    47. 47. API spécifique Windows Phone 8 // Le namespace using Microsoft.Devices.Sensors; // Comment savoir si le téléphone supporte cette fonctionnalité if (!Compass.IsSupported) return; // Comment l’instancier compass = new Compass(); compass.TimeBetweenUpdates = TimeSpan.FromMilliseconds(20); // Comment récupérer l’information compass.CurrentValueChanged += OnCompassCurrentValueChanged; compass.Calibrate += OnCompassCalibrate; // Comment le démarrer compass.Start(); #mstechdays Code/developpement Nokia Internal Use Only
    48. 48. API spécifique Windows Phone 8 private void OnCompassCurrentValueChanged(object sender, SensorReadingEventArgs<CompassReading> args) { CompassReading reading = args.SensorReading; this.Dispatcher.BeginInvoke(() => { TxtTimestamp.Text = reading.Timestamp.ToString(); TxtMagneticHeading.Text = reading.MagneticHeading.ToString(); TxtTrueHeading.Text = reading.TrueHeading.ToString(); TxtAccuracy.Text = reading.HeadingAccuracy.ToString(); }); } #mstechdays Code/developpement Nokia Internal Use Only
    49. 49. API spécifique Windows Phone 8 private void OnCompassCalibrate(object sender, CalibrationEventArgs args) { // Mettre votre code ici // Le compas a besoin d’être calibré } #mstechdays Code/developpement Nokia Internal Use Only
    50. 50. API spécifique Windows Phone 8 Pour calibrer le compas, si la propriété « Accuracy » est supérieure à 15, il faut faire des « 8 » avec le téléphone. Ceci peut-être gérer dans l’interface, en affichant un texte d’aide invitant l’utilisateur a faire les « 8 ». Dès que la valeur descend en dessous de 15, on peut notifier l’utilisateur que le compas est calibré. #mstechdays Code/developpement Nokia Internal Use Only
    51. 51. API spécifique Windows Phone 8 Ne pas oublier de fermer le senseur ! protected override void OnNavigatingFrom(NavigatingCancelEventArgs e) { if (compass != null) compass.Stop(); base.OnNavigatingFrom(e); } #mstechdays Code/developpement Nokia Internal Use Only
    52. 52. API partagées avec Windows 8 // Le namespace using Windows.Devices.Sensors; // Comment l’instancier compass = Compass.GetDefault(); // Comment savoir si le téléphone supporte cette fonctionnalité if (compass != NULL) return; // Comment récupérer l’information compass.ReadingChanged += OnCompassReadingChanged; #mstechdays Code/developpement Nokia Internal Use Only
    53. 53. API partagées avec Windows 8 private void OnCompassReadingChanged(Compass sender, CompassReadingChangedEventArgs args) { CompassReading reading = args.SensorReading; this.Dispatcher.BeginInvoke(() => { CompassTime.Text = reading.Timestamp.ToString(); CompassMagneticHeading.Text = reading.HeadingMagneticNorth.ToString(); CompassTrueHeading.Text = reading.HeadingTrueNorth.Value.ToString(); } } #mstechdays Code/developpement Nokia Internal Use Only
    54. 54. SENSEUR : GPS Si vous n’avez pas le sens de l’orientation mieux vaut le consulter #mstechdays Code/developpement Nokia Internal Use Only
    55. 55. Qu’est-ce que c’est ? Le Global Positioning System (GPS) – que l'on peut traduire en français par « système de localisation mondial » – est un système de géolocalisation fonctionnant au niveau mondial. Source Wikipédia : http://fr.wikipedia.org/wiki/Global_Positioning_System #mstechdays Code/developpement Nokia Internal Use Only
    56. 56. API spécifique Windows Phone 8 // Le namespace using System.Device.Location; // Comment l’instancier gps = new GeoCoordinateWatcher(GeoPositionAccuracy.High); // Ou Default gps.MovementThreshold = 0; // Comment récupérer l’information gps.PositionChanged += OnGeoCoordinateWatcherPositionChanged; gps.StatusChanged += OnGeoCoordinateWatcherStatusChanged; // Comment le démarrer gps.Start(); #mstechdays Code/developpement Nokia Internal Use Only
    57. 57. API spécifique Windows Phone 8 private void OnGeoCoordinateWatcherStatusChanged(object sender, GeoPositionStatusChangedEventArgs args) { this.Dispatcher.BeginInvoke(() => { GPSManualStatus.Text = e.Status.ToString(); }); } // Les valeurs de Status GeoPositionStatus.Disabled .Initializing .NoData .Ready #mstechdays Code/developpement Nokia Internal Use Only
    58. 58. API spécifique Windows Phone 8 private void OnGeoCoordinateWatcherPositionChanged(object sender, GeoPositionChangedEventArgs<GeoCoordinate> args) { this.Dispatcher.BeginInvoke(() => { GPSTime.Text = e.Position.Timestamp.ToString(); GPSLatitude.Text = e.Position.Location.Latitude.ToString(); GPSLongitude.Text = e.Position.Location.Longitude.ToString(); GPSAltitude.Text = e.Position.Location.Altitude.ToString(); GPSHAccuracy.Text = e.Position.Location.HorizontalAccuracy.ToString(); GPSVAccuracy.Text = e.Position.Location.VerticalAccuracy.ToString(); GPSCourse.Text = e.Position.Location.Course.ToString(); GPSSpeed.Text = e.Position.Location.Speed.ToString(); GPSUnknown.Text = e.Position.Location.IsUnknown.ToString(); }); } #mstechdays Code/developpement Nokia Internal Use Only
    59. 59. API spécifique Windows Phone 8 Ne pas oublier de fermer le senseur ! protected override void OnNavigatingFrom(NavigatingCancelEventArgs e) { if (gps != null) gps.Stop(); base.OnNavigatingFrom(e); } #mstechdays Code/developpement Nokia Internal Use Only
    60. 60. API partagées avec Windows 8 // Le namespace using Windows.Devices.Geolocation; // Comment l’instancier gps = new Geolocator(); gps.DesiredAccuracy = PositionAccuracy.High; // Ou Default gps.DesiredAccuracyInMeters = 10; // En dessous de 10m ce n’est pas possible gps.MovementThreshold = 0; gps.ReportInterval = 1000; // Le GPS a un taux de rafraichissement d’1Hz // Comment récupérer l’information gps.PositionChanged += OnGeolocatorPositionChanged; gps.StatusChanged += OnGeolocatorStatusChanged; #mstechdays Code/developpement Nokia Internal Use Only
    61. 61. API spécifique Windows Phone 8 private void OnGeolocatorStatusChanged(Geolocator sender, StatusChangedEventArgs args) { this.Dispatcher.BeginInvoke(() => { GPSManualStatus.Text = e.Status.ToString(); }); } // Les valeurs de Status PositionStatus.Disabled .Initializing .NoData .NotAvailable .NotInitialized .Ready #mstechdays Code/developpement Nokia Internal Use Only
    62. 62. API spécifique Windows Phone 8 private void OnGeolocatorPositionChanged (Geolocator sender, PositionChangedEventArgs args) { this.Dispatcher.BeginInvoke(() => { GPSTime.Text = args.Position.Coordinate.Timestamp.ToString(); GPSLatitude.Text = args.Position.Coordinate.Latitude.ToString(); GPSLongitude.Text = args.Position.Coordinate.Longitude.ToString(); GPSAltitude.Text = args.Position.Coordinate.Altitude.ToString(); GPSAltitudeAccuracy.Text = args.Position.Coordinate.AltitudeAccuracy.ToString(); GPSAccuracy.Text = args.Position.Coordinate.Accuracy.ToString(); GPSSpeed.Text = args.Position.Coordinate.Speed.ToString(); } } #mstechdays Code/developpement Nokia Internal Use Only
    63. 63. SENSEUR : GYROSCOPE Il ne vous fera pas tourner en bourrique celui là #mstechdays Code/developpement Nokia Internal Use Only
    64. 64. Qu’est-ce que c’est ? Un gyroscope (du grec « qui observe la rotation ») est un appareil qui exploite le principe de la conservation du moment angulaire en physique (ou encore stabilité gyroscopique ou effet gyroscopique). Cette loi fondamentale de la mécanique veut qu'en l'absence de couple appliqué à un solide en rotation, celui-ci conserve son axe de rotation invariable Source Wikipédia : http://fr.wikipedia.org/wiki/Gyroscope #mstechdays Code/developpement Nokia Internal Use Only
    65. 65. API spécifique Windows Phone 8 // Le namespace using Microsoft.Devices.Sensors; // Comment savoir si le téléphone supporte cette fonctionnalité if (!Gyroscope.IsSupported) return; // Comment l’instancier gyroscope = new Gyroscope(); gyroscope.TimeBetweenUpdates = TimeSpan.FromMilliseconds(20); // Comment récupérer l’information gyroscope.CurrentValueChanged += OnGyroscopeCurrentValueChanged; // Comment le démarrer gyroscope.Start(); #mstechdays Code/developpement Nokia Internal Use Only
    66. 66. API spécifique Windows Phone 8 private void OnGyroscopeCurrentValueChanged(object sender, SensorReadingEventArgs<GyroscopeReading> args) { GyroscopeReading reading = args.SensorReading; this.Dispatcher.BeginInvoke(() => { TxtTimestamp.Text = reading.Timestamp.ToString(); TxtRotationX.Text = reading.RotationRate.X.ToString(); TxtRotationY.Text = reading.RotationRate.Y.ToString(); TxtRotationZ.Text = reading.RotationRate.Z.ToString(); } } #mstechdays Code/developpement Nokia Internal Use Only
    67. 67. API spécifique Windows Phone 8 Ne pas oublier de fermer le senseur ! protected override void OnNavigatingFrom(NavigatingCancelEventArgs e) { if (gyroscope != null) gyroscope.Stop(); base.OnNavigatingFrom(e); } #mstechdays Code/developpement Nokia Internal Use Only
    68. 68. API partagées avec Windows 8 // Le namespace using Windows.Devices.Sensors; // Comment l’instancier gyroscope = Gyrometer.GetDefault(); // Comment savoir si le téléphone supporte cette fonctionnalité if (gyroscope != NULL) return; // Comment récupérer l’information gyroscope.ReadingChanged += OnGyroscopeReadingChanged; #mstechdays Code/developpement Nokia Internal Use Only
    69. 69. API partagées avec Windows 8 private void OnGyroscopeReadingChanged (Gyrometer sender, GyrometerReadingChangedEventArgs args) { GyrometerReading reading = args.SensorReading; this.Dispatcher.BeginInvoke(() => { TxtTimestamp.Text = reading.Timestamp.ToString(); TxtRotationX.Text = reading.AngularVelocityX.ToString("0.00"); TxtRotationY.Text = reading.AngularVelocityY.ToString("0.00"); TxtRotationZ.Text = reading.AngularVelocityZ.ToString("0.00"); } } #mstechdays Code/developpement Nokia Internal Use Only
    70. 70. SENSEUR : INCLINOMÈTRE Tel le bambou, il sait plier. #mstechdays Code/developpement Nokia Internal Use Only
    71. 71. Qu’est-ce que c’est ? Un inclinomètre (ou clinomètre) est un capteur servant à mesurer des angles par rapport à la ligne d'horizon (ou horizontale). Là où le niveau à bulle (ou niveau) permet de détecter précisément où se situe l'horizontale, l'inclinomètre détermine en plus l'angle d'inclinaison par rapport à cette horizontale. Source Wikipédia : http://fr.wikipedia.org/wiki/Inclinom%C3%A8tre #mstechdays Code/developpement Nokia Internal Use Only
    72. 72. API partagées avec Windows 8 // Le namespace using Windows.Devices.Sensors; // Comment l’instancier inclinometer = Inclinometer.GetDefault(); // Comment savoir si le téléphone supporte cette fonctionnalité if (inclinometer!= NULL) return; // Comment récupérer l’information inclinometer.ReadingChanged += OnInclinometerReadingChanged; #mstechdays Code/developpement Nokia Internal Use Only
    73. 73. API partagées avec Windows 8 private void OnInclinometerReadingChanged (Inclinometer sender, InclinometerReadingChangedEventArgs args) { InclinometerReading reading = args.SensorReading; this.Dispatcher.BeginInvoke(() => { TxtTimestamp.Text = reading.Timestamp.ToString(); TxtPitch.Text = reading.PitchDegrees.ToString("0.00"); TxtRoll.Text = reading.RollDegrees.ToString("0.00"); TxtYaw.Text = reading.YawDegrees.ToString("0.00"); } } #mstechdays Code/developpement Nokia Internal Use Only
    74. 74. MOTION API Avoir tous ses sens en éveils #mstechdays Code/developpement Nokia Internal Use Only
    75. 75. Qu’est-ce que c’est ? Vous pouvez utiliser la « Motion API » pour créer des applications Windows Phone qui utilisent l'orientation et le mouvement de l'appareil dans l'espace comme un mécanisme d'entrée. La plate-forme Windows Phone inclut des APIs pour obtenir des données brutes du capteur de la boussole de l'appareil, gyroscope, accéléromètre et des capteurs. Cependant la « Motion API » gère le calcul complexe nécessaire pour combiner les données de ces capteurs et produire des valeurs facile à utiliser pour l'attitude et le mouvement de l'appareil. #mstechdays Code/developpement Nokia Internal Use Only
    76. 76. Comment ça marche ? // Le namespace using Microsoft.Devices.Sensors; // Comment savoir si le téléphone supporte cette fonctionnalité if (!Motion.IsSupported) return; // Comment l’instancier motion = new Motion(); motion.TimeBetweenUpdates = TimeSpan.FromMilliseconds(20); // Comment récupérer l’information motion.CurrentValueChanged += OnMotionCurrentValueChanged; // Comment le démarrer motion.Start(); #mstechdays Code/developpement Nokia Internal Use Only
    77. 77. Comment ça marche ? private void OnGyroscopeCurrentValueChanged(object sender, SensorReadingEventArgs<MotionReading> args) { MotionReading reading = args.SensorReading; this.Dispatcher.BeginInvoke(() => { TxtTimestamp.Text = reading.Timestamp.ToString(); TxtPitch.Text = reading.Attitude.Pitch.ToString(); // En radian TxtRoll.Text = reading.Attitude.Roll.ToString(); // En radian TxtYaw.Text = reading.Attitude.Yaw.ToString(); // En radian TxtAccellerationX.Text = reading.DeviceAcceleration.X.ToString(); TxtAccellerationY.Text = reading.DeviceAcceleration.Y.ToString(); TxtAccellerationZ.Text = reading.DeviceAcceleration.Z.ToString(); } } #mstechdays Code/developpement Nokia Internal Use Only
    78. 78. Connaître l’attitude La « Motion API » permet de connaître l’orientation du téléphone dans un espace 3D. Dans les informations retournées, on peut récupérer le Quaternion et la matrice de rotation de cette attitude. MotionReading reading = args.SensorReading; // Récupération du Quaternion reading.Quaternion; // Récupération de la matrice de rotation reading.RotationMatrix; #mstechdays Code/developpement Nokia Internal Use Only
    79. 79. REALITE AUGMENTEE : GART Regarder le monde sous un nouveau jour, n’est-ce pas Wayne ? #mstechdays Code/developpement Nokia Internal Use Only
    80. 80. Qu’est-ce que GART ? Un SDK Open Source développer par un employé de Microsoft. Permet de faire de la réalité augmentée Géo localisée. Disponible à cette adresse : http://gart.codeplex.com/ #mstechdays Compatible : - Windows Phone 7 et 8 - Windows 8 et 8.1 Code/developpement Nokia Internal Use Only
    81. 81. NOKIA JOB HUB Application Pilote Windows Phone réalisée avec GART #mstechdays Code/developpement Nokia Internal Use Only
    82. 82. #mstechdays Code/developpement Nokia Internal Use Only
    83. 83. Comment ça marche ? <phone:PhoneApplicationPage xmlns:gart="clr-namespace:GART.Controls;assembly=GART.WP8"> <Grid> <gart:ARDisplay x:Name="ARDisplay" AttitudeRefreshRate="50" MovementThreshold="10"> <gart:VideoPreview /> <gart:WorldView FarClippingPlane="300.0" MaxItemScale="1.0" MinItemScale="0.1" NearClippingPlane="1.0"> <gart:WorldView.ItemTemplate> <DataTemplate> <Border Background="White" BorderBrush="Green" BorderThickness="1" Padding="5"> <TextBlock FontSize="20" Foreground="Black" Text="{Binding Content}" /> </Border> </DataTemplate> </gart:WorldView.ItemTemplate> </gart:WorldView> </gart:ARDisplay> </Grid> #mstechdays Code/developpement Nokia Internal Use Only
    84. 84. Comment ça marche ? // On crée une liste de point a afficher items = new ObservableCollection<ARItem>(); // Création d’un élément a afficher // Mettre ici des éléments valide en coordonnée pour les voir apparaitre // Pour trouver des coordonnées, allez sur Bing Maps ARItem point = new ARItem(); point.Content = "Un objet a afficher"; point.GeoLocation = new System.Device.Location.GeoCoordinate(48.821229, 2.254397, 0); items.Add(point); // On affecte la source this.ARDisplay.ARItems = items; #mstechdays Code/developpement Nokia Internal Use Only
    85. 85. Comment ça marche ? protected override void OnNavigatedFrom(System.Windows.Navigation.NavigationEventArgs e) { this.ARDisplay.StopServices(); base.OnNavigatedFrom(e); } protected override void OnNavigatedTo(System.Windows.Navigation.NavigationEventArgs e) { this.ARDisplay.StartServices(); base.OnNavigatedTo(e); } #mstechdays Code/developpement Nokia Internal Use Only
    86. 86. DES QUESTIONS ? N’hésitez pas on sera ravi de vous répondre. #mstechdays Code/developpement Nokia Internal Use Only
    87. 87. Restez en contact Nicolas Calvi Blog > blog.nicolascalvi.com Twitter > @nicolascalvi Page Facebook > Black Blog Nicolas Delabarre Blog > www.nokiadevblog.fr Twitter > @NokiaDev_France Page Facebook > NokiaDevFrance Code source : http://sdrv.ms/1coyrnH #mstechdays Code/developpement Nokia Internal Use Only
    88. 88. Digital is business Nokia Internal Use Only

    ×