Bom pessoal, hoje um artigo para mostrar algo que é bem simples, mas que tem gerado muitas dúvidas no pessoal.
Tenho recebido muitas dúvidas e questões relacionadas a nuvem e ao SkyDrive. Talvez por envolver diferentes APIs e o nome assuste, não sei, mas fato é que parece ser muito mais complexo do que é.
Vamos mostrar hoje como salvar alguma informação da sua aplicação em um arquivo no SkyDrive. Da mesma forma podemos obter a lista de folders na aplicação ou mesmo trabalhar com outros aplicativos Live. Mas hoje o foco é backup na nuvem.
Para trabalhar com SkyDrive (e outrs soluções Live) em seu aplicativo Windows Phone, você precisa do SDK da Live para começar. Vá para http://www.microsoft.com/download/en/details.aspx?displaylang=en&id=28195 e faça o download.

Após isso, adicione as referências ao seu aplicativo:

Pronto, agora é só implementar o código!
Para começar, precisamos colocar em algum local do aplicativo um botão para que o usuário possa se logar ao SkyDrive (no caso, o Live ID).
Você pode arrastar/usar o controle SignInButton , que irá encapsular todas as chamadas REST e o processo OAuth necessárias para que o usuário consiga fazer o login.

O código xaml do controle ficará assim:
1: <my:SignInButton x:Name="skyDriveLogin" ClientId="xxxxxxxxx"
2: Scopes="wl.signin wl.basic wl.skydrive wl.skydrive_update"
3: Branding="Windows" TextType="Login" SessionChanged="skyDriveLogin_SessionChanged"
4: RedirectUri="" />
O ClientID na linha 1 é uma identidade que pecisa ser obtida para seu aplicativo: Vá para dev.live.com e você terá a lista de aplicativos. É só criar um novo aplicativo e irá receber o seu ID.

Além disso estamos definindo os escopos com os que queremos trabalhar (note o “update” no sky drive), o Branding é apenas o visual que o botão de login assume (você pode ter o logo do windows, do sky drive, etc..), e o session changed é o evento que iremos utilizar para Logar nosso usuário. O redirectURI também precisa ser uma URI válida!
Vamos ver como a nossa tela fica com o Botão:

Agora é hora de conectar o nosso usuário. O processo de login ocorrerá chamando a página de login do Live ID e o evento SessionChanged será disparado.
Veja a tela de login, de resultado, e o código do evento que mostra a autorização na tela:


1: LiveConnectClient client;
2:
3: private void skyDriveLogin_SessionChanged(object sender, Microsoft.Live.Controls.LiveConnectSessionChangedEventArgs e)
4: {
5: if (e.Status == LiveConnectSessionStatus.Connected)
6: {
7: client = new LiveConnectClient(e.Session);
8: ((App)App.Current).LiveSession = e.Session;
9: this.txtMensagem.Text = "Autorizado";
10:
11: client.GetCompleted += new EventHandler<LiveOperationCompletedEventArgs>(OnGetCompleted);
12: client.GetAsync("me", null);
13: }
14: else
15: {
16: this.txtMensagem.Text = "Falha no login";
17: client = null;
18: }
19: }
20:
21: void OnGetCompleted(object sender, LiveOperationCompletedEventArgs e)
22: {
23: if (e.Error == null)
24: {
25: if (e.Result.ContainsKey("first_name") &&
26: e.Result.ContainsKey("last_name"))
27: {
28: if (e.Result["first_name"] != null &&
29: e.Result["last_name"] != null)
30: {
31: this.txtUsuario.Text =
32: "Bem vindo " + e.Result["first_name"].ToString() + "" + e.Result["last_name"].ToString() + "!";
33: }
34: }
35: }
36: else
37: {
38: this.txtUsuario.Text = "Erro: " + e.Error.ToString();
39: }
40: }
Vamos lá, temos 40 linhas, mas a maioria está aí apenas para validações e para mostrar quem está logado.
Antes de qualquer coisa, estamos instanciando uma propriedade do tipo LiveConnectClient, que é justamente quem buscará a sessão e fará a chamada ao método que nos possibilitará acesso ao SkyDrive.
Na linha 5 fazemos uso do LiveConnectSessionStatus, que validará se já estamos conectados.
Quando o resultadofor “true”, então começamos o processo de realmente ir buscar informações.
Dois pontos importantes das linhas 7 a 12.
Primeiro, na linha 8, notem que ao invés de recebermos a sessão emuma variável local ao método ou à página, estamos o fazendo com uma propriedade da classe App (arquivoApp.xaml, presente em todo aplicativo WP7
E responsável pelo “container” que são os application pages).
E qual o motivo disso? O fazemos para que seja possível reutilizar essa informação através do aplicativo inteiro.
Quando formos subir nosso arquivo para o SkyDrive, não queremos o fazer através da página de configuração, certo? então estamos mantendo essa informação disponível.
Logo mais a utilizaremos novamente.
Já na linha 11 / 12 nos inscrevemos no evento Get e passamos o folder root do SkyDrive (no nosso exemplo
estaremos sempre salvando nessa pasta).
Você pode trabalhar da forma como preferir, inclusive dando a opçãode escolha ao usuário.
O evento OnGetCompleted nada mais é do que apenas mostrarmos informações sobre o usuário logado,
como podem ver nas imagens acima.
Com isso, o usuário está conectado ao SkyDrive!!
Simples, não?
Vamos agora entender como subir um arquivo.
Para isso, usei um exemplo e uma ideia de um formulário onde o usuário irá colocar alguma informação e a
salvará tanto no IsolatedStorage local, quanto poderá clicar em um CheckBox para também salvar a mesma
infona nuvem, no seu SkyDrive. Isso foi a base criada para o aplicativo que criei para o Devbrasil Summit 2012.
Não mostro aqui o código completo da tela, apenas o evento de click no botão “salvar”, com a parte do
Isolated Storage também suprimida.
Assim que o usuário clicar no botão “Salvar” na tela abaixo, o código a seguir é disparado:

