Abierto el registro de desarrolladores para Marketplace

Podemos ver en el blog del equipo de desarrollo de Windows Mobile y en su web de desarrolladores que ya es posible registrarse en Marketplace y comenzar a preparar tus aplicaciones para ser comercializadas o distribuidas a través de este canal.

El registro es sencillo, tras iniciar sesión con una cuenta de passport deberemos rellenar los datos que nos solicitan, nombre, si somos particulares o empresas y como no que nos identifiquemos (CIF/NIF) y datos bancarios a efectos claro esta de gestionar los cobros y pagos y por ultimo llega la parte dolorosa de pagar la inscripción 99$. Estos 99$ no son realmente para pagar la inscripción, leyendo el acuerdo, este pago corresponde a la gestión del proceso de certificación de las aplicaciones para su permanencia en Marketplace. Con el pago del registro tenemos derecho a certificar y subir 5 aplicaciones, (ya sean estas gratuitas o de pago). Para el resto deberemos abonar los 99$ correspondientes de cada certificación.

Para incluir actualizaciones de nuestras aplicaciones no es necesario abonar de nuevo el pago y además Microsoft no exige que distribuyas tu aplicación solo en Marketplace.

Respecto a los pagos por la compra de nuestras aplicaciones, Microsoft nos ingresará el dinero entre 15 y 120 dias (dependiendo el método de pago empleado) 15- 30 dias en el caso de tarjetas de crédito  y hasta 120 días en el caso de compra a través de un operador.

La espina que veo escondida es que cuando certifiquemos una aplicación y tras haber abonado los 99$ esta será distribuida en la región que especifiquemos, si queremos distribuirla en otras regiones deberemos abonar una pequeña cantidad adición (a fecha de hoy aun no han dicho cuanto), así que aunque desarrollemos una aplicación para varios lenguajes nos tocara revisar bien donde nos interesa poner visible nuestro desarrollo.

 

MarketplaceReg

 

Aunque Marketplace  esta pensado para ser utilizado con Windows Mobile 6.5, anuncian la posibilidad de certificar aplicaciones para Windows Mobile 6.x lo que nos da una clara pista de que dispondremos de Marketplace también para esta plataforma.

En la web de desarrolladores podemos encontrar un FAQ que nos puede aclarar estos temas y muchas cosas más http://developer.windowsmobile.com/Help.aspx

Un saludo

José Antonio Gallego

Mobile .NET Users Group

Asociar extensiones de archivo a nuestras aplicaciones en Compact Framework

 
En Windows Mobile al igual que en Windows podemos asociar una extensión de archivo para que se ejecute una aplicación determinada. Podemos asociar los archivos con una extensión (por ejemplo .rxr) para que sean abiertos con una aplicación desarrollada por nosotros.
 
En Windows Mobile esto lo podemos hacer modificando el registro.
 

 
Las claves a generar se encuentran dentro de HKEY_CLASSES_ROOT. Para poder ver el registro de nuestro dispositivo (también podemos hacerlo sobre un emulador) utilizaremos el Editor de registro remoto que podemos encontrar en Visual Studio Remote Tools, más adelante veremos como hacerlo directamente desde código.
 
Lo primero será crear una clave con el nombre de nuestra extensión (por ejemplo .rxr) en el valor por defecto especificamos la asociación (por ejemplo rxrfile) dentro de HKEY_CLASSES_ROOT.
 
Después crearemos otra clave en HKEY_CLASSES_ROOT con el nombre de la asociación (rxtfile), dentro de esta creemos la estructura de claves OpenCommand nos quedará una ruta como la que sigue, HKEY_CLASSES_ROOTrxrfileOpenCommand. Ahora modificaremos el valor por defecto (Default) de Command por la ruta al ejecutable (en nuestro ejemplo nuestra propia aplicación) y lo haremos de modo que pueda recoger un parámetro (esto lo hacemos agregando %1), este parámetro se inicializara con la ruta del archivo que se esté ejecutando.
 
La cadena quedará como sigue: (Comillas incluidas)
 
«Program FilesMi_aplicación.exe» «%1»
 

Por otro lado ya que nos ponemos a asociar el archivo queda muy elegante asociar el icono de nuestra aplicación a la extensión asociada, para ello podemos agregar la clave HKEY_CLASSES_ROOTrxrfileDefaultIcon y establecer el valor con la ruta del ejecutable y agregar, 0 al final.

 

