Livro Android Essencial com Kotlin

Posted by rlecheta on julho 26, 2017
Android, Livros / 6 Comments

Olá pessoal, este post visa explicar um pouco do conteúdo mostrado no livro Android Essencial com Kotlin.

O nome Essencial surgiu da ideia de ter um resumo simples e prático sobre os principais assuntos no desenvolvimento para Android. Este livro está mais atualizado e possui mais exemplos que a sua mesma versão em Java.

Obs: O livro utiliza libs como OkHttp e Retrofit para web services e Google Room para persistência de dados. Durante a leitura do livro são dadas diversas dicas de produtividade com a linguagem Kotlin, e também é explorado libs criadas pela JetBrains como Anko e Android Extensions.

O que veremos neste livro?

O livro começa com uma introdução ao Android e logo depois temos um capítulo básico sobre a linguagem Kotlin.

Os próximos capítulos são básicos sobre o desenvolvimento de aplicativos para Android, como a construção de telas/layouts, tratamento de eventos, activity, toolbar, fragments, etc.

No capítulo 9 iniciamos o desenvolvimento do aplicativo dos carros, que se estende até o final do livro. Este aplicativo consulta os carros no servidor criado no meu livro de Web Services RESTFul.

O aplicativo mostra diversos componentes do Material Design como o Navigation Drawer (menu lateral), Toolbar, Tabs, Listas , Cards, etc e mostra de forma simples boas práticas de desenvolvimento. O objetivo é aprender fazendo e tenho certeza de que no final da leitura você terá uma boa base sobre como continuar seus estudos e criar seus próprios apps.

Na home do aplicativo existem 3 tabs onde é possível visualizar os carros por tipo (clássicos, esportivos e luxo), e no botão FAB (+) é possível cadastrar um novo carro enviando os dados para o servidor, inclusive o app mostra como tirar uma foto e fazer upload.

Na tela de detalhes do carro, podemos assistir um vídeo do carro, visualizar um mapa de onde ele é fabricado, e até podemos Favoritar o carro. O carro favoritado é salvo no banco de dados do aplicativo e pode ser visualizado na Tab Favoritos.

Obs: O livro utiliza libs como OkHttp e Retrofit para web services e Google Room para persistência de dados. Durante o livro diversas dicas de produtovidade com a linguagem Kotlin são fornecidas, e também é explorado libs criadas pela JetBrains como Anko e Android Extensions.

Este vídeo mostra o aplicativo dos carros que será construído durante o livro. Durante o vídeo veja que eu cadastro e excluo um carro, e também favorito alguns.

Fora o aplicativo dos carros, o livro possui capítulos simples sobre diversos temas importantes do desenvolvimento para Android, como: Notificações, Alarmes, Receivers, Services, mensagens de Push com Firebase, etc.

Espero que gostem do livro, abs.

Android Studio e a ferramenta de compilação (build-tools) 26.0.0

Posted by rlecheta on julho 18, 2017
Android, Tutorial / 2 Comments

Olá pessoal, segue um comunicado importante sobre o método findViewById(id).

A partir da  ferramenta de compilação (build-tools) 26.0.0 e da biblioteca appcompat-v7 versão “26.0.0 Beta 1”, o método findViewById(id) mudou de assinatura:

Antigamente o método findViewById(id) retornava uma View e era preciso fazer o cast, como neste exemplo:

Java:

ImageView img = (ImageView) findViewById(R.id.img);

Kotlin:

val img = findViewById (R.id.img) as ImageView

Ao utilizar a nova versão da lib appcompat-v7 (26.0.0) o método findViewById(id) retorna um tipo genérico (subclasse de View). Por isso mudou a forma de fazer a chamada:

Java (sem cast):

ImageView img = findViewById(R.id.img);

Kotlin (sem cast):

val img = findViewById<ImageView>(R.id.img)

Se você conhece o que são tipos genéricos é simples entender. Veja que foi adicionado o tipo T na assinatura do método findViewById(id). Para você conferir, segue assinatura do método:

public <T extends View> T findViewById(@IdRes int id) {

return getDelegate().findViewById(id);

}

O novo livro Android Essencial com Kotlin que em breve será lançado pela editora Novatec já contém estas atualizações.

Documentação Oficial (release notes):

https://developer.android.com/topic/libraries/support-library/revisions.html

Android – compilando projetos com o plugin do Gradle 3.0.0

Posted by rlecheta on julho 18, 2017
Android, Tutorial / Comentários desativados em Android – compilando projetos com o plugin do Gradle 3.0.0

