Flickr SDK para Windows 8

Acabo de publicar no GitHub um SDK que comecei a fazer para integração do Flickr com aplicações Windows Store no Windows 8.1. Até o momento implementei a parte de autenticação e upload de fotos. Os próximos passos são:

  • Persistir o AccessToken
  • Propriedades de compartilhamento da foto

ClassDiagram

Sugestões são sempre bem vindas!

Anúncios

Be many people

“… and you, Marcus, you have given me many things; now I shall give you this good advice. Be many people. Give up the game of being always Marcus Cocoza. You have worried too much about Marcus Cocoza, so that you have been really his slave and prisoner. You have not done anything without first considering how it would affect Marcus Cocoza’s happiness and prestige. You were always much afraid that Marcus might do a stupid thing, or be bored. What would it really have mattered? All over the world people are doing stupid things … I should like you to be easy, your little heart to be light again. You must from now, be more than one, many people, as many as you can think of …”

– Karen Blixen, The Dreamers from Seven Gothic Tales (1934)

Que tal desenvolver para Windows 8?

 Acabei de encontrar meu primeiro post falando sobre o desenvolvimento para Windows 8. Ele data de 28 de janeiro de 2012, mais de um ano atrás. Penso que pelo tempo que faz não tivemos um aumento tão significativo na quantidade de desenvolvedores, qual será o motivo? Ainda temos poucos usuários de Windows 8 no Brasil, acredito que grande parte se deve aos valores absurdos dos impostos que pagamos para adquirir um computador com touch screen. Afinal de contas, a grande magia do Windows 8 está nos computadores híbridos.

Mas se você não encontrou uma razão para começar a desenvolver para Windows Store vendo da perspectiva de um usuário, que tal começar a olhar para as razões como desenvolvedor e como oportunidade profissional:

  • A Store permite que você distribua facilmente sua aplicação e você ainda pode bastante dinheiro.
  • O mercado está com uma demanda alta de profissionais com experiência em Windows Store.
  • Se você é um desenvolvedor .NET, pode aproveitar tudo que você já aprendeu até hoje.
  • Se você é um desenvolvedor JavaScript para Web, também pode aproveitar tudo que aprendeu.
  • Se você é um desenvolvedor C++ / DirectX está com dois pés a frente.

Para mim, essas são as principais motivações, quais as suas?


Windows Logo


COMO DESENVOLVER APLICATIVOS PARA WINDOWS STORE

Grande Oportunidade

Uma das maiores satisfações que tenho em minha vida atualmente é o lugar onde trabalho. Com toda honestidade do mundo, é o emprego que pedi a Deus. Desde o dia que conheci e comecei a trabalhar no CESAR só tenho visto crescimento diante de mim. Ganhamos o prêmio FINEP em 2010, recebemos prêmios como empresa mais inovadora, fechamos grandes contratos, entre outras coisas. Por exemplo, tive a oportunidade de viajar duas vezes para Coreia, e vi colegas meus indo fechar contratos na Europa e Estados Unidos. Assisti a expansão do CESAR para São Paulo, Sorocaba e Curitiba. Tive oportunidade de trabalhar em projetos para grandes empresas como HP e Samsung.

Todas essas oportunidades desfrutando do prazer que é morar em João Pessoa. Confesso que o perfil para trabalhar em Home Office não é para qualquer um, exige disciplina e dedicação. Ao contrário do que muitos pensam, esse modelo trabalho exige muito mais do que estar presente fisicamente no local de trabalho. É um novo estilo de vida. Nem melhor nem pior, apenas diferente. Mas para mim, claro, é muito melhor! É com essa convicção que posso afirmar a todos que me perguntam: tenho o emprego que pedi a Deus.

Se você mora em João Pessoa, gosta de resolver problemas, não sai da frente do computador até que tudo esteja funcionando como você gostaria e está sempre surpreendendo quem está próximo a você, tenho um convite a fazer! Que tal trabalhar em Home Office para uma das maiores empresas de inovação do país? Espero seu contato em vmrocha em gmail ponto com.