Aquí os dejo un ejemplo de como podemos hacer todo esto.
 

 

/// <summary>
/// Asociar una extensi¢n de archivo a una aplicación
/// </summary>
/// <param name=»extension»>Extensión a asociar</param>
/// <param name=»aplicacion»>Aplicación a ejecutar</param>
private void AsociarArchivo(string extension, string aplicacion)
{
  //Creamos la key en HKEY_CLASSES_ROOT
  RegistryKey key1declaracion = Registry.ClassesRoot.CreateSubKey(«.» + extension);

  key1declaracion.SetValue(«Default», extension + «file»);

  //Creamos las siguientes claves en
 
//HKEY_CLASSES_ROOTxxxfileShellOpenCommand
RegistryKey key2asociacion = Registry.ClassesRoot.CreateSubKey(@»» + extension + «file» + @»ShellOpenCommand»);

// Establecemos el valor por defecto a la ruta al ejecutable a asociar,
// %1 ser  el parametro con el que se iniciar  la aplicación y
// equivaldr  al path del archivo.
key2asociacion.SetValue(«Default»,@»»»» + aplicacion + @»»» «»%1″»»);

//Asociamos el icono de nuestro ejecutable a la extensi¢n asociada
RegistryKey key3Icono = Registry.ClassesRoot.CreateSubKey(@»» + extension + «file» + @»DefaultIcon»);
key3Icono.SetValue(«Default», @»»»» + aplicacion + @»»»» + «0»);
}

 

 

Podéis encontrar una solución con el código fuente completo para Visual Studio 2008 (SDK WM5) en el siguiente enlace: Asociar extensiones en WM

Un saludo a todos

José Antonio Gallego

Mobile .NET Users Group

SDK Omnia 1.0 para Windows Mobile de parte de Samsung

Este fin de semana Samsung ha colgado en su web el nuevo SDK para Samsung Omnia, su dispositivo «Windows Phone».

Con este SDK (para nativo) se ofrece la posibilidad a  los desarrolladores de integrar el Acelerometro, controlar los LEDS, el emulador de ratón óptico, la salida de video, la ruleta del teclado, la orientación de la pantalla, el sensor de luz, el flash de la cámara etc.

Aunque el SDK esta documentado y el instalador es para código nativo, Samsung incluye dentro de la instalación, en la carpeta samples/managed/BounceDemo/Wrappers los wrapers para nativo de algunas de las funcionalidades del SDK (Entre ellas el acelerometero) y también nos adelanta de que es posible realizar wrapers para el resto de funcionalidades.

 Un saludo!

José Antonio Gallego

Mobile .NET Users Group

[Reflection] Un momento de reflexión… para Windows Mobile (MenuItem.Click)

Las limitaciones a las que nos vemos sometidos habitualmente los desarrolladores de Compact Framework, sobre todo si trabajamos sobre código manejado, suelen resultar muchas veces frustrantes, frustantes en el sentido de que algo que podíamos hacer de una manera sencilla en cualquier aplicación de escritorio no funciona de igual modo en la plataforma móvil.

Una de esas cosas, que de paso utilizo para el ejemplo, es poder enlazar el evento Click de un elemento MenuItem del cual desconozco su método asociado (en este caso OnClick), desde una función en código.

Lo más sencillo sería, venga va, si tienes el código fuente pues no seas desastre y mira el método que tienes asociado al evento click del MenuItem y a correr… está claro que es lo más sencillo ¿no? Pero si estás desarrollando un control que requiere ejecutar lo que el desarrollador enlace al evento Click del MenuItem la cosa se complica. Resulta que el método OnClick del MenuItem en Compact Framework esta declarado internamente como «Protected Internal vitual» así que nos olvidamos de poder invocarlo… y tampoco podemos recuperar el EventHandle al que esta asociado el evento Click del MenuItem.

Código interno del metodo OnClick dentro del control MenuItem

protected internal virtual void OnClick(EventArgs e)
{
    if (this.Click != null)
    {
        this.Click(this, e);
    }
}

Pues utilizando un poquito de reflection, podemos asociar el evento a nuestro propio código utilizando tan solo unas líneas de código.

