segunda-feira, 15 de julho de 2013

Ganhe um Aparelho com Windows Phone 8

A Marmalade está promovendo o seu produto, uma ferramenta cross-plataform, que permite que os desenvolvedores façam seus aplicativos e distribuam em várias plataformas sem ter que codificar novamente.

A promoção não é sorteio, e sim,faça e ganha, ou seja, basta submeter um App desenvolvido utilizando o Marmalade, e seguindo algumas regras para não serem criados aplicativos sem funcionalidade, que, após a aprovação do App, o aparelho será entregue. E sim, o Brasil está dentro dos países participantes.

O aparelho é o Nokia Lumia 820.

Veja tudo aqui e comece já a programar.

segunda-feira, 8 de julho de 2013

Salvando valores de configurações de Apps no Windows Phone

É normal existir uma página de configurações para os aplicativos, pode ser necessário salvar alguma preferência do usuário, ou alguma informação que aplicação utiliza em alguma parte da sua funcionalidade. A melhor forma de se armazenar estas informações referentes a configuração é se utilizando da classe IsolatedStorageSettings. Esta classe armazena um par de chave e valor, como se fosse um arquivo de propriedades.

Mas utilize esta classe somente mesmo para poucos dados, e que não são relaionados o outros dados da sua apliacção.

No exemplo a seguir é mostrado como salvar, recuperar e remover dados utilizando a IsolatedStorageSettings:

Crie uma tela como esta:
 Para salvar o valor, o nome "userData" é para o exemplo, nomeie cada propriedade de acordo com algo que seja relevante na sua aplicação:

private void btnSave_Click(object sender, RoutedEventArgs e)
{
    IsolatedStorageSettings settings = IsolatedStorageSettings.ApplicationSettings;
    // txtInput is a TextBox defined in XAML.
    if (!settings.Contains("userData"))
    {
        settings.Add("userData", txtInput.Text);
    }
    else
    {
        settings["userData"] = txtInput.Text;
    }
    settings.Save();
}

Para ler o dado já salvo, faça conforme abaixo:

private void btnDisplay_Click(object sender, RoutedEventArgs e)
{
    // txtDisplay is a TextBlock defined in XAML.
    txtDisplay.Text = "USER DATA: ";
    if (IsolatedStorageSettings.ApplicationSettings.Contains("userData"))
    {
        txtDisplay.Text +=
        IsolatedStorageSettings.ApplicationSettings["userData"] as string;
    }
}
E finalmente, para excluir, basta seguir o exemplo:

private void btnRemove_Click(object sender, RoutedEventArgs e)
{
    if (IsolatedStorageSettings.ApplicationSettings.Contains("userData"))
    {
        IsolatedStorageSettings.ApplicationSettings.Remove("userData");
   }
}

Se sua aplicação utilizar mais chaves, basta adiciona-las conforme exibido no passo de salvar. Fonte: http://msdn.microsoft.com/en-us/library/windowsphone/develop/jj714090%28v=vs.105%29.aspx

segunda-feira, 1 de julho de 2013

Aplicações que enviam SMS no Windows Phone

O sistema operacional do Windows Phone não permite que, programaticamente, sejam enviados SMS, o que ele permite é que você crie todo o SMS para o usuário enviar. Em outras palavras, via código você consegue apenas formatar um SMS, mas no final do processo o usuário deve apertar o botão de enviar.

Para isto, seu aplicativo, primeiramente, deve usar a biblioteca de tasks do windows phone:

using Microsoft.Phone.Tasks;

Então, se cria o objeto SmsComposeTask:

SmsComposeTask smsComposeTask = new SmsComposeTask();

Feito isto, basta agora colocar o número para onde se vai enviar o SMS, a mensagem, e por fim exibir para que o usuário possa enviar o SMS:

smsComposeTask.To = "11111";
smsComposeTask.Body = "Esta é a mensagem que será enviada.";
smsComposeTask.Show();

Só isto, bem simples.

Fonte: http://debugmode.net/2011/10/18/code-to-send-sms-in-windows-phone-7/

segunda-feira, 24 de junho de 2013

Passando parâmetros entre páginas no Windows Phone

Em algum momento no seu aplicativo, será necessário passar o parâmetro de uma página para outra. Existem várias maneiras de se fazer, vou mostrar agora algumas destas formas de se passar um parâmetro simples de uma página para outra.

Passando uma string simples

A maneira mais simples de se passar o parâmetro é através de uma string simples, funciona como uma passagem de parâmetros em linguagens web, pode ser colocado diretamente em links ou em métodos, como o Navigate de algum controle:

private void btnNavigate_Click(object sender, RoutedEventArgs e)
{
    NavigationService.Navigate(new Uri("/Page1.xaml?parameter=test", UriKind.Relative));
}

