Windows Phone 7 – Tutorial XX – Detectar si tenemos conexión de datos

Si nuestra aplicación esta accediendo a internet para recuperar datos es importante que tengamos en cuenta si en ese momento el dispositivo tiene cobertura ya sea wifi, 3g…, para detectar si tenemos conexión lo tenemos fácil solo tenemos que utilizar la clase NetworkInterface que nos proporciona el método GetIsNetworkAvailable para indicarnos si hay cobertura en ese momento.

1 private bool InternetIsAvailable() 2 { 3 if (!NetworkInterface.GetIsNetworkAvailable()) 4 { 5 MessageBox.Show("No tienes conexión de internet."); 6 return false; 7 } 8 return true; 9 }

También podemos detectar el tipo de conexión que tenemos y actuar en consecuencia, esta funcionalidad nos la proporciona la clase NetworkChange que se encuentra en el namespace System.Net.NetworkInformation. Esta clase nos proporciona el evento NetworkAddressChanged que se lanza cada vez que se cambia de la red de conexión. Para detectar el tipo nos basaremos en la clase  NetworkInterface en la propiedad NetworkInterfaceType.

1 void NetworkChange_NetworkAddressChanged(object sender, EventArgs e) 2 { 3 var type = Microsoft.Phone.Net.NetworkInformation.NetworkInterface.NetworkInterfaceType; 4 5 switch (type) 6 { 7 case Microsoft.Phone.Net.NetworkInformation.NetworkInterfaceType.None: 8 break; 9 case Microsoft.Phone.Net.NetworkInformation.NetworkInterfaceType.AsymmetricDsl: 10 break; 11 case Microsoft.Phone.Net.NetworkInformation.NetworkInterfaceType.Atm: 12 break; 13 case Microsoft.Phone.Net.NetworkInformation.NetworkInterfaceType.BasicIsdn: 14 break; 15 case Microsoft.Phone.Net.NetworkInformation.NetworkInterfaceType.Ethernet: 16 break; 17 .......

Un nivel mas a la hora de debug en Bindings de WPF

Hola en el articulo Debugeando los Binding de WPF, vimos varias opciones a la hora de debugear los bindings, la mas frecuente es verlos en el OutputWindow mediante mensajes que nos muestra en esta ventana cuando ejecutamos nuestra aplicación y tenemos un error en el binding.

Pero si queremos ir mas allá podemos crear nuestro propio listener para trazar los binding, tan solo tenemos que realizar nuestra clase que derive de DefaultTraceListener en la que utilizaremos la clase PresentationTraceSources para escuchar los Binding y mostrar por ejemplo un MessageBox cada vez que se produzca un error.

Lo importante de nuestra clase que vamos a llamar CustomBindingTraceListener es que debemos de añadirla a los listeners de DataBinding que se encuentran en PresentationTraceSources.DataBindingSource.Listeners, una vez añadido sobrescribimos los métodos Write y WriteLine de la clase que hemos heredado para tratar los mensajes de error.

El código de nuestra clase seria tan sencillo como

1 class CustomBindingTraceListener : DefaultTraceListener 2 { 3 private static CustomBindingTraceListener _Listener; 4 private StringBuilder _Message = new StringBuilder(); 5 6 private CustomBindingTraceListener() 7 { } 8 9 public static void SetTrace() 10 { 11 SetTrace(SourceLevels.Error, TraceOptions.None); 12 } 13 14 public static void SetTrace(SourceLevels level, TraceOptions options) 15 { 16 if (_Listener == null) 17 { 18 _Listener = new CustomBindingTraceListener(); 19 PresentationTraceSources.DataBindingSource.Listeners.Add(_Listener); 20 } 21 22 _Listener.TraceOutputOptions = options; 23 PresentationTraceSources.DataBindingSource.Switch.Level = level; 24 } 25 26 public static void CloseTrace() 27 { 28 if (_Listener == null) 29 { return; } 30 31 _Listener.Flush(); 32 _Listener.Close(); 33 PresentationTraceSources.DataBindingSource.Listeners.Remove(_Listener); 34 _Listener = null; 35 } 36 37 public override void Write(string message) 38 { 39 _Message.Append(message); 40 } 41 42 public override void WriteLine(string message) 43 { 44 _Message.Append(message); 45 46 var final = _Message.ToString(); 47 _Message.Length = 0; 48 49 MessageBox.Show(final, "Tienes un error en el binding", MessageBoxButton.OK, MessageBoxImage.Error); 50 } 51 }

Una vez que tenemos nuestra clase solo tenemos que llamar al método SetTrace para que empiece a funcionar.

 

 

 

 

Si ejecutamos la aplicación con un error de Binding obtendríamos

image

 

Lo cual es molesto a la hora de probar y obliga a nuestros desarrolladores a limpiar esos bindings que fallan pero que no se notan a la hora de ejecutar la aplicación.

 

Os dejo el código


Windows Phone–Tutorial XIX – Registrándonos en el MarketPlace

Ya llevamos una gran cantidad de post en el tutorial y ya deberíamos ser capaces de construir nuestra propia aplicación, todavía quedan muchas cosas por aprender,pero quiero detenerme en explicar como registrarnos en el Marketplace que es nuestro objetivo como desarrolladores, construir nuestra propia aplicación y que los demás se la puedan bajar pagando o gratis según decidamos.

Para subir una aplicación el primer paso es registrarnos como desarrolladores, el tiempo que necesitamos para registrarnos es de unos 15-20 días hasta que nos dan nuestro id, así que si tenéis en mente una aplicación empezar a registraros.

Bien la pagina para registraros como desarrolladores es http://create.msdn.com, dentro de la página debéis de pulsar en

image

Esta nos lleva a otra página y en esta debéis de pulsar en

image

Os pedirá que os identifiquéis con un Windows Live Id y empezaremos con el registro, lo primero que nos pide, es el país de donde somos y el tipo de cuenta

proceso alta app hub

Nos propone tres tipos de cuenta

  • Estudiante: Si por ejemplo sois universitarios, se puede solicitar una cuenta gratuita en DreamSpark, que contiene una cuenta gratuita en el AppHub.
  • Desarrollador individual: Si somos desarrolladores por nuestra cuenta, es nuestra opción
  • Empresa: Registrarnos como una empresa, no he visto los datos que nos pide

Una vez realizado este paso, el siguiente paso es rellenar nuestros datos personales, poner información correcta porque luego se comprobara

 

image

Una vez que hemos rellenado nuestros datos personales nos pide cual va a ser nuestra imagen en los foros

image

 

Por ultimo el pago de 99€

image

 

Introducir nuestra tarjeta de crédito y pagar

Despues de realizar este paso recibiremos unos correos y en concreto lo mas importante de Geotrust que es la empresa encargada de certificar que quienes hemos dicho que somos, lo somos en realidad y no nos hemos inventado nada

 

image

 

En el email de GeoTrust indicándonos los pasos a seguir, el primero confirmar que hemos solicitado el alta en el App Hub. Atención: si cancelamos este paso habremos perdido los 99€ que hemos pagado, así que cuidado con el enlace de cancelación.
La siguiente vez que nos contacte GeoTrust (bastantes días después) será para solicitarnos la documentación necesaria para validar nuestra identidad. En el caso de un individuo nos pedirán que rellenemos una carta con nuestra firma y una copia del DNI. Si todo va bien, al cabo de unos días recibiremos confirmación de GeoTrust y unos días más tarde tendremos activado el App Hub, y ya podremos subir nuestra aplicación al MarketPlace.

 

En otro post veremos los pasos a seguir para subir una aplicación al MarketPlace

Windows Phone– Tutorial XVIII–Utilizando el Micrófono

En este post vamos a ver como utilizar el micrófono que viene en todos los teléfonos de Windows Phone, lo vamos a ver desde la perspectiva de un proyecto Silverlight ya que en XNA es distinto, para empezar debemos de añadir a nuestro proyecto el assembly Microsoft.Xna.Framework y recordar tal y como vimos en el post Windows Phone–Tutorial XVI–Hacer hablar a tu Windows Phone añadir la clase XNADispatcher , el assembly Microsoft.Xna.Framework y en el App.xaml activarlo

1 <Application.ApplicationLifetimeObjects> 2 <local:XNADispatcher DispatchIntervalInMilliseconds="50"/> 3 <!--Required object that handles lifetime events for the application--> 4 <shell:PhoneApplicationService 5 Launching="Application_Launching" Closing="Application_Closing" 6 Activated="Application_Activated" Deactivated="Application_Deactivated"/> 7 </Application.ApplicationLifetimeObjects>

 

El porque y contenido de la clase ya fue explicado en el post anterior así que vamos a pasar directamente a como podemos utilizar el micrófono dentro de nuestro windows phone, para su utilización se nos provee de la clase  Microphone ubicada en el assembly Microsoft.Xna.Framework con el método Start empezar a escuchar y Stop para parar de escuchar, cuando activamos el micrófono la señal nos llega a través del evento  BufferReady  que tenemos que estar escuchando y cuando termine transforma esta señal a un archivo reproducible por ejemplo de tipo wav.

Para ver como lo realizamos vamos a mostrar una aplicación con tres botones de start, stop y play, no los voy a esconder, ni mostrar mensajes de que botón esta en ese momento, el objetivo de este programa es ver como recogemos la entrada del micrófono , la guardamos en nuestro teléfono como un archivo de tipo wav y la reproducimos, a partir de ahí vuestra imaginación para ampliarla y mejorarla . Tampoco voy a utilizar el template de MVVM sino que voy a codificar directamente en la página.

Lo primero que tenemos que hacer es definir las variables que vamos a utilizar, es decir el micrófono, su buffer y donde lo vamos a almacenar.

1 Microphone microphone = Microphone.Default; 2 byte[] microphoneBuffer; 3 MemoryStream audioStream; 4 byte[] recording;

 

Una vez que lo tenemos codificamos el botón Start, en el lo que haremos será activar el micrófono, definir el evento de recogida de la señal y el tamaño del buffer de esta señal, es decir, cada cuanto almacenamos en el buffer.

1 private void StartButton_Click(object sender, RoutedEventArgs e) 2 { 3 audioStream = new MemoryStream(); 4 microphone.BufferDuration = TimeSpan.FromMilliseconds(1000); 5 microphoneBuffer = 6 new byte[microphone.GetSampleSizeInBytes(microphone.BufferDuration)]; 7 microphone.BufferReady += microphoneBuffer_BufferReady; 8 microphone.Start(); 9 }

En el evento BufferReady  vamos almacenando las sucesivas señales, en seste caso cada segundo, y como podéis ver en un MemoryStream

  

1 void microphoneBuffer_BufferReady(object sender, EventArgs e) 2 { 3 microphone.GetData(microphoneBuffer); 4 audioStream.Write(microphoneBuffer, 0, microphoneBuffer.Length); 5 } 6

Por ultimo en el botón Stop paramos la lectura del micrófono, transformamos a un fichero wav , lo grabamos en el teléfono y lo reproducimos

1 private void StopButton_Click(object sender, RoutedEventArgs e) 2 { 3 microphone.Stop(); 4 microphone.BufferReady -= microphoneBuffer_BufferReady; 5 audioStream.Flush(); 6 recording = audioStream.ToArray(); 7 audioStream.Dispose(); 8 9 using (var iss = new IsolatedStorageFileStream("recording.wav", 10 FileMode.OpenOrCreate, 11 IsolatedStorageFile.GetUserStoreForApplication())) 12 { 13 var bytesToWrite = SoundUtilities.ConvertRawSamplesToWav(recording, 14 new SoundUtilities.WaveFormat() 15 { 16 AverageBytesPerSecond = microphone.SampleRate * 2, 17 BlockAlign = 2, 18 Channels = 1, 19 Encoding = 1, 20 SamplesPerSecond = microphone.SampleRate 21 }); 22 iss.Write(bytesToWrite, 0, bytesToWrite.Length); 23 } 24 25 } 26


Como podéis ver en el código de arriba utilizo una clase SoundUtilities que encontré por la red para transformar a ficheros wav, una vez transformados lo guardo en el teléfono el archivo.

Ya solo nos queda reproducir el archivo, para ello utilizamos la clase SoundEffect de XNA

1 private void PlayRecordingButton_Click(object sender, RoutedEventArgs e) 2 { 3 var effect = new SoundEffect(recording, microphone.SampleRate, 4 AudioChannels.Mono); 5 effect.Play(); 6 }

Habéis podido observar que es muy sencillo utilizar el micrófono, lo que no es posible y envidió de Android es que no podemos transformarlo a Texto, en cambio, la API de Android si lo implementa.

 

Os dejo el código como siempre

 

(OFF-Topic) Opinión Sobre la propuesta de Merkel

Hoy la red ha tenido un tema que a mi me ha preocupado bastante, en el País (http://www.elpais.com/articulo/economia/Merkel/estudia/ofrecer/empleos/cualificados/jovenes/espanoles/paro/elpepueco/20110122elpepueco_1/Tes)  y en todos los medios de comunicación se ha podido ver, oír y leer que Merkel va a propone a España la posibilidad de ofrecer empleo a jóvenes cualificados que se encuentren en paro ya que actualmente se encuentran en déficit alto de profesionales cualificados especialmente ingenieros industriales y de telecomunicaciones. Con sentimientos encontrados me encuentro que la gente ha recibido con alegría la noticia y por una parte es normal va a permitir que mucha gente encuentre un trabajo y salga de una situación difícil.

Si lo miramos desde la globalidad lo que estamos teniendo es una descapitalización de talento que dentro de 10-15 años no tendremos gente cualificada y  que toda estará en Alemania, no soñemos con que volverán a España. Alemania encantada se va a encontrar con una generación de talentos que les ha salido con coste cero.

No tendríamos que plantearnos la situación contraria y fichar a directivos, empresarios e ingenieros  alemanes que nos enseñen a trabajar con productividad y convertirnos en una potencia Europea generando trabajo para esos talentos?. Quizás el problema sea que como Españoles queremos una solución rápida sin pensar en las consecuencias de futuro.

Bueno este ha sido un pensamiento rápido, quizás este equivocado pero es lo primero que me ha venido a la mente cuando he leído la noticia.  

Windows Phone–Tutorial XVII – Usando datos en Windows Phone 7–Servicios OData

Pensaba que habia publicado ya el acceso a OData pero parece que entre los borradores que tenia me lo salte a la hora de publicar. Si queréis saber de Odata que es os recomiendo leer el post de Marc Rubiño , su web oficial http://www.odata.org/ y el White Paper de Jose Miguel Torres donde se muestra que es y como crear nuestros propios servicios OData,  podría resumirse (muy brevemente) en

OData (Open Data Protocol) es un protocolo para compartir datos diseñado para funcionar sobre la Web, utilizando URLs para
identificar cada pieza de información en un servicio, HTTP para transportar requerimientos y respuestas, y AtomPub y JSON para manejar colecciones y
para representaciones de datos.

En este post no voy a indicar como crear nuestros servicios OData sino como consumir este tipo de servicios en Windows Phone 7, para ello voy a utilizar ya servicios oData expuesto ya en la red, para ello disponemos de una lista en la pagina http://www.odata.org/producers, actualmente la lista es la siguiente

 

clip_image001 Live OData Services

Facebook Insights

An OData Service for consuming Facebook Insights data.

browse…

ebay

ebay now exposes its catalog via OData

browse…

Netflix

The complete netflix catalog title via OData.  See the Netflix developer OData documentation for more information

browse…

twitpic

twitpic now exposes its Images, Users, Comments etc via OData

browse…

Windows Live

You can now use an OData client to talk to your Windows Live resources (Photos, Contacts, Status, etc) whose REST endpoints are now OData endpoints.

Microsoft PDC 2010

Information about all the sessions / speakers etc for Microsoft PDC 2010 exposed via OData

browse…

Pluralsight

Pluralsight courses are now available via an OData feed

browse…

DevExpress Channel

DevExpress has lots of training videos, now available via an OData feed.

browse…

vanGuide

A social map of Vancouver Open Data. A collection of data services showing everything from parking lots to drinking fountains.

browse…

Vancouver Street Parking

This feed exposes Vancouver street parking information.

browse…

Open Government Data Initiative

Open Government Data Initiative (OGDI) is an open source data publishing solution for government agencies.

browse…

Open Science Data Initiative

OSDI is based on OGDI which in turn uses the Azure Services Platform to make it easier to publish and use a wide variety of scientific data from government agencies.

Lots of feeds but no service document. You can however use theircustom browser.

The City of Edmonton Open Data Catalogue

Public data from the city of Edmonton.

browse…

Windows Azure Marketplace DataMarket

Windows Azure Marketplace DataMarket allows producers to sell premier data to consumers, using OData.

TechEd 2010

Microsoft TechEd 2010 conference session data.

browse…

MIX10

Microsoft MIX 2010 session data.

browse…

Nerd Dinner

Nerd Dinner is a website that helps nerds to meet and talk, not surprisingly it has adopted OData

browse…

DBpedia

A community effort to extract structured information from Wikipedia and to make this information available on the Web, with full support for OData interactions on the live query services. (Powered by OpenLink Virtuoso.)

browse or query

Linked Open Data Cloud Cache

Mirrors and interlinks dozens of data sets including all of data.gov, with full support for OData interactions. (Powered by OpenLink Virtuoso.)

browse or query

OData Test Service (Read-Only)

This service is specially designed to introduce OData, it has a simple model and only a small number of resources.

browse…

OData Test Service (Read-Write)

As above, but this time read-write (with some restrictions).

browse…

Northwind

The famous Northwind Database exposed as an OData Service.

browse…

OData Website Data

Data, like producers and consumers, from the OData Website exposed as OData.

browse…

Stack Overflow

Q&A for programmers

browse…

Super User

Q&A for computer enthusiasts and power users

browse…

Server Fault

Q&A for system administrators and IT professionals

browse…

Meta Stack Overflow

Q&A about Stack Overflow, Server Fault and Super User

browse…

Telerik TV

Telerik’s catalog of libraries, videos, Tags and Series

Browse …

Public Transit Data Community

Collection of mass transit data from a variety of transportation agencies across the United States. See developer documentationfor more details.

Browse …

LogMyTime

Project time tracking software for freelancers and small to medium teams.

browse…

INETA Live

INETA Live has an OData feed providing access to their vast library of User Group Presentations.

browse…

Microsoft Pinpoint

Microsoft Pinpoint marketplace now exposes its data using OData – more details coming soon

Proagora

Proagora is a site that allows you to search for jobs, companies, and experts.

browse inEnglish orFrench

 

Como podéis ver cada vez existen mas servicios que estan exponiendo sus API a través de este protocolo, yo voy a utilizar TwitPic para desarrollar una pequeña aplicación tonta para que veáis los pasos a seguir a la hora de consumir estos servicios.

Lo primero que necesitamos es descargarnos OData Client Library for Windows Phone 7, yo me he bajado ODataClient_BinariesAndCodeGenToolForWinPhone.zip, en este zip se encuentran dos assembly y el ejecutable DataSvcUtil.exe una vez que tenemos estos archivos y creamos nuestro proyecto.

Si ya habéis trabajado con Odata en aplicaciones de ASP¨, WPF… tendréis la tentación de añadir un Service Reference para que os cree el proxy con las clases, pero esto no funciona.

image 

 

Los pasos que tenemos que seguir son añadir como referencia el assembly System.Data.Services.Client.dll de la libreria OData Client Library for Windows Phone 7

 y utilizaremos el ejecutable DataSvcUtil.exe para generar el fichero proxy. Para generar esta clase deberemos de lanzar el comando

datasvcutil /uri:http://odata.twitpic.com/ /DataServiceCollection /Version:2.0  /out:TwitpicOdata.cs

donde en uri ponemos la url de acceso al servicio oData que podemos sacar de la tercera columna de la tabla puesta anteriormente, en este caso http://odata.twitpic.com y en out el fichero que queremos generar. Una vez generado el fichero lo añadimos a nuestro proyecto.

Nuestro proyecto nos quedaría con los archivos

image

La aplicación que vamos a construir es una lista de las paginas devueltas por el Tag kinect junto con el mensaje de Twitter, de tal manera que nos quedaría

 

image

 

En nuestro ViewModel declararemos la propiedad que rellenara el ListBox.

1 public DataServiceCollection<Image> ImageTags 2 { 3 get 4 { 5 return imageTags; 6 } 7 private set 8 { 9 imageTags = value; 10 RaisePropertyChanged("ImageTags"); 11 12 } 13 }

 

DataServiceCollection es una clase que deriva de ObservableCollection<T> y implementa IDataServiceCollection se encuentra en el assembly System.Data.Services.Client.dll  y es la clase que nos devuelven los servicios OData al derivar de ObservableCollection<T>  podemos realizar un binding a la propiedad ItemsSource de la lista.

 

 

1 <Grid x:Name="ContentGrid" 2 Grid.Row="1"> 3 <ListBox Margin="24,18,21,0" VerticalAlignment="Top" ItemsSource="{Binding ImageTags}" ItemTemplate="{StaticResource DataTemplateImagesTags}" Height="566"/> 4 </Grid>

 

 

Ahora solo nos queda recuperar los datos para ello siempre debemos crear un contexto que en nuestro caso es la clase TwitpicData y asignarselo a la propiedad ImageTags, una vez asignado debemos de indicar la uri con los filtros que queremos realizar, para nuestro ejemplo es muy sencillo esta uri es

/Tags(‘» + tag +»‘)/Images()?

Si ejecutamos en nuestro navegador la uri http://odata.twitpic.com/Tags(‘kinect’)/Images()? obtendremos una respuesta como esta

image

Una vez tenemos la Uri, solo tenemos que llamar al método LoadAsync para que realice la búsqueda, de manera que el código seria

 

 

1 private void LoadImageTags(string tag) 2 { 3 context = new TwitpicData(new Uri("http://odata.twitpic.com")); 4 imageTags = new DataServiceCollection<Image>(context); 5 6 Uri uriQuery = new Uri(@"/Tags('" + tag +"')/Images()?", UriKind.Relative); 7 8 ImageTags.LoadAsync(uriQuery); 9 10 ImageTags.LoadCompleted += (sender, args) => 11 { 12 if (args.Error != null) 13 { 14 Debug.WriteLine("Ha fallado la consulta. " + args.Error.Message); 15 } 16 17 }; 18 } 19

 

 

Ya tenemos nuestro acceso a OData y nuestra aplicación realizada

 

Instalación de los drivers de la Kinect

Estas navidades me he autoregalado una kinect con la excusa de que es para mi hijo de 4 años, ya podeis imaginar que lo primero que hecho (despues de jugar con mi hijo) ha sido enchufarla al portatil. En la entrada http://labloguera.net/blogs/elbruno/archive/2010/12/30/kinect-instalando-los-drivers-de-openni-para-kinect.aspx nuestro amigo Bruno nos explicaba como instalar los drivers de la Kinect y funcionaba a la perfección y he estado jugando hasta ahora con ellos.

Los de PrimeSense siguen sacando versiones de drivers y hoy me he puesto a actualizarlos y he visto que el proceso de instalación ha cambiado un poco con lo que voy a poner paso a paso la instalación que he realizado en mi maquina de Windows 7 x64

El primer paso es bajarse los drivers de Kinect Drivers, una vez descomprimidos ir a la carpeta Platform/Win32/Driver.y ejecutar dpinst-x86.exe si tu procesador es un x86 y si es de x64 ejecutar dpinst-amd64.exe.

El segundo paso es bajarse los binarios de opnenui de OpenNI Binaries, yo he utilizado la versión estable. Instalarla por supuesto

El tercer paso es bajarse OpenNI Compliant Middleware Binaries e instalarlo, la clave que proporciona primesense es 0KOIk2JeIBYClPWVnMoRKn5cdY4=, os la pedirá durante la instalación.

El siguiente paso es bajarse OpenNI Compliant Hardware Binaries, yo me los baje de la web de primesense que son los que he puesto en el hipervinculo anterior y tuve un problema que no me funcionaba me daba el siguiente error al ejecutar los ejemplos

 

this is the complete log of the NiViewer.exeon the machine where
kinect does not work (the output is a completely black screen):

XnDeviceSensorV2.dll…
   14385        [VERBOSE]       Found exported production node.
Device: PrimeSen
se/SensorV2/5.0.0.24
   14574        [VERBOSE]       Found exported production node. Depth:
PrimeSens
e/SensorV2/5.0.0.24
   14752        [VERBOSE]       Found exported production node. Image:
PrimeSens
e/SensorV2/5.0.0.24
   14913        [VERBOSE]       Found exported production node. IR:
PrimeSense/S
ensorV2/5.0.0.24
   15074        [VERBOSE]       Found exported production node. Audio:
PrimeSens
e/SensorV2/5.0.0.24
   15234        [VERBOSE]       Checking C:Program FilesPrime Sense
NITEFeatu
resBinXnVFeatures.dll…
   16925        [VERBOSE]       Found exported production node. Scene:
PrimeSens
e/XnVSceneAnalyzer/1.3.0.17
   17104        [VERBOSE]       Found exported production node. User:
PrimeSense
/XnVSkeletonGenerator/1.3.0.17
   17266        [VERBOSE]       Checking C:Program FilesPrime Sense
NITEHands
BinXnVHandGenerator.dll…
   18004        [VERBOSE]       Found exported production node.
Gesture: PrimeSe
nse/XnVGestureGenrator/1.3.0.17
   18179        [VERBOSE]       Found exported production node. Hands:
PrimeSens
e/XnVHandTracker/1.3.0.17
   18650        [VERBOSE]       Requested to create a node of type
Image…
   20678        [INFO]  Creating node ‘Device1’ of type Device…
1402493        [INFO]  Property Device.ShareMode was changed to 1.
1402725        [INFO]  Property Device.InstancePointer was changed.
1402899        [INFO]  Property Device.ShareMode was changed to 0.
1403166        [INFO]  Creating node ‘Image1’ of type Image…
1403337        [VERBOSE]       Creating stream Image1 (of type Image)
1414589        [INFO]  Property Device.ReadData was changed to 1.
1417234        [INFO]  Creating stream ‘Image1’ of type ‘Image’…
1417436        [VERBOSE]       Initializing stream ‘Image1’…
1417653        [INFO]  Property Image1.RequiredDataSize was changed
to 230400.
1417869        [INFO]  Property Image1.OutputFormat was changed to 5.
1418017        [INFO]  Stream ‘Image1’ was initialized.
1418147        [INFO]  ‘Image1’ stream was created.
1418391        [VERBOSE]       Batch configuring server…
1418693        [INFO]  Property Image1.RequiredDataSize was changed
to 460800.
1418979        [INFO]  Property Image1.XRes was changed to 640.
1419147        [INFO]  Property Image1.RequiredDataSize was changed
to 921600.
1419550        [INFO]  Property Image1.YRes was changed to 480.
1419719        [INFO]  Property Image1.Resolution was changed to 1.
1419871        [VERBOSE]       Setting Image1.Mirror to 1…
1420094        [INFO]  Property Image1.Mirror was changed to 1.
1420246        [VERBOSE]       Requested to create a node of type
Depth…
1421402        [INFO]  Creating node ‘Depth1’ of type Depth…
1421596        [VERBOSE]       Creating stream Depth1 (of type Depth)
1439764        [INFO]  Creating stream ‘Depth1’ of type ‘Depth’…
1439966        [VERBOSE]       Initializing stream ‘Depth1’…
1440152        [INFO]  Property Depth1.RequiredDataSize was changed
to 153600.
1440339        [INFO]  Property Depth1.OutputFormat was changed to 1.
1440495        [INFO]  Stream ‘Depth1’ was initialized.
1440648        [INFO]  ‘Depth1’ stream was created.
1440999        [VERBOSE]       Batch configuring server…
1441280        [INFO]  Property Depth1.RequiredDataSize was changed
to 307200.
1441521        [INFO]  Property Depth1.XRes was changed to 640.
1441667        [INFO]  Property Depth1.RequiredDataSize was changed
to 614400.
1441980        [INFO]  Property Depth1.YRes was changed to 480.
1442131        [INFO]  Property Depth1.Resolution was changed to 1.
1442289        [VERBOSE]       Setting Depth1.Mirror to 1…
1442517        [INFO]  Property Depth1.Mirror was changed to 1.
1442671        [VERBOSE]       Requested to create a node of type
User…
1443760        [INFO]  Creating node ‘User1’ of type User…
1465725        [VERBOSE]       Opening stream Depth1…
1466717        [INFO]  Property Depth1.ActualReadData was changed to
1.
1920788        [INFO]  Property Depth1.State was changed to 1.
1920987        [INFO]  Stream Depth1 is open.
1921263        [VERBOSE]       Opening stream Image1…
1922125        [INFO]  Property Image1.ActualReadData was changed to
1.
5111051        [INFO]  Property Image1.State was changed to 1.
5111397        [INFO]  Stream Image1 is open.
5111575        [VERBOSE]       [FPS] User1 (I:  0.00, O:  0.00)
Depth1 (I:  0.00, O:  0.00) Image1 (I:  0.00, O:  0.00) ReadCalls:
0.00
Error: A timeout has occurred when waiting for new data!
7450788        [VERBOSE]       Setting Depth1.Registration to 0…
7480574        [VERBOSE]       [FPS] User1 (I:  0.00, O:  0.00)
Depth1 (I:  0.00, O:  0.00) Image1 (I:  0.00, O:  0.00) ReadCalls:
0.84
Error: A timeout has occurred when waiting for new data!
9494660        [VERBOSE]       [FPS] User1 (I:  0.00, O:  0.00)
Depth1 (I:  0.00, O:  0.00) Image1 (I:  0.00, O:  0.00) ReadCalls:
0.99
Error: A timeout has occurred when waiting for new data!
11499685        [VERBOSE]       [FPS] User1 (I:  0.00, O:  0.00)
Depth1 (I:  0.00, O:  0.00) Image1 (I:  0.00, O:  0.00) ReadCalls:
1.00
Error: A timeout has occurred when waiting for new data!
13505307        [VERBOSE]       [FPS] User1 (I:  0.00, O:  0.00)
Depth1 (I:  0.00, O:  0.00) Image1 (I:  0.00, O:  0.00) ReadCalls:
1.00
Error: A timeout has occurred when waiting for new data!
15509773        [VERBOSE]       [FPS] User1 (I:  0.00, O:  0.00)
Depth1 (I:  0.00, O:  0.00) Image1 (I:  0.00, O:  0.00) ReadCalls:
1.00

Lo arregle bajándome la versión anterior de estos binarios, esta versión la podéis bajar de http://code.google.com/p/kinemote/downloads/detail?name=SensorKinect-…

Una vez instalados todos estos componentes enchufáis la Kinect al portátil y se os instalara con los drivers, en Device Manager debéis de ver que se han instalado correctamente

Kinect in the Device Manager window

El siguiente paso es bajaros el fichero KinectXMLs en este fichero os encontrareis un zip que contiene la carpeta KinectXMLsOpenNI en esta carpeta se encuentra el fichero SampleConfig.xml , debeis de copiarlo al directorio C:Program Files (x86)OpenNIData en la carpeta KinectXMLsNITE del fichero zip encontrareis los archivos Sample-Scene.xml, Sample-Tracking.xml ySample-User.xml, se deben de copiar a  C:Program Files (x86)Prime SenseNITEData

Ya estan todos los pasos realizados ahora solo tenéis que ejecutar un ejemplo para ver si funciona estos se encuentran en la carpeta C:Program Files (x86)OpenNISamplesBinRelease

Por ejemplo podéis lanzar el NiUserTracker.exe

image

 

Solo tenéis que seguir los posts de Bruno para ver ejemplos.

Windows Phone–Tutorial XVI–Hacer hablar a tu Windows Phone

En esta entrada vamos a aprovecharnos de la API de Bing Translator para explicar como reproducir sonidos en nuestro Windows Phone, para ello recuperamos el código del post Windows Phone–Tutorial XIII – Usando datos en Windows Phone 7–Web Services donde teníamos un traductor utilizando la API de Bings, en este ejemplo lo que vamos a hacer es utilizar bings para que el texto traducido lo “diga” el teléfono.

Lo primero que tenemos que hacer es invocar al método de la API de Bings SpeakAsync que nos devuelve una uri con el sonido del texto que enviemos, tan sencillo como

1 void proxy_TranslateCompleted(object sender, TranslateCompletedEventArgs e) 2 { 3 LanguageTo = e.Result; 4 LanguageServiceClient proxy = new LanguageServiceClient(); 5 proxy.SpeakCompleted += new System.EventHandler<SpeakCompletedEventArgs>(proxy_SpeakCompleted); 6 proxy.SpeakAsync(APPID, LanguageTo, LanguageToSelected.Code, "audio/wav"); 7 8 }

Como podeis ver en el código a la API solo hay que enviarle el ID de Bing el texto, el código del lenguaje y el formato del audio

En el evento proxy_SpeakCompleted reproduciremos el archivo con el sonido del texto, para ello debemos utilizar el método SoundEffect.FromStream, la clase SoundEffect se encuentra en XNA concretamente en el assembly Microsoft.Xna.Framework añadiendo esta referencia con solo el siguiente código reproduciríamos el archivo.

1 void proxy_SpeakCompleted(object sender, SpeakCompletedEventArgs e) 2 { 3 var client = new WebClient(); 4 client.OpenReadCompleted += ((s, args) => 5 { 6 SoundEffect se = SoundEffect.FromStream(args.Result); 7 se.Play(); 8 }); 9 client.OpenReadAsync(new Uri(e.Result)); 10 }

 

Si ejecutamos la aplicación cuando demos al botón de traducir obtendremos el error

System.InvalidOperationException was unhandled

  Message=FrameworkDispatcher.Update has not been called. Regular FrameworkDispatcher.Update calls are necessary for fire and forget sound effects and framework events to function correctly. See
http://go.microsoft.com/fwlink/?LinkId=193853 for details.

  StackTrace:

       at Microsoft.Xna.Framework.FrameworkDispatcher.AddNewPendingCall(ManagedCallType callType, UInt32 arg)

       at Microsoft.Xna.Framework.UserAsyncDispatcher.HandleManagedCallback(ManagedCallType managedCallType, UInt32 managedCallArgs)

       at Microsoft.Xna.Framework.UserAsyncDispatcher.AsyncDispatcherThreadFunction()

Esto es debido a que estamos utilizando un elemento de XNA en aplicaciones Silverlight, para hacerlo funcionar en aplicaciones de Silverlight debemos de seguir estos pasos

Crear la clase XNAAsyncDispatcher con el siguiente código

1 public class XNAAsyncDispatcher : IApplicationService 2 { 3 private DispatcherTimer frameworkDispatcherTimer; 4 5 public XNAAsyncDispatcher(TimeSpan dispatchInterval) 6 { 7 this.frameworkDispatcherTimer = new DispatcherTimer(); 8 this.frameworkDispatcherTimer.Tick += new EventHandler(frameworkDispatcherTimer_Tick); 9 this.frameworkDispatcherTimer.Interval = dispatchInterval; 10 } 11 12 void IApplicationService.StartService(ApplicationServiceContext context) 13 { 14 this.frameworkDispatcherTimer.Start(); 15 } 16 void IApplicationService.StopService() 17 { 18 this.frameworkDispatcherTimer.Stop(); 19 } 20 void frameworkDispatcherTimer_Tick(object sender, EventArgs e) 21 { 22 FrameworkDispatcher.Update(); 23 } 24 }

Y por ultimo en el archivo App.xaml.cs en el constructor añadir la línea

1 this.ApplicationLifetimeObjects.Add(new XNAAsyncDispatcher(TimeSpan.FromMilliseconds(50)));

Ahora si funcionara y oiremos la traducción

 

image

 

Windows Phone–Tutorial XV – Monitorizar el trafico http de tu emulador usando fiddler

En los anteriores artículos Windows Phone–Tutorial XIV – Usando datos en Windows Phone 7–Servicios RES y Windows Phone–Tutorial XIII – Usando datos en Windows Phone 7–Web Services vimos como acceder a servicios tanto SOAP como REST para mostrarlos en nuestros Windows Phone, yo siempre que desarrollo con servicios en algún momento tengo que monitorizar el trafico por una o otra razón. En mi caso Fiddler es la herramienta que utilizo y considero imprescindible que mi equipo la utilice. 

Si abro Fiddlery utilizo la aplicación de ejemplo de servicios REST de traductor de Google vemos que se produce el siguiente error, no encuentra el servidor

 

image

 

Debemos habilitar Fiddler para ello seguimos los siguientes pasos

 

  • Click Tools > Fiddler Options.
  • En la pestaña Connections marcar Allow remote computers to connect

image

  • En QuickExec box bajo la lista de sesiones introducimos prefs set fiddler.network.proxy.registrationhostname HostName donde HostName

    es el nombre de tu equipo

image

  • Cerramos y abrimos de nuevo Fiddler
  • Cerramos y abrimos de nuevo el emulador

Y ya esta podemos empezar a monitorizar el trafico que envía nuestro emulador de Windows Phone 7

+30 Tutoriales de Windows Phone 7

 

30+ Excellent Windows Phone 7 Development Tutorials

Hoy me he encontrado en el blog de Microsoft Lebanon’s Official Blog una entrada con mas de 30 tutoriales de desarrollo de Windows Phone 7 una gran colección de recursos para aprender.