En el ejemplo estamos asociando que cuando se dispare nuestro metodo, al que hemos llamado quickMenuItem.click, se ejecute también el método OnClicK del MenuItem que pasemos por código y por consiguiente se dispare el EventHandle asociado al click del MenuItem

using System.Reflection;
(…)
//Creamos un EventHandler y lo instanciamos con la definición del evento Click del menuItem que deseemos
EventHandler click = (EventHandler)GetPrivateField(menuItemX, «Click»);
quickMenuItem.Click += click;
(…)

//Recuperamos el campo privado a enlazar
private object GetCampoPrivado(object obj, string campo)
{

      //Prestar especial atención a los atributos
      FieldInfo fi = obj.GetType().GetField(campo, BindingFlags.NonPublic|BindingFlags.GetField|BindingFlags.Instance);
      return fi.GetValue(obj);
}

Esto es realmente sencillo, y nos muestra que muchas de las limitaciones con las que nos encontramos tienen una fácil solución.

NOTA: Una herramienta (comunmente concida) que realmente nos puede ayudar es la Red Gate’s .NET Reflector a la hora de descubrir métodos eventos y propiedades privadas.

Un saludo a todos.

José Antonio Gallego

Mobile .NET Users Group

[Mobile World Congress 2009] Microsoft Recite

Una novedad a destacar ha sido el anuncio de Microsoft Recite, esta tecnología nos permite desde nuestros dispositivos móviles, almacenar notas de voz y realizar búsquedas de las mismas, y todo ello utilizando solo la voz, esta herramienta es muy útil sobre todo si solemos dejarnos mensajes de voz para apuntar reseñas, ideas, tareas etc etc y al final del día no volvernos locos buscando entre todas las grabaciones.

 

clip_image001[5]clip_image001clip_image001[7]

 

Como en este tipo de historias suelo ser algo escéptico, no e podido evitar descargar la aplicación (por el momento gratuita) y comenzar a probarla, y la verdad es que tras la prueba no tiene mala pinta (a pesar de haber hecho la prueba con un dispositivo que no aparece en la lista de aptos), hemos probado a hacer unas cuantas grabaciones con dos voces distintas, y a realizar después búsquedas la verdad es que es resultado a sido más que aceptable, ahora solo falta que nos permitan incorporar esta tecnología a nuestros propios desarrollos 😛

Como no todo puede ser de color de rosa, tras las pruebas nos encontramos con lo que se podrían considerar fallos dediseño, tales como NO poder poner un nombre a tus grabaciones, y el echo de que funcione como si se tratase de un SmarthPone (no funciona la pantalla tactil) hace pensar que habrá en breve una nueva versión de esta aplicación, una que al menos siga los propios consejos de microsoft sobre buenas prácticas, al menos las de usabilidad….

Un saludo

José Antonio Gallego

Mobile .NET Users Group

[Mobile World Congress 2009] Nuevo escaparate para aplicaciones móviles, Windows® Marketplace for Mobile

Por fin ha llegado, el famoso y anunciado SkyMarket, un lugar desde donde poder acceder a un catalogo de aplicaciones para nuestros pequeños amigos. Y, es que, aunque suena igual a lo que la competencia directa lleva haciendo ya un tiempo (Vease Apple Iphone y Android)… bueno pues es lo mismo pero para Windows Mobile, por el momento y a la espera de poder probarlo parece que solo vendrá de serie para los nuevos dispositivos dotados con Windows Mobile 6.5.

Este nuevo servicio nos permitirá buscar y comprar aplicaciones desde el PC o directamente desde nuestro dispositivo Windows Phone (adiós a los Windows Mobile powered devices) y todo esto utilizando nuestra cuenta Windows Live ID. Este nuevo servicio permitirá a los desarrolladores de aplicaciones colgar sus aplicaciones (previo test por parte de Microsoft de la aplicación)

Por el momento no os molestéis en probarlo (a fecha de hoy) el servicio aun no está disponible aunque se prevé que esté listo a mediados de este año (y que nuestros ojos lo vean claro…) ya que no podremos disponer de estos dispositivos hasta Septiembre de este año (bueno salvo que visitéis este enlace, Flasheando la PDA con Windows Mobile 6.5)

 

Screen01 Screen02

Aquí las capturas para ver…. que no funciona aun…