Para recuperar o valor, tem que ser no método OnNavigatedTo da página de destino, utilizando o objeto NavigationContext:

protected override void OnNavigatedTo(System.Windows.Navigation.NavigationEventArgs e)
{
    base.OnNavigatedTo(e);  
    string parameterValue = NavigationContext.QueryString["parameter"];  
}

String Formatada

Pode-se também se utilizar de strings formatadas para passar o parâmetro, não esqueça de utilizar o método Uri.EscapeUriString para evitar exceções de formato da string:

private void btnNavigate_Click(object sender, RoutedEventArgs e)
{
    string stringVariable = "String de teste";
    NavigationService.Navigate(new Uri(string.Format("/Page1.xaml?parameter={0}", Uri.EscapeUriString(stringVariable), UriKind.Relative)));
}

Para recuperar a string é a mesma coisa de uma string simples.

Passando Múltiplos Parâmetros

Como comentado anteriormente, a passagem de parâmetros funciona de maneira bem similar a demais linguagens de programação web, então, para passar mais de um parâmetro, basta adicionar o conector & entre os parâmetros:

private void btnNavigate_Click(object sender, RoutedEventArgs e)
{
    NavigationService.Navigate(new Uri("/Page1.xaml?parameter1=p1&parameter2=p2", UriKind.Relative));
}

Para recuperar os valores é só repetir o comando para cada parâmetro:


protected override void OnNavigatedTo(System.Windows.Navigation.NavigationEventArgs e)
{
    base.OnNavigatedTo(e);
    string parameterValue1 = NavigationContext.QueryString["parameter1"];
    string parameterValue2 = NavigationContext.QueryString["parameter2"];  
}

Simples assim.

Fonte: http://www.geekchamp.com/tips/how-to-pass-data-between-pages-in-windows-phone-alternatives

segunda-feira, 17 de junho de 2013

Criando aplicações Trial no Windows Phone

O SDK do Windows Phone nos permite liberar aplicativos que contenham uma versão de avaliação do aplicativo, onde o usuário consegue utilizar a aplicação (mesmo que sem utilizar todos os recursos do app) fazendo então uma avaliação e então decidir pela compra... ou não.

Se o aplicativo que você está desenvolvendo será cobrado, mesmo que o preço mínimo da loja, disponibilize uma versão de avaliação para o usuário. A maioria das pessoas não irá comprar seu aplicativo sem antes experimentá-lo.

Planeje quais funcionalidades do seu aplicativo estarão disponíveis na versão Trial, não use a tática de liberar acesso a tudo por um período de data, isto não é confiável, o melhor é colocar restrições no uso do aplicativo, como por exemplo permitir somente a entrada de X itens numa lista, etc.

Para verificar se um aplicativo está na versão de avaliação ou não, utilizamos o objeto LicenseInformation, este objeto só funciona após o seu app estar publicado no Marketplace, então, para testar, teremos que simular o resultado deste objeto.

O primeiro passo é abrir o arquivo App.xaml.cs, e nele adicionar a referência para a biblioteca Microsoft.Phone.Marketplace, criar o objeto LicenseInformation e a propriedade (readonly, só tem o get, nada de set) isTrial:

using Microsoft.Phone.Marketplace;
 
private static LicenseInformation _licenseInfo = new LicenseInformation();
 
private static bool _isTrial = true;
        public bool IsTrial
        {
            get
            {
                return _isTrial;
            }
        } 

O teste para saber se a aplicação está no modo de avaliação, ou não, deve ser executada em dois momentos: Quando a aplicação é executada e quando a aplicação sai da inatividade, portanto temos que fazer a verificação nos event handlers Application_Launching (quando é executada) e Application_Activated (quando volta de inatividade). Para isto criamos um método, no arquivo App.xaml.cs, para fazer esta verificação:

       
        private void CheckLicense()
        {
            // Ao debugar, vamos simular que a aplicação esteja no modo trial
            // O teste condicional a seguir permite setarmos a variável manualmente 
#if DEBUG
            string message = "Pressione 'OK' para simular o modo de avaliação. Pressione 'Cancel' para roda a aplicação no modo completo.";
            if (MessageBox.Show(message, "Debug Trial",
                 MessageBoxButton.OKCancel) == MessageBoxResult.OK)
            {
                _isTrial = true;
            }
            else
            {
                _isTrial = false;
            }
#else
            _isTrial = _licenseInfo.IsTrial();
#endif
        }

Neste método que acabamos de criar, a propriedade _isTrial recebe o valor de acordo com a licença do usuário. Então agora chamamos este método dentro dos event handlers mencionados anteriormente, eles também ficam no arquivo App.xaml.cs:

 
private void Application_Launching(object sender, LaunchingEventArgs e)
        {
            CheckLicense();
        }

