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!