Desde mi punto de vista esto es un anuncio que llega un poco tarde… aunque peor hubiese sido que no hubiese llegado nunca, y aunque desde septiembre de 2008 ya se rumoreaba sobre este tema no estaba claro que se anunciase para WM6.5

Cambio de pantalla en una HTC P3300. Uno de bricomania…

Hace unos meses durante la ejecución del MobilityShow tuve la mala suerte, por las prisas, la lluvia, el frio y el ir corriendo de un lado a otro de «sentarme» encima de la PDA con la consiguiente rotura de la pantalla (y todo justificado ya que llevaba dos HTC Dyamond en cada uno de los bolsillos delanteros, cargado con el portátil y encima estaba lloviendo….) el caso es que la PDA termino en este terrible estado.

Pantalla seccionada, la parte táctil aún funcionaba pero eso no era de mucho consuelo, tras evaluar si me merecía la pena mandarla a reparar fuera de la garantía el mandarla a la casa salía por un ojo pero encontré por e-bay una pantalla para la PDA y por solo 25€ (gastos ya incluidos) así que me dije que era hora de hacer un poco de bricomanía,así que: Hola amigos aquí va el bricocapitulo, como cambiar la pantalla de tu HTC P3300 sin tener una turbosierradelmegacoponbendito en el garaje.

Lo primero decir que junto con la pantalla venían también dos destornilladores cabeza de tor para aflojar la tornillería y una pieza de plástico para facilitar la apertura de la PDA sin dañar demasiado el plástico.

Lo primero, apagamos la PDA, retiramos la tapa trasera y la batería .

Paso1

A continuación retiramos la tapa superior trasera, (Donde está el objetivo de la cámara), para ello nos ayudaremos con una pieza de plástico para evitar dañar la pieza.

Paso2

Una vez retirada procederemos a quitar los tornillos de sujección que se encuentran en las esquinas, (me niego a poner una foto de como desatornillar un tornillo jejeje)

Con los tornillos retirados (con esto nos acabamos de cargar la garantia, en caso de que aún estuviese vigente) debemos separar con cuidado la parte trasera de la cubierta, este es uno de los pasos «delicados», ya que para evitar romperla deberemos encontrar las «patillas» que sujetan la carcasa e ir abriéndolas una a una.

Aquí os muestro algunas de ellas (se encuentran fácilmente) pero no forceis o las partiréis.

Paso3 

A ambos lados de la parte inferior (ojo con apretar demasiado)

Paso4

Y en los laterales, a ambos lados por la parte central. Finalmente os quedaréis por un lado con la parte frontal y por otro con la carcasa trasera.

Paso5

En este punto es en el que empiezas a pensar que tu PDA no volverá a encenderse jamás y pides ayuda para compartir las culpas (Gracias Mario por la ayuda jejeje)

Continuamos, ahora debemos retirar la carcasa frontal, par facilitarnos el trabajo aflojáremos las patillas laterales, podéis verlas en la imagen inferior.

Paso6A

Una vez aflojadas las patillas procedemos a ir separando la carcasa del núcleo de la PDA cuidadosamente.

Paso6 

Así hasta que terminemos separando la carcasa definitivamente.

Paso7

Una vez llegados aquí damos la vuelta y procederemos a desensamblar la pantalla del dispositivo, par ello lo primero es localizar la cinta de datos, aflojar las patillas que la sujetan y procederemos a retirarla con cuidado de no dañar el conector (la pantalla nos da igual… total esta rota).

Paso8

Paso9

Una vez retirada la cinta de datos procedemos a retirar la pantalla averiada, es muy sencillo pero debemos tener cuidado ya que la pantalla seguramente estará sujeta con algo de cola al soporte.

Paso10

Retiramos la lengueta.

Paso11 

Nos ayudamos con un destornillador plano para despegar la pantalla.

Paso12

Hasta que finalmente conseguimos retirar la vieja pantalla, a partir de aquí los pasos a seguir son básicamente los mismos en orden inverso, lo único deciros que mucha paciencia para colocar la cinta de datos de nuevo en su soporte, tomaroslo con mucha calma ya que sin práctica a la primera es complicado y podemos dañar el conector.

Una vez colocada la nueva pantalla antes de proceder a ensamblar todo colocaremos la batería y haremos una prueba de encendido para ver si todo esta correcto.