Olá pessoal,

A última versão do plugin do Gradle para o Android Studio e a ferramenta de compilação (build-tools) tiveram algumas mudanças que acho importante comentar.

Se você baixar o Android Studio 3.0 atualmente, é provável que ele já esteja atualizado, mas de qualquer forma, segue dicas do que é necessário para atualizar os plugins de compilação:

Dica 1) Sempre mantenha o Android Studio atualizado, e comece a utilizar o Android Studio 3.0, mesmo que ainda esteja em beta.

Dica 2) Quando você fica na dúvida de qual versão utilizar de alguma biblioteca (ex: appcompat-v7), ou o que colocar nos arquivos build.gradle e gradle-wrapper.properties, crie um novo projeto no Android Studio, pois ele vai criar os arquivos corretamente, então é só copiar 🙂

Agora vamos aos detalhes…

1) Atualizar plugin do Android para Gradle

No arquivo build.gradle (raiz do projeto), podemos usar a nova versão do plugin (3.0.0 ou superior). Note que quando estiver lendo este tutorial é provável que exista uma nova versão, então sempre atualize. Atualmente é fácil atualizar pois o Android Studio vai lhe avisar que existe uma nova versão.

2) Atualizar versão do Gradle

Para que o plugin funcione é preciso atualizar a versão do Gradle que o projeto utiliza, isso é feito no arquivo gradle-wrapper.properties.

No meu arquivo atualmente estou usando a seguinte URL para a versão do Gradle:

distributionUrl=https\://services.gradle.org/distributions/
gradle-4.1-milestone-1-all.zip

 

 

 

3) Utilizar a diretiva “implementation” ao invés de “compile” no arquivo app/build.gradle

Antigamente, uma dependência no gradle era adicionada da seguinte forma:

compile 'com.android.support:appcompat-v7:versao-xxx'

Atualmente, o Google recomenda utilizar a diretiva implementation ao invés de compile, mas por questões de compatibilidade ambas vão continuar funcionando.

implementation 'com.android.support:appcompat-v7:versao-xxx'

Para maiores detalhes, segue documentação oficial do Google:

https://developer.android.com/studio/build/gradle-plugin-3-0-0-migration.html

Dica Android: Google Play Services

Posted by rlecheta on maio 21, 2017
Android, Tutorial / Comentários desativados em Dica Android: Google Play Services

Pessoal, esse post é rápido mas vale a pena lembrar:

Nunca importem o Google Play Services inteiro, pois ele é grande e vai pesar no seu aplicativo/apk.

compile 'com.google.android.gms:play-services:10.2.6'

O recomendado é adicionar a dependência apenas dos módulos que precisarmos. Por exemplo, se formos utilizar Mapas e GPS basta estas 2 linhas:

compile 'com.google.android.gms:play-services-maps:10.2.6'
compile 'com.google.android.gms:play-services-location:10.2.6'

Isso vai deixar seu apk muito mais leve! Para maiores detalhes sobre o Google Play Services, visite o site oficial:

https://developers.google.com/android/guides/setup

Device File Explorer no Android Studio 3.0

Posted by rlecheta on maio 21, 2017
Android, Tutorial / Comentários desativados em Device File Explorer no Android Studio 3.0

O Android Studio 3.0 possui uma nova janela muito útil chamada de Device File Explorer. Ela permite acessar os arquivos do emulador de forma rápida. Ela fica no canto direito inferior como mostra  a figura abaixo.

Você descobrirá que é simples enviar arquivos para o sdcard do Emulador ou salvar arquivos no seu computador…

No capítulo de Multimidia do livro Google Android, tem um exemplo que mostra como reproduzir um vídeo que está no SDCard. Pois bem, para testar o exemplo é só copiar o arquivo para a pasta /sdcard/Movies/last_mohicans.3gp, como mostra a figura acima.

Para testar o exemplo, lembre-se de atualizar o código para apontar para o local onde você salvou o arquivo, exemplo:

Pronto, é só isso! Como vimos no Android Studio 3.0 ficou bem mais simples copiar arquivos para o sdcard.

A figura abaixo mostra o vídeo no emulador:

 

Desenvolvendo para iPhone e iPad – 5ª edição

Posted by rlecheta on maio 04, 2017
iOS, Livros / Comentários desativados em Desenvolvendo para iPhone e iPad – 5ª edição

Finalmente foi lançado a 5ª edição, atualizado para o Swift 3.

https://novatec.com.br/livros/desenvolvendo-para-iphone-ipad-5ed/

 

Compartilhando arquivos no Android 7 (Nougat) e a exception FileUriExposedException