Bing Maps para Windows Store

Microsoft lançou um guia para iniciar o desenvolvimento de aplicações na Windows Store que utiliza o recurso de Bing Maps. O link leva a um PDF que serve, ao mesmo tempo, como material promocional e como hub para vídeos, labs, trainning kits, forums, entre outras coisas.

http://go.microsoft.com/fwlink/p/?LinkId=307128

Bing Maps for Windows Store

Usar OpenCV no WinRT

Compilei o OpenCV para ser “linkado” estaticamente a um Runtime Component do WinRT. Dessa forma, é possível utilizar o OpenCV num projeto do Windows Store sem a necessidade de distribuição das DLLs do OpenCV. Isso permite que a aplicação seja validada pelo WACK (Windows Application Certification Kit), o que é necessário para distribuição na loja.

OpenCV245_WinRT_x86_StaticLibs.7z (18.7 MB)
http://tiny.cc/opencv_winrt

Coloquei um projeto de exemplo no GitHub.

Salvar posição do GPS na imagem

Estava estudando as formas disponíveis de ler as propriedades de uma imagem numa aplicação Windows Store e me deparei com as propriedades de Longitude e Latitude. Essas informações ficam salvas no formato de metadado dentro de uma foto quando a mesma é salva num dispositivo que permite a localização via GPS. Então tive a curiosidade de verificar com o aplicativo de câmera do Windows 8 poderia fazer isso, uma vez que ele não salva essa informação na imagem.

Lendo as propriedades da imagem

O primeiro passo para alterar é na verdade ler as propriedades disponíveis. Isso porque precisamos entender que essas propriedades do GPS não podem ser alteradas diretamente. As propriedades da imagem são listadas a partir do método GetImagePropertiesAsync que está na propriedade Properties da classe StorageFile. Da seguinte forma:

StorageFile file = await KnownFolders.PicturesLibrary.GetFileAsync(filename);
ImageProperties properties = await file.Properties.GetImagePropertiesAsync();

Note que o método GetImagePropertiesAsync retorna uma instancia de ImageProperties. As propriedades dessa classe são listadas a seguir:

Property Access Description
CameraManufacturer Read/Write Gets or sets the manufacturer of the camera that took the photo.
CameraModel Read/Write Gets or sets the model of the camera that took the photo.
DateTaken Read/Write Gets or sets the date when the image was taken.
Height Read Gets the height of the image.
Keywords Read Gets the collection of keywords associated with the image.
Latitude Read Gets the latitude coordinate where the photo was taken.
Longitude Read Gets the longitude coordinate where the photo was taken.
Orientation Read Gets the Exchangeable Image File (EXIF) orientation flag.
PeopleNames Read Gets the names of people who are tagged in the photo.
Rating Read/Write Gets the rating associated with the image.
Title Read/Write Gets or sets the title of the image.
Width Read Gets the width of the image.

Alterando a Longitude e a Latitude

Ambas as propriedades de Longitude e Latitude possuem permissão apenas para leitura. Isso não quer dizer que não temos permissão para alterar essas propriedades, apenas que elas não podem ser alteradas diretamente pois tratam-se de campos calculados. Todas essas propriedades possuem um metadado equivalente da tabela de propriedades de arquivos do Windows listadas aqui nessa página. No caso de Longitude e Latitude, suas dependências estão listadas a seguir:

Propriedade Dependência
System.GPS.Latitude System.GPS.LatitudeNumerator
System.GPS.LatitudeDenominator
System.GPS.LatitudeRef
System.GPS.Longitude System.GPS.LongitudeNumerator
System.GPS.LongitudeDenominator
System.GPS.LongitudeRef

Essas propriedades do sistema podem ser alteradas a partir do método SavePropertiesAsync que se encontra na propriedade Properties do StorageFile. Segue um exemplo de código:

List<KeyValuePair<string, object>> p = new List<KeyValuePair<string, object>>();
p.Add(new KeyValuePair<string, object>("System.GPS.LongitudeNumerator", lon));
p.Add(new KeyValuePair<string, object>("System.GPS.LongitudeDenominator", d));
p.Add(new KeyValuePair<string, object>("System.GPS.LongitudeRef", direction));