1: private void btnNotas_Click(object sender, RoutedEventArgs e)
2: {
3: //SEÇÃO DE CÓDIGO DO ISOLATED STORAGE REMOVIDO
4:
5: if (chkSkyDrive.IsChecked == true)
6: {
7: if ((App.Current as App).LiveSession != null)
8: {
9: string nomeArquivo = codigo + ".txt";
10: byte[] arrayBytes = Encoding.UTF8.GetBytes(this.textNotas.Text);
11: MemoryStream stream = new MemoryStream(arrayBytes);
12:
13: LiveConnectClient cliente = new LiveConnectClient((App.Current as App).LiveSession);
14:
15: cliente.UploadCompleted += new EventHandler<LiveOperationCompletedEventArgs>(cliente_UploadCompleted);
16: cliente.UploadAsync("me/skydrive", nomeArquivo, stream);
17: }
18: else
19: {
20: MessageBox.Show("É necessário logar no Sky Drive");
21: }
22: }
23: }
O código é bastante simples:
Após salvar para o Isolated Storage (o código é 100% separado, ou seja, você pode salvar para o isolated e tratar com um try/catch de forma independente o acesso ao SkyDrive) validamos se o checkbox “Fazer Upload para o SkyDrive” está checado, seguido por validação da sessão (lembram que a usaríamos em nossa segunda tela? é aqui que a utilização da classe “App” faz sentido).
Se tudo estiver ok, vamos, na linha 9, criar um nome para o arquivo. aqui utilizei um código qualquer e adicionei o “.txt”. Fiquem livres para criar métodos verdadeiros, códigos ou padrões que façam sentido, assim como folders (e claro, uso de stringbuilders também são bacanas : ) )
Na linha 10 vamos buscar o valor do nosso conteúdo (no meu caso, o valor que inseri na imagem acima - “texto para artigo…”) para criação do nosso array de bytes e geramos um stream do tipo MemoryStream a partir desse array.
Novamente amos instanciar um LiveConnectClient, na linha 13, assim como fizemos anteriormente para obter os dados do usuário, e é com esse cliente que iremos chamar nosso serviço para fazer o upload.
Note que na linha 16 passamos o parâmetro de root folder para subir o arquivo (obviamente pode ser alterado e o hardcoded retirado), além do próprio nome do arquivo e o nosso stream.
Caso o usuário ainda não esteja logado, salvamos no isolated e mostramos a informação a ele. É só ir até a página de configuração, logar, e voltar para salvar na nuvem.
Só isso , Rodo?
Sim, isso e somente isso. abra seu SkyDrive e valide… seu arquivo estará lá!!
E pronto. agora seu aplicativo Windows Phone consegue fazer uploads e backup para a nuvem!