Posted by rlecheta on novembro 03, 2016
Android, Tutorial / 3 Comments

É raro termos algum erro de compatibilidade ao atualizar as versões do Android no aplicativo, mas no caso do Android 7 (Nougat) temos a exception FileUriExposedException.

Se você ainda não se deparou com ela, logo irá.

Digamos que você possui um aplicativo que tire fotos. Para exemplificar, temos este trecho de código que cria um arquivo e chama a Intent da câmera:

screen-shot-2016-11-02-at-19-26-24

Tudo normal com o código certo? Mas se você atualizar o seu projeto para compilar com a API 24/25 (Android 7) verá uma exception igual esta:

screen-shot-2016-11-02-at-19-14-35

Segundo a documentação do Android, esta exception é lançada ao expor um arquivo por uma Uri para outra aplicação. Neste caso, o erro é porque estamos expondo o arquivo que criamos para a aplicação nativa da câmera, pois a câmera precisa salvar a foto neste arquivo.

https://developer.android.com/reference/android/os/FileUriExposedException.html

Sem mais demoras, vamos logo a solução:

Edite o arquivo AndroidManifest.xml e adicione a tag <provider> dentro da tag <application> .

Exemplo: AndroidManifest.xml

screen-shot-2016-11-02-at-19-19-45

Veja que dentro de <meta-data> é referenciado um arquivo XML @xml/provider_paths com a configuração de compartilhamento para os arquivos da aplicação, neste caso vamos colocar o “.”, para compartilhar tudo desde a raiz.

Exemplo: provider_paths.xml

screen-shot-2016-11-02-at-19-20-46

Feito estas configurações no projeto, basta trocar a linha que cria a Uri do arquivo:

Uri uri = Uri.fromFile(file);

Por esta:

Uri uri = FileProvider.getUriForFile(context, context.getApplicationContext().getPackageName() + “.provider”, file);

Então, o código que chama a Intent da câmera que mostrei anteriormente fica assim:

screen-shot-2016-11-02-at-19-33-55

Exemplo: CameraUtil.java

Pronto! Agora podemos tirar fotos no Android 7 (Nougat). Espero que esta dica ajude alguém 🙂

Para maiores informações, veja a documentação oficial.

device-2016-11-02-193556

XCode 8 e Swift 3

Posted by rlecheta on outubro 23, 2016
iOS, Livros / 19 Comments

Olá pessoal

A 4a ed do livro de iOS foi feita utilizando o XCode 7 com Swift 2.
ios
Recentemente foi lançado o Xcode 8 com suporte ao Swift 3.
Para auxiliar os leitores que compraram a 4ed, este post visa explicar algumas das mudanças e também para dizer que atualizei os fontes no github com os exemplos com Swift 3.
Espero que o fonte ajude quem comprar a 4ed e precisar estudar Swift 3.
Para migrar os projetos da 4ed para Swift 3 foi simples. Eu abri cada projeto no Xcode 8 e o próprio Xcode mostrou o wizard para migrar para o Swift 3. Na maioria das vezes deu certo, e quando não funcionou fiz pequenos ajustes.
A figura abaixo mostra o wizard do XCode 8 durante a migração do Swift 2 para o Swift 3. Ele mostra um preview de cada arquivo, portanto eu recomendo que você leia cuidadosamente cada mudança pois é uma ótima maneira de aprender a nova sintaxe.
9-2
Mas o que mudou?
Algumas coisas foram a sintaxe como mostra esse código abaixo.

Swift 2: UIApplication.sharedApplication().openURL(NSURL(string:url)!)

Swift 3: UIApplication.shared.openURL(URL(string:url)!)

Note que a classe NSURL mudou para apenas URL. Isso acontece também com várias outras classes que tinham o prefixo NS.

A seguir temos outro exemplo de código que está diferente:

Swift 2:

self.window = UIWindow(frame: UIScreen.main.bounds)

self.window!.backgroundColor = UIColor.white

Swift 3:

self.window = UIWindow(frame: UIScreen.mainScreen().bounds)

self.window!.backgroundColor = UIColor.whiteColor()

Uma mudança importante foi na forma de declarar os métodos, pois foi adicionado um prefixo “_” opcional no primeiro parâmetro. Digamos que temos uma função soma(n1,n2) com a seguinte declaração.

func soma(n1:Int, n2:Int) -> Int {

   return n1 + n2

}

Par chamar a função você faria algo assim:

let n = soma(n1: 1, n2: 3)

print(n)