Paso13

Debemos sujetar la batería en su soporte para poder hacer la prueba.

Paso14 

Una vez que vemos que todo funciona correctamente procedemos a ensamblar todo de nuevo y listo, pantalla arreglada.

Paso15

 

Espero que esto os sirva, a mi me alegro el día jejeje, la verdad es que recuperarla ha sido todo una suerte que ya la daba por perdida.

Un saludo!

José Antonio Gallego

Mobile .NET Users Group

Nueva Actualización de la guía de Arquitectura para desarrollo Móvil 1.1

Si hace un par de meses en Codeplex se publicó la nueva guía de arquitectura para desarrollo Móvil ahora se acaba de lanzar la versión 1.1, por lo que me ha dado tiempo a revisar los cambios han ido orientados a la incorporación de recomendaciones sobre UI y nuevos métodos de comunicación SyncServices.

El orden de los capítulos es el mismo por lo que solo se han realizado modificaciones en la parte importante, en lo que se debe y no se debe hacer 🙂

Además ha contado con la colaboración de Rof Tiffany y Rabi Satter.

Aquí os dejo el enlace para la guía. Actualización de la guía de Arquitectura para desarrollo Móvil 1.1

A disfrutarla!!

Centinela Bluetooth para Windows Mobile, jugando con RegistryState

Se acabó el darte cuenta al llegar al trabajo que dejaste la mochila con el portátil en casa… y es que cansado ya de salir corriendo de casa y darme cuenta «demasiado tarde» de que no llevo el portátil encima se me ocurrió inspirado en la nueva idea de Nokia (bueno no tan nueva todos conocemos los busca llaves) que están desarrollando un sistema para localizar objetos con el móvil, el desarrollar algo similar para Windows Mobile y claro, sin tener que gastarme ni un euro que esta la cosa muy mal para hacer derroches.

image

 

El objetivo ha sido crear una aplicación capaz de avisarme en la PDA si me separo de mi manos libres Bluetooth, además el aviso debe saltar aunque la aplicación NO este corriendo en ese momento y aunque la PDA NO esté encendida… Con lo que dejando el manos libres en la mochila si me alejo saltara la alarma.

image

 

Así que manos a la obra, para hacerlo tan solo he necesitado en lo que a hardware se refiere mi PDA HTC P3300 con Windows Mobile 5.0 y el manos libres Bluetooth, para todo lo demás RegistryState de Microsoft.WindowsMobile.Status y algunas llamadas a Pinvoke.

Mediante RegistryState podemos detectar cuando se produce algún cambio en cualquier clave del registro de nuestro dispositivo, y además nos genera el evento correspondiente y nos provee de los métodos necesarios para recuperar los valores que deseemos, basándonos en esto, la clave del registro HKEY_LOCAL_MACHINESystemStateHardwareBluetooth se actualiza con los cambios de estado del Bluetooth de nuestro dispositivo por lo que empezaremos por ahí.

image

En nuestra aplicación para poder capturar dichos cambios tan solo necesitamos crear lo siguiente:

//Como detectar los cambios producidos en el registro

(…)

    const string registryKey = @»HKEY_LOCAL_MACHINESystemStateHardware»;
    const string registryValueName = @»Bluetooth»;

    Microsoft.WindowsMobile.Status.RegistryState rg;    
    rg = new RegistryState(registryKey, registryValueName);                       
    rg.Changed += new ChangeEventHandler(rg_Changed); 
(…)

void rg_Changed(object sender, ChangeEventArgs args)
{  

}

De este modo cada vez que se produzca un cambio en esta clave (Activemos o desactivemos el Bluetooth, conectemos o desconectemos un dispositivo) se ejecutara en nuestro caso la función rg_Changed.

Así que con esto ya tenemos la primera parte resuelta, en caso de tener la PDA emparejada con el manos libres, si nos dejamos el manos libres en la mochila y nos alejamos se perderá la conexión y se producirá un cambio en el estado ejecutándose el método rg_Changed, y ahí podemos poner que vibre la PDA o que suene la flauta si hace falta, pero que ocurre si nuestra aplicación NO se está ejecutando en ese momento… pues obviamente que no funcionara, pero también lo podemos resolver con cuatro líneas de código gracias al método EnableApplicationLauncher que nos permite asociar una aplicación a un evento del sistema. Es decir que si ocurre un cambio, como puede ser el del estado del Bluetooth, que ejecute la aplicación que especificaremos por código.