private void Application_Activated(object sender, ActivatedEventArgs e)
        {
            CheckLicense();
        }

Agora está tudo pronto para que restrições sejam feitas no seu app baseado na licença utilizada pelo seu usuário. Para isto basta verificar a propriedade isTrial em todo lugar onde existir uma restrição:

            if ((Application.Current as App).IsTrial)
            {
                ...
            }
            else
            {
                ...
            }

Mais informações sobre Trial apps

segunda-feira, 10 de junho de 2013

Internacionalizando Apps no Windows Phone

Internacionalizar quer dizer criar um aplicativo que permita o usuário mudar a linguagem, se ele quiser. Quando fui fazer meu primeiro App eu achei um artigo (link no final deste post) que me explicou muito bem como fazer.

A idéia é criar vários arquivos de recursos, um para cada linguagem, e nos componentes do seu app (labels, botões, etc), ao invés de ter o texto digitado, trará uma referência à chave que o windows phone buscará no arquivo de recursos.

Primeiramente, adicione um arquivo de recursos à sua aplicação. Eu sempre dou o nome de AppResources.resx. Este arquivo vai conter as chaves e valores dos textos para a linguagem padrão da sua aplicação.


Abra o arquivo e adicione as chaves e valores dos textos que deseja. Lembrando que o nome deve ser único, não pode repetir, o valor é o texto que vai aparecer na tela, e o comentário é só para ajudar, principalmente quando o arquivo vai ficando maior.

Duplique o arquivo AppResources para cada linguagem adicional que você queira colocar. O nome destes novos arquivos devem conter as informações corretas de linguagem/cultura conforme observado neste link. O formato do nome do arquivo deve ser <nome do arquivo de recursos>.<linguagem/cultura>.resx. Então, se quisermos colocar a linguagem alemã no nosso programa, criariamos um arquivo assim: AppResources.de-DE.resx. Se fosse para o inglês dos Estados Unidos: AppResources.en-US.resx, e assim por diante.

No novo arquivo, traduza todas as strings adicionadas anteriormente.




Agora você deve editar o arquivo do projeto para adicionar a informação de quais culturas seu app suporta. Mas para fazer isto, primeiro você precisa dar unload no projeto, para isto, clique com o botão direito no projeto e selecione "Unload Project".
Depois, clique novamente com o botão direito em cima do projeto e selecione a opção para editar o projeto.




Agora, procure pela tag <SupportedCultures> e adicione os nomes das culturas suportadas pelo seu aplicativo. Você pode adicionar mais de uma cultura separando por ";". A cultura padrão do seu aplicativo não precisa ser incluída nesta tag.



Salve e recarregue o projeto.
Tenha certeza que os arquivos de recursos estão com o "Access Modifier" setados para público.


Agora, crie uma nova classe que vai expor o recurso:

public class LocalizedStrings
{
    public LocalizedStrings()
    {
    }
 
    private static AppResources localizedResources = new AppResources();
 
    public AppResources AppResources
    {
        get { return localizedResources; }
    }
}

No código acima, AppResources é o nome da classe gerada automaticamente para o arquivo de recursos adicionado anteriormente.




Abra o arquivo App.xml e adicione o seguinte código:

    


Sempre que você quiser mostrar a string internacionalizada, basta apontar para o nome da chave do arquivo de recursos.
Exemplo:




 

Para testar, altere a liniguagem do seu smartphone, ou do emulador, para isto, acesse as configurações, região e idioma e mude o idioma. Após a mudança será pedido para reinicar o telefone.

Fonte: http://www.geekchamp.com/articles/localizing-a-windows-phone-app-step-by-step

segunda-feira, 3 de junho de 2013

Tratando erros no AdControl

Na última dica, mostrei como colocar o controle de propaganda, o AdControl, na sua aplicação, mas também comentei que o serviço da Microsoft ainda é ruim no Brasil.

Então, o que fazer quando não há propaganda do AdControl para exibir? Você pode não fazer nada, você pode simplesmente esconder o banner, ou então colocar uma proganda fixa de outro App seu, enfim, existem várias opções de o que fazer. Mas como? A resposta é tratamento de erro.

Coloque na tag xaml do AdControl, o seguinte trecho de código:
ErrorOccurred = "OnAdError_ErrorOccurred"

Com este código você está dizendo que quando der erro, o método "OnAdError_ErrorOccurred" vai ser chamado. Então nele você faz o tratamento que quiser:

private void OnAdError_ErrorOccurred(object sender, Microsoft.Advertising.AdErrorEventArgs e) 
        { 
            Debug.WriteLine("AdControl error: " + e.Error.Message); 
        } 

Fonte: http://msdn.microsoft.com/en-us/library/advertising-mobile-windows-phone-error-handling-ads%28v=msads.20%29.aspx