Note que é obrigatório informar o primeiro argumento “n1”. Caso você opte por simplificar a chamada e não informar o argumento, basta colocar o “_” antes de declarar o primeiro argumento, assim:

func soma(_ n1:Int, n2:Int) -> Int {

   return n1 + n2

}

Neste caso a chamada ficaria (não precisa informar o n1):

let n = soma(1, n2: 3)

print(n)

Bom, teve várias outras mudanças.. mas o que recomendo é que vocês migrem os projetos de Swift 2 para Swift 3 utilizando este wizard do XCode, pois é um excelente exercício e aprendizado.

Para quem tem a 4ed, recomendo antes estudar no XCode 7, pois assim os exemplos com Swift 2 vão todos funcionar. É possível encontrar versões antigas do XCode procurando no Google por “xcode older versions”. Depois que estudar os códigos do livro com Swift 2, recomendo instalar o XCode 8 e utilizar o wizard de migração para o Swift 3.. Será um bom aprendizado sobre a sintaxe.

É isso pessoal, espero que este rápido post tenha ajudado :-).

Temas no Android: O que fazer se a Action Bar estiver nula.

Posted by rlecheta on outubro 07, 2016
Android, Livro Android, Tutorial / 2 Comments

Olá pessoal, recentemente um leitor da 4a edição do livro de Android veio tirar uma dúvida sobre um erro que acontecia com um exemplo do capítulo 4.

No caso a activity estava herdando de android.app.Activity.


public class AlgumaActivity extends Activity {

... código aqui

// dava erro nessa linha

getActionBar().setDisplayHomeAsUpEnabled(true);

}

O erro reportado foi que dava NullPointer ao acessar a action bar.

OK, mas porque isso acontece?

Na maioria das vezes, se a action bar está nula com certeza é a configuração do tema.

Olhando o styles.xml do meu colega, o tema do projeto estava configurado assim:

a

Vejam que está usando o tema AppCompat, que traz a compatibilidade para várias versões do Android. Este tema substitui os temas Holo, Material, etc e atualmente é recomendado pelo Google. Isso é o esperado mesmo e está correto, pois o Android Studio atualmente gera o projeto desta forma.

O problema é que na época que escrevi a 4a edição do livro, os exemplos eram gerados de outra forma pelo Android Studio, inclusive no github da 4ed está assim:

https://github.com/livroandroid/4ed/blob/master/capitulos/cap04-activity/HelloActivity/app/src/main/res/values/styles.xml

b

Veja que o tema que usei na época da 4ed foi o Holo, que é um específico para Android 3 (API Level 11). Enfim, mas isso está explicado no livro e não quero demorar aqui…

O livro 5a ed que está mais atualizado já traz os exemplos todos com o tema de compatibilidade, portanto este problema acontece apenas nos exemplos da 4 ed, pois o Android Studio mudou a forma de gerar o código dos projetos.

Bom, existem 2 formas de resolver este problema:

1) Caso você queira deixar o código das classes de Activity iguais estavam nos exemplos da 4ed, é preciso alterar o tema do projeto para Holo ou Material, conforme o github da 4ed. Isso é feito alterando o arquivo styles.xml conforme o exemplo que mostrei acima do github.

Basicamente, se o seu tema herda de Holo ou Material, você está usando um tema nativo. Então vc deve sempre usar a android.app.Activity como a activity mãe, e neste caso você pode utilizar o método getActionBar() que retorna a action bar nativa android.app.ActionBar.

Era dessa forma que era feito nos primeiros exemplos da 4 ed. Somente no capítulo de Action Bar que começo a explicar o tema AppCompat de compatibilidade.

2) A segunda forma de resolver, e talvez a recomendada é atualizar o código de todas as Activities para herdar de android.support.v7.app.AppCompatActivity, pois é a activity do tema de compatibilidade. Atualmente o Android Studio gera o projeto com o tema AppCompat, como vimos no styles.xml do meu colega logo no início deste post. Isto indica que o projeto usa o tema de compatibilidade.

Esta configuração de tema atualmente é a indicada. Porém como o fonte da 4ed está antigo, faça as seguintes alterações no código:

  • Altere todas as activities do projeto para herdar de AppCompatActivity.
  • Altere a chamada do método getActionBar() por getSupportActionBar(), pois este último vai retornar a action bar de compatibilidade, que é a classe android.support.v7.app.ActionBar.

Como o Android Studio atualmente gera o projeto com o tema de compatibilidade, na 5ed do livro todos os exemplos já estão assim.