Para ello agregaremos

//Como hacer que se ejecute una aplicación al detectar un cambio en el estado del dispositivo

const string appId = «DetectorBT»;
const string applicationFileName = @»Archivos de programaDetectorBTDetectorBT.exe»;
rg.EnableApplicationLauncher(appId, applicationFileName);

Así aun cuando cerremos la aplicación si nuestra PDA está encendida si se ejecuta cualquier cambio en la clave Bluetooth nuestra aplicación se ejecutara y ya tenemos otro punto solucionado… pero ahora viene «lo gordo», está claro que si nos acordamos de encender la PDA para ver que no se nos olvida nada nos acordaremos del portatil y esta claro que a las 7 de la mañana no te vas a acordar de encender la PDA por lo que debemos implementar «algo» que active la PDA para que veamos el aviso.

El como encender la pda lo podemos resolver con dos llamadas a nativo PowerPolicyNotify y SetSystemPowerState como se muestra a continuación

//Como encender la PDA mediante código

[DllImport(«coredll.dll», CharSet = CharSet.Unicode)]
private static extern bool PowerPolicyNotify(int dwMessage, int dwData);

[DllImport(«coredll.dll», SetLastError = true)]
static extern int SetSystemPowerState(string psState, int StateFlags, int Options);

/// <summary>
/// Despierta el dispositivo
/// </summary>
public void WakeUpPDA()
{
    PowerPolicyNotify((int)PPN_Message.PPN_UNATTENDEDMODE, 1);
    int iReturnResult = SetSystemPowerState(null, (int)PowerState.POWER_STATE_ON, (int)PowerRequirement.POWER_FORCE);
}

Así que de este modo si llamamos a WakeUpPDA cuando por ejemplo perdamos el control del manos libres y el estado vuelva a encendido y en espera (valor 9) despertamos la PDA y veremos el aviso que hayamos creado.

Con todo esto os dejo la aplicación de ejemplo Centinela Bluetooth para que alguno se anime a mejorarla, está claro que lo genial sería que fuese capaz de calcular la distancia a la que se encuentra pero en 2 horas no me ha dado tiempo a mucho mas.

Una de las opciones que estaba barajando era la de intentar estimar a que distancia se encuentra el dispositivo pero dadas las características del protocolo bluetooth y del tipo de dispositivo que estoy utilizando (uno de tipo 3 con alcance hasta 100 metros) no ha sido posible.

Todo esto está desarrollado para Windows Mobile 5.0 de ahí que utilice RegistryState en lugar de SystemSate para poder utilizar esta aplicación como ejemplo.

Saludos!!!

José Antonio Gallego

Ups, casi se me olvida aquí os dejo la solución con el ejemplo para Visual Studio 2008 y Windows Mobile 5.0 (MobileNUG.DetectorBT);

Modificando las SoftKeys en Windows Mobile

Todos nuestros dispositivos móviles dotados con Windows Mobile vienen con las SoftKeys configuradas de serie, bien con la configuración original de la ROM del fabricante, bien con la del proveedor. Es muy corriente que queramos que nuestra aplicación pueda ser activada utilizando alguna de las Softkeys. Para ello tan solo debemos hacer una pequeña modificación en el registro, aunque antes debemos localizar la ubicación correcta de las claves, estas son Keys112 para la tecla izquierda y 113 para la tecla derecha.

En Windows Mobile 5 y Windows Mobile 6 podemos encontrarla en [HKEY_CURRENT_USERSoftwareMicrosoftTodayKeys112 y 113 dentro de cada una de las claves encontraremos dos valores de cadena el primero (Default) contendrá el texto que se mostrará en el menú, si agregamos un nuevo valor llamado «open» podremos especificar el ejecutable o acceso directo a lanzar cuando se presione el botón.

image

Como podéis ver es una modificación muy sencilla, en caso de no encontrar esta entrada podremos crearlas, por ejemplo si hacemos la prueba con los emuladores, encontraremos la clave Today pero no la clave Keys.

image

Un saludo a todos!

José Antonio Gallego

Mobile .NET Users Group