Share
Embed
Android Training Program - Portugal, Aula 9
Aula #9 ML Kit: Machine Learning para iniciantes 🧩
O ML Kit traz a experiência de Machine learning da Google aos programadores de dispositivos móveis num pacote poderoso e fácil de usar. Torna as tuas aplicações iOS e Android mais atrativas, personalizados e úteis com soluções otimizadas para execução no dispositivo.
ATP Portugal
December 09, 2020
Transcript
151 slides
-
• Sejam excelentes uns para os outros • Fale mais
alto se vir ou ouvir alguma coisa • O assédio não é tolerado • Pratique "Sim e" um ao outro Código de conduta Mais informações: http://bit.ly/2IhF0l3 -
Andres-Leonardo Martinez-Ortiz Google Carlos Mota Formador Renato Almeida Formador @davilagrau
@cafonsomota @tallnato Equipa Daniela Ferreira Gestora de comunidades -
• 12 aulas • 1h30 cada aula • ~1 aula
por semana • 14 Outubro a 16 Dezembro • YouTube live • Suporte assíncrono contínuo via Discord/email • Todo o código disponível no GitHub Photo by Arif Riyanto on Unspla O programa -
#0 14 de Outubro Pronto para começar #1 21 de
Outubro Bem-vindos ao Android #2 28 de Outubro Fundações I #3 04 de Novembro Fundações II #4 11 de Novembro Fundações III #5 18 de Novembro Listas, listas e mais listas #6 25 de Novembro Jetpack, Jetpack, Jetpack! #7 - #8 02 - 03 de Dezembro Firebase #9 - #10 09 - 10 de Dezembro MLKit & TensorFlow #11 16 de Dezembro Resumo Semana Semana Calendário ✅ ✅ ✅ ✅ Direto ✅ ✅ ✅ ✅ -
Sumário Photo by Mika Baumeister on Unsplash • Resumo da
aula anterior • Introdução ao Machine Learning • ML Kit • Kotlin para principiantes • É Natal -
• O Cloud storage é um serviço de armazenamento poderoso,
simples e barato desenvolvido para a escala da Google • Os SDK’s disponíveis adicionam a segurança da Google para as transferências dos ficheiros • É possível armazenar imagens, áudios, vídeos ou outros tipos de conteúdos Cloud Storage -
• Relatórios de falhas completos e em tempo real •
Permite encontrar rapidamente a causa das falhas • As falhas são priorizadas de forma a permitir identificar o que corrigir primeiro • Alertas em tempo real Crashlytics -
• Mede automaticamente o tempo de arranque da aplicação, pedidos
HTTP à rede, entre outros • Permite observar situações em que a aplicação possa ser mais rápida • Permite customizar os parâmetros a monitorizar da aplicação Performance -
• Enviar notificações ou mensagens com dados • Permite direcionar
as notificações para diferentes utilizadores de forma versátil • Permite enviar mensagens através dos clientes Push Notifications -
• Camada sobre Google Analytics • Solução de analytics grátis
e ilimitada • Permite reportar até 500 eventos distintos • Os relatórios ajudam a perceber o como os utilizadores se comportam, o que permite tomar decisões informadas sobre marketing e otimizações de performance Analytics -
Luiz Gustavo @gusthema TensorFlow Developer Advocate Google O que é
Machine Learning? -
• Pode ser visto como uma forma de ajudar o
software a realizar uma tarefa sem programar explicitamente ou criar regras • Na programação tradicional, um programador especifica as regras que o computador deve usar • Focado mais em análise de dados do que em programação • São disponibilizados um conjunto de exemplos e o computador aprende a partir destes dados • Podemos ver o machine learning como “programar com dados” Machine learning -
Photo by Eugene Chystiakovl • IBM Deep Blue vence o
campeão do mundo de Xadrez Garry Kasparov • Uma base de dados com mais de 700 mil partidas de Xadrez • Que combina com o jogo atual de forma a escolher a melhor jogada • O mesmo jogo tem sempre o mesmo resultado • Não existe o conceito de machine learning presente ◦ Mas sim o de uma inteligência artificial no seu início -
• Extrapolar dados • Evitar fraudes • Identificar oportunidades de
investimento • Auxiliar os investidores a decidir quando negociar • Identificar clientes com perfis de alto risco Banca e finanças Onde é aplicado? Photo by Micheile Henderson https://www.sas.com/en_us/insights/analytics/machine-learning.html -
• Analisam várias fontes de dados, de forma a aumentar
a eficiência e economizar dinheiro • Ajuda na detecção de fraudes e minimizar o roubo de identidade Governos Onde é aplicado? Photo by Marco Oriolesi https://www.sas.com/en_us/insights/analytics/machine-learning.html -
• Através da análise dos dados de wearables e outros
tipos de sensores, permite avaliar o paciente em tempo real • Identificar tendências ou sinais de alerta de forma a melhorar os diagnósticos e tratamentos • Serve de complemento para os diagnósticos médicos Saúde Onde é aplicado? Photo by Online Marketing -
• Recomendação de produtos que o cliente poderá gostar, com
base em compras anteriores • Analisa a interação do utilizador e melhora a experiência de compra ◦ Campanhas publicitárias dirigidas • Otimização de preços • Gestão de mercadorias Retalho Onde é aplicado? Photo by Eduardo Soares https://www.sas.com/en_us/insights/analytics/machine-learning.html -
• Identificar padrões e tendências • Tornar os percursos mais
eficientes ◦ Caminhos alternativos ao trânsito • Prever potenciais problemas Transporte Onde é aplicado? Photo by frank mckenna https://www.sas.com/en_us/insights/analytics/machine-learning.html -
• Reduzir a pegada ecológica • Prever alterações climatéricas •
Agricultura mais sustentável, identificando: ◦ Áreas que precisem de ser regadas ◦ Qual vai ser o escoamento da produção ◦ Possíveis pestes que possam surgir • <a tua ideia> O mundo à nossa volta Onde é aplicado? Photo by Gustavo Quepón -
• Sistemas de recomendação como os da Netflix, YouTube ou
Spotify • Motores de busca como Google • Toda a informação que te faz fazer scroll continuamente nas redes sociais • Assistentes de voz como o Assistente da Google, Siri ou Alexa Exemplos do dia a dia -
• Cada plataforma guarda o maior número de dados sobre
as ações dos utilizadores ◦ que imagens fizeram "gosto" ◦ que páginas visitaram ◦ quanto tempo estiveram a explorar • Com toda esta informação, e um complexo mecanismo de machine learning, vamos cada vez recebendo mais informações dirigidas aos nossos gostos Exemplos do dia a dia -
• O ML Kit leva a experiência em machine learning
até aos dispositivos móveis • É uma biblioteca poderosa e fácil de utilizar • Permite que as aplicações Android/iOS ◦ Sejam personalizadas com base nas interações dos utilizadores ◦ Ao mesmo tempo, está otimizada para correr nestes dispositivos • Totalmente gratuito Machine learning para dispositivos móveis -
• O processamento do ML Kit é feito no dispositivo,
tornando-o mais rápido • Permite casos de uso de processamento em tempo real, tais como processamento de imagens/vídeo da câmera • Também funciona offline e pode ser utilizado para processar imagens e texto que necessitem de permanecer no dispositivo Otimizado para dispositivos móveis -
• Permite aproveitar as vantagens das tecnologias de machine learning
que potencializam as próprias experiências e aplicações em dispositivos móveis da Google Desenvolvido com a experiência da Google -
• O ML Kit combina os melhores modelos de machine
learning com canais de processamento bastante avançados e oferece isto através de APIs fáceis de utilizar, que permitem casos de uso bastante poderosos para aplicações móveis Fácil de utilizar -
• Identificar e processar códigos de barras • Suporta a
maioria dos formatos de 1D e 2D disponíveis Detectar códigos de barras Visão -
Detectar códigos de barras Funcionalidade Não integrado na app Integrado
na app Implementação O modelo é carregado dinamicamente do Google Play Services O modelo é integrado na aplicação em tempo de compilação Tamanho do APK Sem impacto ≈ 2.2MB Tempo de inicialização Poderá ser necessário esperar que o modelo seja transferido antes do primeiro uso O modelo está disponível imediatamente -
dependencies { // Modelo integrado na aplicação implementation 'com.google.mlkit:barcode-scanning:16.0.3' //
Modelo disponível pelos Google Play Services implementation 'com.google.android.gms:play-services-mlkit-barcode-scanning:16.1.2' } Como utilizar? Importar a biblioteca app/build.gradle -
// Se utilizarmos a versão não integrada // É opcional,
mas recomendado para transferir automaticamente os modelos <application ...> ... <meta-data android:name="com.google.mlkit.vision.DEPENDENCIES" android:value="barcode" /> <!-- To use multiple models: android:value="barcode,model2,model3" --> </application> Como utilizar? Importar a biblioteca AndroidManifest.xml -
Exemplo • Limites ◦ (87,87) (612,87) (612,612) (87,612) • Valor
◦ WIFI:S:SB1Guest;P:12345;T:WEP;; ◦ SSID - SB1Guest ◦ Password - 12345 ◦ Type - WEP -
• Detetar rostos • Identificar características faciais • Obter os
contornos dos rostos Deteção de caras Visão -
Deteção de caras Funcionalidade Não integrado na app Integrado na
app Implementação O modelo é carregado dinamicamente do Google Play Services O modelo é integrado na aplicação em tempo de compilação Tamanho do APK Sem impacto ≈ 16MB Tempo de inicialização Poderá ser necessário esperar que o modelo seja transferido antes do primeiro uso O modelo está disponível imediatamente -
dependencies { // Modelo integrado na aplicação implementation 'com.google.mlkit:face-detection:16.0.2' //
Modelo disponível pelos Google Play Services implementation 'com.google.android.gms:play-services-mlkit-face-detection:16.1.1' } Como utilizar? Importar a biblioteca app/build.gradle -
// Se utilizarmos a versão não integrada // É opcional,
mas recomendado para transferir automaticamente os modelos <application ...> ... <meta-data android:name="com.google.mlkit.vision.DEPENDENCIES" android:value="face" /> <!-- To use multiple models: android:value="face,model2,model3" --> </application> Como utilizar? Importar a biblioteca AndroidManifest.xml -
Exemplo • Cara ◦ (884.880004882812, 149.546676635742), (1030.77197265625, 149.546676635742), (1030.77197265625, 329.660278320312),
(884.880004882812, 329.660278320312) • Olho esquerdo ◦ (945.869323730469, 211.867126464844) • Olho direito ◦ (971.579467773438, 247.257247924805) • Boca ◦ (907.756591796875, 259.714477539062) • Probabilidade ◦ Sorriso - 0.88979166746139526 ◦ Olho esquerdo aberto - 0.98635888937860727 ◦ Olho direito aberto - 0.99258323386311531 Deteção de caras -
Exemplo • Nariz ◦ (505.149811, 221.201797), (506.987122, 313.285919) • Olho
esquerdo ◦ (404.642029, 232.854431), (408.527283, 231.366623), (413.565796, 229.427856), (421.378296, 226.967682), (432.598755, 225.434143), (442.953064, 226.089508), (453.899811, 228.594818), (461.516418, 232.650467), (465.069580, 235.600845), (462.170410, 236.316147), (456.233643, 236.891602), (446.363922, 237.966888), (435.698914, 238.149323), (424.320740, 237.235168), (416.037720, 236.012115), (409.983459, 234.870300) • Parte de cima do lábio ◦ (421.662048, 354.520813), (428.103882, 349.694061), (440.847595, 348.048737), (456.549988, 346.295532), (480.526489, 346.089294), (503.375702, 349.470459), (525.624634, 347.352783), (547.371155, 349.091980), (560.082031, 351.693268), (570.226685, 354.210175), (575.305420, 359.257751) Contorno da cara -
• Detetar e extrair informações dos objetos • Identifica objetos,
locais, espécies de animais, produtos, entre outros • Consegue identificar cerca de 400 entidades diferentes Classificação de imagens Visão -
Classificação de imagens Funcionalidade Não integrado na app Integrado na
app Implementação O modelo é carregado dinamicamente do Google Play Services O modelo é integrado na aplicação em tempo de compilação Tamanho do APK Sem impacto ≈ 3MB Tempo de inicialização Poderá ser necessário esperar que o modelo seja transferido antes do primeiro uso O modelo está disponível imediatamente -
dependencies { // Modelo integrado na aplicação implementation 'com.google.mlkit:image-labeling:17.0.0' //
Modelo disponível pelos Google Play Services implementation 'com.google.android.gms:play-services-mlkit-image-labeling:16.0.0' } Como utilizar? Importar a biblioteca app/build.gradle -
// Se utilizarmos a versão não integrada // É opcional,
mas recomendado para transferir automaticamente os modelos <application ...> ... <meta-data android:name="com.google.mlkit.vision.DEPENDENCIES" android:value="ica" /> <!-- To use multiple models: android:value="ica,model2,model3" --> </application> Como utilizar? Importar a biblioteca AndroidManifest.xml -
Exemplo Classificação de imagens Texto Confiança Estádio 0.9205354 Desporto 0.7531109
Evento 0.66905296 Lazer 0.59904146 Futebol 0.56384534 Rede 0.54679185 Planta 0.524364 -
• Localizar e seguir até 5 objetos diretamente da câmera
ou de uma imagem, fornecendo a sua posição e um ID que permite identificar esse objeto num vídeo • Permite personalizar a classificação de objetos com modelos do TensorFlow Lite Detectar e seguir objetos Visão -
dependencies { // Apenas disponível integrado na aplicação implementation 'com.google.mlkit:object-detection:16.2.1'
} Como utilizar? Importar a biblioteca app/build.gradle -
Detetar e seguir objetos Limites (95, 45), (496, 45), (496,
240), (95, 240) Categoria PLACE Confiança 0.9296875 Limites (84, 46), (478, 46), (478, 247), (84, 247) Categoria PLACE Confiança 0.8710938 Limites (53, 45), (519, 45), (519, 240), (53, 240) Categoria PLACE Confiança 0.8828125 -
Exemplo Detetar e seguir objetos Objeto 1 Limites (1, 97),
(332, 97), (332, 332), (1, 332) Categoria FASHION_GOOD Confiança 0.95703125 Objeto 2 Limites (186, 80), (337, 80), (337, 226), (186, 226) Categoria FASHION_GOOD Confiança 0.84375 Objeto 3 ... Objeto 4 ... -
• Reconhecimento e extração de texto de imagens • Facilita
a deteção de cartões de crédito, recibos ou cartões de visita Reconhecimento de texto Visão -
Exemplo Reconhecimento de texto Texto reconhecido Texto Wege der parlamentarischen
Demokratie Bloco 0 Texto Wege der parlamentarischen Demokratie Frame (117.0, 258.0, 190.0, 83.0) Limites (117, 270), (301.64, 258.49), (306.05, 329.36), (121.41, 340.86) Língua reconhecida de Linha 0 Texto Wege der Elemento 0 Texto Wege -
dependencies { // Apenas disponível pelos Google Play Services implementation
'com.google.android.gms:play-services-mlkit-text-recognition:16.1.1' } Como utilizar? Importar a biblioteca app/build.gradle -
// Se utilizarmos a versão não integrada // É opcional,
mas recomendado para transferir automaticamente os modelos <application ...> ... <meta-data android:name="com.google.mlkit.vision.DEPENDENCIES" android:value="ocr" /> <!-- To use multiple models: android:value="ocr,model2,model3" --> </application> Como utilizar? Importar a biblioteca AndroidManifest.xml -
• Reconhece texto manuscrito e formas desenhadas à mão numa
superfície digital • Usa a mesma tecnologia utilizada no teclado GBoard e Google tradutor para deteção de escrita manual Reconhecimento de escrita Visão -
dependencies { // Apenas disponível integrado na aplicação implementation 'com.google.mlkit:digital-ink-recognition:16.0.0'
} Como utilizar? Importar a biblioteca app/build.gradle -
Exemplo Reconhecimento de escrita Traço 1 x 392, 391, 389,
287, ... y 52, 60, 76, 97, ... t 0, 37, 56, 75, ... Traço 2 x 497, 494, 493, 490, ... y 167, 165, 165, 165, ... t 694, 742, 751, 770, ... ... -
Exemplo Reconhecimento de escrita Resultados do reconhecimento #1 handw #2
handrw #3 hardw #4 handu #5 handwe ... -
Exemplo Reconhecimento de escrita Traço 1 x 269, 266, 262,
255, ... y 40, 40, 40, 41, ... t 0, 36, 56, 75, ... Traço 2 x 179, 182, 183, 185, ... y 157, 158, 159, 160, ... t 2475, 2522, 2531, 2541, ... ... -
Exemplo Reconhecimento de escrita Resultados do reconhecimento #1 (U+1f62d) #2
(U+1f605) #3 (U+1f639) #4 (U+1f604) #5 (U+1f606) ... -
• Permite detetar a posição do corpo humano em tempo
real de um vídeo ou de uma imagem estática • Detecta partes do corpo humano tais como ombros e cintura Deteção de poses Visão -
Deteção de poses Funcionalidade Deteção Base Deteção precisa Implementação O
modelo é integrado na aplicação em tempo de compilação O modelo é integrado na aplicação em tempo de compilação Tamanho do APK ≈ 6.6MB ≈ 20MB Performance Pixel 4: ~30FPS Pixel 4: ~21FPS -
dependencies { // Apenas disponível integrado na aplicação // SDK
base implementation 'com.google.mlkit:pose-detection:17.0.0' // SDK com precisão implementation 'com.google.mlkit:pose-detection-accurate:17.0.0' } Como utilizar? Importar a biblioteca app/build.gradle -
Exemplo Deteção de poses Marco Tipo Posição Está no frame?
0 NOSE 506.89526, 232.98584 0.9999994 1 LEFT_EYE_INNER 524.4051, 212.25941 0.9999995 2 LEFT_EYE 535.0669, 212.34688 0.99999946 3 LEFT_EYE_OUTER 545.6083, 212.80696 0.9999991 4 RIGHT_EYE_INNER 495.92175, 210.01476 0.9999995 5 RIGHT_EYE 485.4411, 209.35492 0.99999946 6 RIGHT_EYE_OUTER 475.10806, 208.29173 0.9999988 7 LEFT_EAR 560.1211, 223.12553 0.9999993 -
• Permite detetar o idioma apenas com algumas palavras •
Consegue identificar mais de 100 idiomas diferentes Identificação do idioma Linguagem natural -
Identificação simples de idioma "My hovercraft is full of eels."
en (English) "Dao shan xue hai" zh-Latn (Latinized Chinese) "ph'nglui mglw'nafh wgah'nagl fhtagn" und (undetermined) Distribuição de confiança "an amicable coup d'etat" en (0.52) fr (0.44) ca (0.03) Exemplo Identificação do idioma -
dependencies { // Apenas disponível integrado na aplicação implementation 'com.google.mlkit:language-id:16.1.1'
} Como utilizar? Importar a biblioteca app/build.gradle -
• Permite traduzir entre 58 idiomas, tudo no dispositivo, mas
apenas para traduções simples • Permite transferir outros idiomas (30MB cada) Tradução no dispositivo Linguagem natural -
dependencies { // Apenas disponível integrado na aplicação implementation 'com.google.mlkit:translate:16.1.1'
} Como utilizar? Importar a biblioteca app/build.gradle -
• Gera sugestões relevantes de respostas em conversas de texto
• Utiliza o contexto de toda a conversa para dar sugestões • Tudo no dispositivo, sem necessitar de enviar as conversas para o servidor • Apenas funciona em Inglês Sugestões de respostas Linguagem natural -
dependencies { // Apenas disponível integrado na aplicação implementation 'com.google.mlkit:smart-reply:16.1.1'
} ... android { aaptOptions { // Desactivar a compressão de ficheiros ‘tflite’ noCompress “tflite” } } Como utilizar? Importar a biblioteca app/build.gradle -
Conversa UserID Utilizador local? Mensagem true “are you on your
way?” FRIEND0 false “Running late, sorry!” Exemplo Sugestões de respostas Sugestão de respostas Sugestão #1 Sugestão #2 Sugestão #3 No worries No problem! -
class HomeFragment : Fragment() { private val viewModel by viewModels<HomeViewModel>()
override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) } private fun addDogAction() { val dog = getDog() if (dog.isEating()) { loadImage(dog) } } } Scope -
Scope class HomeFragment : Fragment() { private val viewModel by
viewModels<HomeViewModel>() override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) viewModel.start() } private fun addDogAction() { val dog = getDog() if (dog.isEating()) { loadImage(dog) } } } -
Scope class HomeFragment : Fragment() { private val viewModel by
viewModels<HomeViewModel>() override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) viewModel.start() } private fun addDogAction() { viewModel.start() val dog = getDog() if (dog.isEating()) { loadImage(dog) } } } -
Scope class HomeFragment : Fragment() { private val viewModel by
viewModels<HomeViewModel>() override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) viewModel.start() } private fun addDogAction() { viewModel.start() val dog = getDog() if (dog.isEating()) { viewModel.start() loadImage(dog) } } } -
Scope class HomeFragment : Fragment() { private val viewModel by
viewModels<HomeViewModel>() override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) } private fun addDogAction() { val dog = getDog() if (dog.isEating()) { loadImage(dog) } } } -
Scope class HomeFragment : Fragment() { private val viewModel by
viewModels<HomeViewModel>() override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) } private fun addDogAction() { val dog = getDog() if (dog.isEating()) { loadImage(dog) } } } -
Scope class HomeFragment : Fragment() { private val viewModel by
viewModels<HomeViewModel>() override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) } private fun addDogAction() { val dog = getDog() if (dog.isEating()) { val food = dog.food loadImage(dog) } } } -
Scope class HomeFragment : Fragment() { private val viewModel by
viewModels<HomeViewModel>() override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) } private fun addDogAction() { val dog = getDog() if (dog.isEating()) { val food = dog.food loadImage(dog) } val breed = dog.breed } } -
Scope class HomeFragment : Fragment() { private val viewModel by
viewModels<HomeViewModel>() override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) val food = dog.food } private fun addDogAction() { val dog = getDog() if (dog.isEating()) { val food = dog.food loadImage(dog) } val breed = dog.breed } } -
Scope class HomeFragment : Fragment() { private val viewModel by
viewModels<HomeViewModel>() override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) val food = dog.food } private fun addDogAction() { val dog = getDog() if (dog.isEating()) { val food = dog.food loadImage(dog) } val breed = dog.breed } } ⚠ Unresolved reference: dog ⚠ -
Scope class HomeFragment : Fragment() { private val viewModel by
viewModels<HomeViewModel>() override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) } private fun addDogAction() { val dog = getDog() if (dog.isEating()) { loadImage(dog) } } } -
Scope class HomeFragment : Fragment() { private val viewModel by
viewModels<HomeViewModel>() override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) } private fun addDogAction() { val dog = getDog() if (dog.isEating()) { val food = dog.food loadImage(dog) } } } -
Scope class HomeFragment : Fragment() { private val viewModel by
viewModels<HomeViewModel>() override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) } private fun addDogAction() { val dog = getDog() if (dog.isEating()) { val food = dog.food loadImage(dog) } Log.d(TAG, food) } } -
Scope class HomeFragment : Fragment() { private val viewModel by
viewModels<HomeViewModel>() override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) } private fun addDogAction() { val dog = getDog() if (dog.isEating()) { val food = dog.food loadImage(dog) } Log.d(TAG, food) } } ⚠ Unresolved reference: food ⚠ -
Funções com scope run… with… run... let… apply… also... Precisam
de: retornar uma instância do objeto que estão a aceder? sim. -
Funções com scope Dog fifi = new Dog().Builder(“Fifi”) .age(2) .breed(“Yorkshire
Terrier”) .weight(2.5) .build(); apply val fifi = Dog(“Fifi”).apply { age = 2 breed = “Yorkshire Terrier” weight = 2.5 } -
private var age = 20 val fifi = Dog(“Fifi”).apply {
age = 2 breed = “Yorkshire Terrier” weight = 2.5 } Funções com scope apply -
Funções com scope apply private var age = 20 val
fifi = Dog(“Fifi”).apply { age = 2 breed = “Yorkshire Terrier” weight = 2.5 this.age = age } -
private var age = 20 val fifi = Dog(“Fifi”).apply {
age = 2 breed = “Yorkshire Terrier” weight = 2.5 this.age = age } Funções com scope apply ⚠ this.age corresponds to Dog.age ⚠ -
Funções com scope Dog fifi = new Dog().Builder(“Fifi”) .age(2) .breed(“Yorkshire
Terrier”) .weight(2.5) .build(); also val fifi = Dog(“Fifi”).also { fifi -> fifi.age = 2 fifi.breed = “Yorkshire Terrier” fifi.weight = 2.5 } -
private var age = 20 val fifi = Dog(“Fifi”).also {
fifi -> fifi.age = 2 fifi.breed = “Yorkshire Terrier” fifi.weight = 2.5 this.age = fifi.age } Funções com scope also -
private var age = 20 val fifi = Dog(“Fifi”).also {
fifi -> fifi.age = 2 fifi.breed = “Yorkshire Terrier” fifi.weight = 2.5 this.age = fifi.age } Funções com scope also ⚠ this.age corresponds to var age ⚠ -
Funções com scope run… with… run... let… apply… also... Precisam
de: retornar uma instância do objeto que estão a aceder? não. -
Funções com scope run… with… run... let… apply… also... Precisam
de: retornar uma instância do objeto que estão a aceder? não. confirmar que não é null, encadear com outras funções, etc.? sim. -
Funções com scope List<Dog> breeds = getBreedsList() int size =
0; List<Dog> nonNullBreeds = new LinkedList<String>() for (String breed : breeds) { if (breed != null) { size++; nonNullBreeds.add(breed) } } doSomeOperation(nonNullBreeds) let val breeds: List<Dog>? = getBreedsList() val size = breeds?.let { doSomeOperation(it) it.size } -
private var age = 20 val breeds: List<Dog>? = getBreedsList()
val size = breeds?.let { doSomeOperation(it) it.size } Funções com scope let -
private var age = 20 val breeds: List<Dog>? = getBreedsList()
val size = breeds?.let { doSomeOperation(it) it.size age = 20 } Funções com scope let ⚠ age corresponds to var age ⚠ -
private var age = 20 val breeds: List<Dog>? = getBreedsList()
val size = breeds?.let { doSomeOperation(it) it.size this.age = 20 } Funções com scope let ⚠ age corresponds to var age ⚠ -
Funções com scope List<Dog> breeds = getBreedsList() int size =
0; List<Dog> nonNullBreeds = new LinkedList<Dog>() for (String breed : breeds) { if (breed != null) { size++; nonNullBreeds.add(breed) } } doSomeOperation(nonNullBreeds) let val breeds: List<Dog>? = getBreedsList() val size = breeds?.run { doSomeOperation(it) size } -
val breeds: List<Dog>? = getBreedsList() val size = breeds?.run {
doSomeOperation(it) size } Funções com scope let ⚠ O scope de run é a própria lista ⚠ -
Testar novas funcionalidades Para ativar: 1. Definições 2. Sistema 3.
Opções de programador 4. Alterações de compatibilidade da aplicação -
Google I/O Android app https://github.com/google/iosched Aplicação utilizada anualmente na conferência
Google I/O. É actualizada em cada evento de forma a estar de acordo com as últimas novidades de: • Material design • Arquitectura • Bibliotecas • Componentes -
Plaid https://github.com/android/plaid Desenvolvida para mostrar as potencialidades do material design.
O repositório contém referências para artigos e apresentações de como esta aplicação tem sido actualizada ao longo dos anos. -
tivi https://github.com/chrisbanes/tivi Aplicação desenvolvida com o objetivo de demonstrar as
últimas bibliotecas e ferramentas disponíveis no Android: • Inteiramente escrita em Kotlin • Kotlin Coroutines • Jetpack: ◦ Room ◦ Lifecycle ◦ Nativation ◦ Hilt • Algumas partes já em Compose -
Pokedex https://github.com/skydoves/Pokedex Uma aplicação desenvolvida independentemente que faz uso das
bibliotecas mais conhecidas seguindo uma arquitetura MVVM: • Kotlin c/ Coroutines e Flow • Hilt (dependency injection) • Jetpack ◦ LiveData ◦ Lifecycle ◦ ViewModel ◦ Room • Retrofit • Moshi • etc. -
Android Training Program PORTUGAL Aula #10 Tensorflow Lite no Android
Próxima aula: 10 de Dezembro