É isso pessoal, este breve post foi só para explicar uma pequena diferença entre a 4ed e a 5ed. Como vimos o Android Studio mudou a forma de gerar os códigos do projeto e isso afetou um pouco, e essas coisas de tema e compatibilidade costumam ser complicadas para quem está estudando Android pela primeira vez :-).

Independente de como estão os códigos-fontes da 4ed e 5ed, estes conceitos é bom conhecer.

Qualquer dúvida perguntem, abs.

Tags:

Enviando mensagens de Push com o Firebase Cloud Messaging (FCM) – parte 2

Posted by rlecheta on julho 31, 2016
Android, Tutorial / 16 Comments

Olá pessoal, na Parte 1 deste tutorial aprendemos a criar um app Android para receber mensagens de Push utilizando o Firebase.

Se você ainda não leu, segue link da 1ª parte.

http://ricardolecheta.com.br/?p=862

Na 2ª parte do Tutorial vamos ver como fazer:

  1. Enviar mensagens de Push pelo web service do Firebase (sem utilizar o console);
  2. Exemplo de como ler mensagens do tipo chave=valor no Android.

Vimos que podemos usar o console do Firebase para enviar as mensagens de Push, mas muita gente tem me perguntado como que faz para enviar a mensagem manualmente no código.

Para enviar uma mensagem de Push, basta postar no web service do Firebase um JSON contendo as informações necessárias.

A figura abaixo mostra o endereço URL do endpoint do web service e os parâmetros que precisam ser enviados:

a

Veja que o endpoint do web service do Firebase é:

https://fcm.googleapis.com/fcm/send

Obs: se você não está acostumado com o termo, “endpoint” refere-se a URL de um web service.

Algo importante da requisição, é que ela deve ser feita via POST, e deve-se enviar no cabeçalho HTTP os parâmetros Content-TypeAuthorization.

O valor parâmetro Authorization é igual a “key=SUA_SERVER_KEY”.

A SERVER_KEY do FCM pode ser encontrada na página do Console, dentro das configurações do seu projeto.

Dentro da página do seu projeto, clique em Configurações conforme indicado na figura e depois no link Project Settings. Então entre na tab Cloud Messaging, onde você verá sua SERVER KEY.

b

No meu caso, o valor do parâmetro Authorization ficou assim:

key=AIzaSyBwaM5NAiGSGoft1gIESiuRaVcQTlxHe8E

Se você é novo em programação, procure sobre como fazer requisições HTTP na linguagem que você está programando, seja PHP, Java, Python, etc.. todas tem uma forma de fazer esta requisição.

Eu gosto de testar web services utilizando o plugin Postman do Chrome, pois é simples e prático. Para brincar vamos fazer um teste rápido 🙂

No Postman, siga os seguintes passos:

1) Configure o modo de envio para POST e digite a URL do endpoint do Firebase: https://fcm.googleapis.com/fcm/send

c

2) Clique em Headers e adicione os cabeçalhos Content-TypeAuthorization

Content-Type = application/json

Authorization = key=AIzaSyBwaM5NAiGSGoft1gIESiuRaVcQTlxHe8E

Lembre-se de colocar a sua SERVER_KEY.

d

3) Clique em Body e selecione a opção raw

Digite o seguinte JSON para enviar uma notificação:

{
 "to" : "Digite o Token (registration id) do dispositivo aqui",
 "notification" : {
 "title" : "Mensagem para o Firebase",
 "body" : "Teste firebase"
 }, 
 "data" : {
 "nome" : "Ricardo",
 "sobrenome" : "Lecheta"
 }
}

A figura a seguir mostra como fiz no Postman. Depois de preencher tudo corretamente, é só clicar no botão Send e pronto! Você verá lá em baixo o JSON de resposta do servidor do Google.

g

Veja que no JSON que enviei, mandei tanto o campo “notification” que possui os dados para mostrar o alerta de notificação no dispositivo (title e body), assim como foi enviado a estrutura “data” com os parâmetros com chave e valor.

Neste caso enviei os seguintes parâmetros:

nome=Ricardo

sobrenome=Lecheta

No código, basta ler estes parâmetros conforme mostra a figura abaixo.

Tinham me perguntado como fazer para ler os dados enviados, então é exatamente desta forma que deve-se fazer 🙂

f

Vale lembrar que o Firebase vai mostrar a notificação somente se o aplicativo estiver em background. Caso ele esteja aberto, você deverá ler a mensagem e mostrar a notificação/alerta manualmente.

É isso pessoal, espero que este tutorial tenha ajudado e qualquer dúvida é só perguntar 🙂 , abs.