p.Add(new KeyValuePair<string, object>("System.GPS.LatitudeNumerator", lat));
p.Add(new KeyValuePair<string, object>("System.GPS.LatitudeDenominator", d));
p.Add(new KeyValuePair<string, object>("System.GPS.LatitudeRef", direction));

await file.Properties.SavePropertiesAsync(p);

Obtendo os valores do sensor

Obter as coordenadas do GPS a partir da API do Windows Store é bem simples:

Geolocator locator = new Geolocator();
Geoposition position = await locator.GetGeopositionAsync();
double? altitude = position.Coordinate.Altitude;
double? longitude = position.Coordinate.Longitude;

Infelizmente como você pode perceber, os valores de Longitude e Latitude estão no formato double e não destrinchados entre Numerador e Denominador, que é o formato esperado pelas propriedades do Windows. Depois de alguma pesquisa, montei a seguinte classe que faz a conversão entre o formato double e o formato DMS (Degrees, Minutes, Seconds).

public enum Coordenate {
    Latitude,
    Longitude
}

public enum Direction {
    N, S, E, W
}

public class DMS {
    public DMS(double value, Coordenate coordenate) {
        this.SetValue(value, coordenate);
    }

    public double Value { get; private set; }
    public int Seconds { get; private set; }
    public int Degrees { get; private set; }
    public int Minutes { get; private set; }
    public Direction Direction { get; private set; }

    private void SetValue(double value, Coordenate coordenate) {
        this.Value = value;
        if (coordenate == Coordenate.Latitude) {
            if (value >= 0)
                this.Direction = Direction.N;
            else {
                this.Direction = Direction.S;
                value = Math.Abs(value);
            }
        }
        else {
            if (value >= 0)
                this.Direction = Direction.E;
            else {
                this.Direction = Direction.W;
                value = Math.Abs(value);
            }
        }

        this.Degrees = (int)Math.Floor(value);
        this.Minutes = (int)Math.Floor((value % 1) * 60);
        this.Seconds = (int)Math.Round((((value % 1) * 60) % 1) * 60);
    }
}

Encapsulei o código para dentro de um helper para ser utilizando sempre que for necessário salvar as coordenadas do GPS num arquivo:

public static class LocationHelper {
    public static async Task<Geoposition> GetCurrentPosition() {
        Geolocator locator = new Geolocator();
        return await locator.GetGeopositionAsync();
    }

    public static async Task SavePosition(StorageFile file, Geoposition position) {
        DMS latDms = new DMS(position.Coordinate.Latitude, Coordenate.Latitude);
        DMS lonDms = new DMS(position.Coordinate.Longitude, Coordenate.Longitude);

        int[] lat = new int[] { latDms.Degrees, latDms.Minutes, latDms.Seconds };
        int[] lon = new int[] { lonDms.Degrees, lonDms.Minutes, lonDms.Seconds };
        int[] den = new int[3] { 1, 1, 1 };

        List<KeyValuePair<string, object>> ep = new List<KeyValuePair<string, object>>();
        ep.Add(new KeyValuePair<string, object>("System.GPS.LongitudeNumerator", lon));
        ep.Add(new KeyValuePair<string, object>("System.GPS.LongitudeDenominator", den));
        ep.Add(new KeyValuePair<string, object>("System.GPS.LongitudeRef", latDms.Direction.ToString()));

        ep.Add(new KeyValuePair<string, object>("System.GPS.LatitudeNumerator", lat));
        ep.Add(new KeyValuePair<string, object>("System.GPS.LatitudeDenominator", den));
        ep.Add(new KeyValuePair<string, object>("System.GPS.LatitudeRef", lonDms.Direction.ToString()));

        await file.Properties.SavePropertiesAsync(ep);
    }
}

Espero que seja útil para vocês. Estou usando esse código num aplicativo de câmera que estou fazendo.

Código completo no Gist:

%d blogueiros gostam disto: