Preparando una idea para un juego que tengo entre manos se me ha ocurrido que podría intentar conectar con los servicios que ofrece Live para ofrecer una experiencia mas social en el juego a parte de lo que es el propio juego.

El SDK de Live nos permite hacer uso de Skydrive, los contactos y el calendario de Hotmail, podemos hacer uso del chat de Messenger y por supuesto autenticarnos en Live y acceder a algunos datos de nuestro perfil.

Bueno pues es esto último lo que voy a mostrar y posteriormente iré mostrando como hacer uso de los demás servicios. Para empezar vamos a descargar e instalar el SDK de Live a través de este link .

cap1

Una vez instalado abrimos Visual Studio y creamos un proyecto de Silverlight para Windows Phone y lo primero que tenemos que hacer es agregar las referencias a nuestro proyecto de Microsoft.Live y Microsoft.Live.Controls y añadir al ToolBox el componente que nos autentica en el servicio.

cap2

cap3

Antes de seguir construyendo el programa necesitamos un identificador para que la aplicación pueda acceder al servicio de Live, para eso vamos a ir al gestor de aplicaciones de Live Connect, donde tenemos que registrar el nombre de la aplicación, el idioma y si la aplicación que accede es movil o no. A cambio de esto obtenemos un identificador de cliente y un codigo secreto de cliente.

cap5

cap6

Ahora ya podemos añadir el componente que hemos agregado a la caja de herramientas, este componente simplifica la conexión con el servicio Connect de Live:

cap4

A continuación rellenamos el Client ID que hemos obtenido de registrar la aplicación en Live:

cap8

Podemos personalizar más cosas, una de ellas, la propiedad Scopes, esta propiedad nos permite definir el nivel de los permisos de acceso a nuestros datos que va a tener la aplicación.

Existen varios tipos de permisos según el servicio de Live que queramos utilizar pero como de momento estamos probando la autenticación y el acceso a los datos de nuestro perfil solamente tenemos que fijarnos en tres que son comunes a todos los servicios:

  • wl.basic:  este permiso nos da acceso a los datos del usuario y también a su lista de contactos.
  • wl.offline_access: como el anterior nos da acceso a la lectura y actualización de los datos del usuario. Si no lo usamos tenemos que iniciar sesión.
  • wl.signin: inicio de sesión único, los usuarios quedan conectados para todos los servicios.

El que yo he utilizado es el básico como podéis ver en la imagen de arriba, es mas que suficiente para poder acceder a los datos del usuario.

Bueno pues ya solo queda construir la interfaz, es simplemente el botón de logueo y un par de textblocks para mostrar que estas conectando y otro para enseñar la info del usuario, quedaría de la siguiente manera:

cap9

El código en XAML sería el siguiente:

[sourcecode language=»xml» autolinks=»false»]
<phone:PhoneApplicationPage
x:Class="DemoLive1.MainPage"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:phone="clr-namespace:Microsoft.Phone.Controls;assembly=Microsoft.Phone"
xmlns:shell="clr-namespace:Microsoft.Phone.Shell;assembly=Microsoft.Phone"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d" d:DesignWidth="480" d:DesignHeight="768"
FontFamily="{StaticResource PhoneFontFamilyNormal}"
FontSize="{StaticResource PhoneFontSizeNormal}"
Foreground="{StaticResource PhoneForegroundBrush}"
SupportedOrientations="Portrait" Orientation="Portrait"
shell:SystemTray.IsVisible="True" xmlns:my="clr-namespace:Microsoft.Live.Controls;assembly=Microsoft.Live.Controls">

<!–LayoutRoot is the root grid where all page content is placed–>
<Grid x:Name="LayoutRoot" Background="Transparent">
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="*"/>
</Grid.RowDefinitions>

<!–TitlePanel contains the name of the application and page title–>
<StackPanel x:Name="TitlePanel" Grid.Row="0" Margin="12,17,0,28">
<TextBlock x:Name="ApplicationTitle" Text="Conectando con los servicios de Live" Style="{StaticResource PhoneTextNormalStyle}"/>
<TextBlock x:Name="PageTitle" Text="DemoLive" Margin="9,-7,0,0" Style="{StaticResource PhoneTextTitle1Style}"/>
</StackPanel>

<!–ContentPanel – place additional content here–>
<StackPanel x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0">
<my:SignInButton Content="Button" Height="113" HorizontalAlignment="Left" Margin="102,29,0,0" Name="signInButton1" VerticalAlignment="Top" Width="264" TextType="SignIn" ClientId="000000004C07BBAD" Scopes="wl.basic" SessionChanged="signInButton1_SessionChanged" />
<TextBlock Height="30" Name="txtStatus" Text="" Width="397" TextAlignment="Center" />
<TextBlock Height="Auto" HorizontalAlignment="Left" Name="txtInfo" Text="TextBlock" VerticalAlignment="Top" Width="438" TextWrapping="Wrap" Visibility="Collapsed" />
</StackPanel>
</Grid>
</phone:PhoneApplicationPage>
[/sourcecode]

En la parte de código, en la clase MainPage.xaml.cs vamos a utilizar dos objetos LiveConnectClient y LiveConnectSession, el primero para obtener los datos del usuario y el segundo para determinar si hemos conectado correctamente con el servicio de Live.

[sourcecode language=»csharp» autolinks=»false»]
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;
using Microsoft.Phone.Controls;
using Microsoft.Live;
using Microsoft.Live.Controls;

namespace DemoLive1
{
public partial class MainPage : PhoneApplicationPage
{

private LiveConnectClient client;
private LiveConnectSession session;

// Constructor
public MainPage()
{
InitializeComponent();
}

private void signInButton1_SessionChanged(object sender, LiveConnectSessionChangedEventArgs e)
{
if (e.Status == LiveConnectSessionStatus.Connected)
{
session = e.Session;
client = new LiveConnectClient(session);
txtStatus.Text = "Obteniendo información…";
client.GetCompleted += new EventHandler<LiveOperationCompletedEventArgs>(client_GetCompleted);
client.GetAsync("me");
}
else
{
txtStatus.Text = "No estás conectado!!";
client = null;
}
}

void client_GetCompleted(object sender, LiveOperationCompletedEventArgs e)
{
ocultarControles();
txtInfo.Text = e.RawResult.ToString();
txtInfo.Visibility = System.Windows.Visibility.Visible;
}

private void ocultarControles()
{
txtStatus.Visibility = System.Windows.Visibility.Collapsed;
signInButton1.Visibility = System.Windows.Visibility.Collapsed;
}
}
}
[/sourcecode]

En el evento Session_Changed comprobamos si esta conectado o no. En el caso de estar conectado mostramos un mensaje indicando que es esta obteniendo la información, una vez esté descargada ocultamos los botones de conexión y el mensaje anterior para mostrar solamente los datos del usuario.

 cap91     cap92

cap93     cap94

Como podéis ver es bastante sencillo conectarse a Live y obtener los datos del usuario.

Espero que os sirva, os dejo el código de ejemplo aquí para que podáis ejecutarlo (debéis rellenar el ClientID). En el próximo post veremos ya como hacer uso de alguno de los otros servicios que nos ofrece Live.

Un saludo