$30 off During Our Annual Pro Sale. View Details »

Android Training Program - Portugal, Aula 9

ATP Portugal
December 09, 2020

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
Tweet

More Decks by ATP Portugal

Other Decks in Education

Transcript

  1. Android
    Training
    Program
    PORTUGAL
    Aula #9
    ML Kit: Machine Learning
    para iniciantes

    View Slide

  2. ● 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

    View Slide

  3. Andres-Leonardo
    Martinez-Ortiz
    Google
    Carlos Mota
    Formador
    Renato Almeida
    Formador
    @davilagrau @cafonsomota @tallnato
    Equipa
    Daniela Ferreira
    Gestora de
    comunidades

    View Slide

  4. ● 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

    View Slide

  5. #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

    ✅ ✅ ✅

    View Slide

  6. Sumário
    Photo by Mika Baumeister on Unsplash
    ● Resumo da aula anterior
    ● Introdução ao Machine Learning
    ● ML Kit
    ● Kotlin para principiantes
    ● É Natal

    View Slide

  7. http://events.withgoogle.com/atp2020
    [email protected]
    http://bit.ly/atp2020-youtube
    http://bit.ly/atp2020-discord
    Links

    View Slide

  8. http://bit.ly/atp2020-live

    View Slide

  9. http://bit.ly/atp2020-codelabs

    View Slide

  10. http://bit.ly/kahoot-aula9

    View Slide

  11. Resumo da Aula #8

    View Slide

  12. ● 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

    View Slide

  13. ● 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

    View Slide

  14. ● 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

    View Slide

  15. ● 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

    View Slide

  16. ● 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

    View Slide

  17. Aula #9

    View Slide

  18. Luiz Gustavo
    @gusthema
    TensorFlow Developer Advocate
    Google
    O que é
    Machine Learning?

    View Slide

  19. Machine Learning

    View Slide

  20. View Slide


  21. Machine learning
    Algoritmos
    Deep learning
    Inteligência artificial
    ...

    View Slide

  22. ● 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

    View Slide

  23. Photo by Eugene Chystiakovl

    View Slide

  24. 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

    View Slide

  25. theverge.com/2019/10/30/20939147/deepmind-google-alphastar-starcraft-2-research-grandmaster-level

    View Slide

  26. ● 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

    View Slide

  27. ● 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

    View Slide

  28. ● 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

    View Slide

  29. https://about.google/intl/ALL_us/stories/seeingpotential/

    View Slide

  30. ● 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

    View Slide

  31. Navegação com uma conta registada

    View Slide

  32. Navegação em modo anónimo

    View Slide

  33. ● 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

    View Slide

  34. ● 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

    O mundo à nossa volta
    Onde é aplicado?
    Photo by Gustavo Quepón

    View Slide

  35. https://about.google/intl/ALL_us/stories/save-the-bees/

    View Slide

  36. ● 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

    View Slide

  37. ● 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

    View Slide

  38. ML Kit

    View Slide

  39. ● 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

    View Slide

  40. ● 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

    View Slide

  41. ● 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

    View Slide

  42. ● 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

    View Slide

  43. Visão Linguagem natural

    View Slide

  44. ● 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

    View Slide

  45. 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

    View Slide

  46. 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

    View Slide

  47. // Se utilizarmos a versão não integrada
    // É opcional, mas recomendado para transferir automaticamente os modelos

    ...
    android:name="com.google.mlkit.vision.DEPENDENCIES"
    android:value="barcode" />


    Como utilizar?
    Importar a biblioteca
    AndroidManifest.xml

    View Slide

  48. Exemplo
    ● Limites
    ○ (49,125), (172,125), (172,160), (49,160)
    ● Valor
    ○ 2404105001722

    View Slide

  49. Exemplo
    ● Limites
    ○ (87,87) (612,87) (612,612) (87,612)
    ● Valor
    ○ WIFI:S:SB1Guest;P:12345;T:WEP;;
    ○ SSID - SB1Guest
    ○ Password - 12345
    ○ Type - WEP

    View Slide

  50. https://developers.google.com/ml-kit/vision/barcode-scanning

    View Slide

  51. Demo
    https://github.com/googlesamples/mlkit

    View Slide

  52. ● Detetar rostos
    ● Identificar características faciais
    ● Obter os contornos dos rostos
    Deteção de caras
    Visão

    View Slide

  53. 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

    View Slide

  54. 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

    View Slide

  55. // Se utilizarmos a versão não integrada
    // É opcional, mas recomendado para transferir automaticamente os modelos

    ...
    android:name="com.google.mlkit.vision.DEPENDENCIES"
    android:value="face" />


    Como utilizar?
    Importar a biblioteca
    AndroidManifest.xml

    View Slide

  56. 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

    View Slide

  57. 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

    View Slide

  58. https://developers.google.com/ml-kit/vision/face-detection

    View Slide

  59. Demo
    https://github.com/googlesamples/mlkit

    View Slide

  60. ● 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

    View Slide

  61. 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

    View Slide

  62. 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

    View Slide

  63. // Se utilizarmos a versão não integrada
    // É opcional, mas recomendado para transferir automaticamente os modelos

    ...
    android:name="com.google.mlkit.vision.DEPENDENCIES"
    android:value="ica" />


    Como utilizar?
    Importar a biblioteca
    AndroidManifest.xml

    View Slide

  64. 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

    View Slide

  65. https://developers.google.com/ml-kit/vision/image-labeling

    View Slide

  66. Demo
    https://cloud.google.com/vision/docs/drag-and-drop

    View Slide

  67. ● 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

    View Slide

  68. 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

    View Slide

  69. 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

    View Slide

  70. 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
    ...

    View Slide

  71. https://developers.google.com/ml-kit/vision/object-detection

    View Slide

  72. ● 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

    View Slide

  73. 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

    View Slide

  74. 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

    View Slide

  75. // Se utilizarmos a versão não integrada
    // É opcional, mas recomendado para transferir automaticamente os modelos

    ...
    android:name="com.google.mlkit.vision.DEPENDENCIES"
    android:value="ocr" />


    Como utilizar?
    Importar a biblioteca
    AndroidManifest.xml

    View Slide

  76. https://developers.google.com/ml-kit/vision/text-recognition

    View Slide

  77. ● 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

    View Slide

  78. 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

    View Slide

  79. 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, ...
    ...

    View Slide

  80. Exemplo
    Reconhecimento de escrita
    Resultados do reconhecimento
    #1 handw
    #2 handrw
    #3 hardw
    #4 handu
    #5 handwe
    ...

    View Slide

  81. 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, ...
    ...

    View Slide

  82. Exemplo
    Reconhecimento de escrita
    Resultados do reconhecimento
    #1 (U+1f62d)
    #2 (U+1f605)
    #3 (U+1f639)
    #4 (U+1f604)
    #5 (U+1f606)
    ...

    View Slide

  83. https://developers.google.com/ml-kit/vision/digital-ink-recognition

    View Slide

  84. Demo
    https://quickdraw.withgoogle.com/

    View Slide

  85. ● 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

    View Slide

  86. 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

    View Slide

  87. 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

    View Slide

  88. Exemplo
    Deteção de poses

    View Slide

  89. 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

    View Slide

  90. https://developers.google.com/ml-kit/vision/pose-detection

    View Slide

  91. Demo
    https://github.com/googlesamples/mlkit

    View Slide

  92. ● Permite detetar o idioma apenas com algumas palavras
    ● Consegue identificar mais de 100 idiomas diferentes
    Identificação do idioma
    Linguagem natural

    View Slide

  93. 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

    View Slide

  94. 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

    View Slide

  95. https://developers.google.com/ml-kit/language/identification

    View Slide

  96. ● 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

    View Slide

  97. dependencies {
    // Apenas disponível integrado na aplicação
    implementation 'com.google.mlkit:translate:16.1.1'
    }
    Como utilizar?
    Importar a biblioteca
    app/build.gradle

    View Slide

  98. https://developers.google.com/ml-kit/language/translation

    View Slide

  99. Demo
    play.google.com/store/apps/details?&id=com.google.android.apps.translate

    View Slide

  100. ● 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

    View Slide

  101. 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

    View Slide

  102. 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!

    View Slide

  103. https://developers.google.com/ml-kit/language/smart-reply

    View Slide

  104. https://developers.google.com/ml-kit

    View Slide

  105. https://developers.google.com/ml-kit

    View Slide

  106. https://developers.google.com/ml-kit

    View Slide

  107. Abre o Android
    Studio e vamos
    começar a
    programar
    ‍‍

    View Slide

  108. VS
    Ronda 8

    View Slide

  109. class HomeFragment : Fragment() {
    private val viewModel by viewModels()
    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
    super.onViewCreated(view, savedInstanceState)
    }
    private fun addDogAction() {
    val dog = getDog()
    if (dog.isEating()) {
    loadImage(dog)
    }
    }
    }
    Scope

    View Slide

  110. Scope
    class HomeFragment : Fragment() {
    private val viewModel by viewModels()
    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
    super.onViewCreated(view, savedInstanceState)
    viewModel.start()
    }
    private fun addDogAction() {
    val dog = getDog()
    if (dog.isEating()) {
    loadImage(dog)
    }
    }
    }

    View Slide

  111. Scope
    class HomeFragment : Fragment() {
    private val viewModel by viewModels()
    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)
    }
    }
    }

    View Slide

  112. Scope
    class HomeFragment : Fragment() {
    private val viewModel by viewModels()
    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)
    }
    }
    }

    View Slide

  113. Scope
    class HomeFragment : Fragment() {
    private val viewModel by viewModels()
    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
    super.onViewCreated(view, savedInstanceState)
    }
    private fun addDogAction() {
    val dog = getDog()
    if (dog.isEating()) {
    loadImage(dog)
    }
    }
    }

    View Slide

  114. Scope
    class HomeFragment : Fragment() {
    private val viewModel by viewModels()
    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
    super.onViewCreated(view, savedInstanceState)
    }
    private fun addDogAction() {
    val dog = getDog()
    if (dog.isEating()) {
    loadImage(dog)
    }
    }
    }

    View Slide

  115. Scope
    class HomeFragment : Fragment() {
    private val viewModel by viewModels()
    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)
    }
    }
    }

    View Slide

  116. Scope
    class HomeFragment : Fragment() {
    private val viewModel by viewModels()
    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
    }
    }

    View Slide

  117. Scope
    class HomeFragment : Fragment() {
    private val viewModel by viewModels()
    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
    }
    }

    View Slide

  118. Scope
    class HomeFragment : Fragment() {
    private val viewModel by viewModels()
    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 ⚠

    View Slide

  119. Scope
    class HomeFragment : Fragment() {
    private val viewModel by viewModels()
    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
    super.onViewCreated(view, savedInstanceState)
    }
    private fun addDogAction() {
    val dog = getDog()
    if (dog.isEating()) {
    loadImage(dog)
    }
    }
    }

    View Slide

  120. Scope
    class HomeFragment : Fragment() {
    private val viewModel by viewModels()
    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)
    }
    }
    }

    View Slide

  121. Scope
    class HomeFragment : Fragment() {
    private val viewModel by viewModels()
    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)
    }
    }

    View Slide

  122. Scope
    class HomeFragment : Fragment() {
    private val viewModel by viewModels()
    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 ⚠

    View Slide

  123. Funções com scope
    run… with… run... let… apply… also...
    Precisam de:
    retornar uma instância do objeto que estão a aceder?
    sim.

    View Slide

  124. 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
    }

    View Slide

  125. private var age = 20
    val fifi = Dog(“Fifi”).apply {
    age = 2
    breed = “Yorkshire Terrier”
    weight = 2.5
    }
    Funções com scope
    apply

    View Slide

  126. 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
    }

    View Slide

  127. 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 ⚠

    View Slide

  128. 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
    }

    View Slide

  129. 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

    View Slide

  130. 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 ⚠

    View Slide

  131. 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.

    View Slide

  132. 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.

    View Slide

  133. Funções com scope
    List breeds = getBreedsList()
    int size = 0;
    List nonNullBreeds = new
    LinkedList()
    for (String breed : breeds) {
    if (breed != null) {
    size++;
    nonNullBreeds.add(breed)
    }
    }
    doSomeOperation(nonNullBreeds)
    let
    val breeds: List? = getBreedsList()
    val size = breeds?.let {
    doSomeOperation(it)
    it.size
    }

    View Slide

  134. private var age = 20
    val breeds: List? = getBreedsList()
    val size = breeds?.let {
    doSomeOperation(it)
    it.size
    }
    Funções com scope
    let

    View Slide

  135. private var age = 20
    val breeds: List? = getBreedsList()
    val size = breeds?.let {
    doSomeOperation(it)
    it.size
    age = 20
    }
    Funções com scope
    let
    ⚠ age corresponds to var age ⚠

    View Slide

  136. private var age = 20
    val breeds: List? = getBreedsList()
    val size = breeds?.let {
    doSomeOperation(it)
    it.size
    this.age = 20
    }
    Funções com scope
    let
    ⚠ age corresponds to var age ⚠

    View Slide

  137. Funções com scope
    List breeds = getBreedsList()
    int size = 0;
    List nonNullBreeds = new
    LinkedList()
    for (String breed : breeds) {
    if (breed != null) {
    size++;
    nonNullBreeds.add(breed)
    }
    }
    doSomeOperation(nonNullBreeds)
    let
    val breeds: List? = getBreedsList()
    val size = breeds?.run {
    doSomeOperation(it)
    size
    }

    View Slide

  138. val breeds: List? = getBreedsList()
    val size = breeds?.run {
    doSomeOperation(it)
    size
    }
    Funções com scope
    let
    ⚠ O scope de run é a própria lista ⚠

    View Slide

  139. Natal
    Photo by Mel Poole Unsplash

    View Slide

  140. Testar novas funcionalidades

    Para ativar:
    1. Definições
    2. Sistema
    3. Opções de programador
    4. Alterações de compatibilidade da aplicação

    View Slide

  141. 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

    View Slide

  142. 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.

    View Slide

  143. Sunflower

    https://github.com/android/sunflower
    Desenvolvida para demonstrar algumas das
    bibliotecas do Android Jetpack.

    View Slide

  144. 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

    View Slide

  145. 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.

    View Slide

  146. Trabalho Para Casa
    ‍‍

    View Slide

  147. ⚠ Não há trabalho de casa que amanhã há aula!

    View Slide

  148. Dúvidas?

    View Slide

  149. Continuamos a
    responder no
    discord

    View Slide

  150. Obrigado
    ‍♀

    View Slide

  151. Android
    Training
    Program
    PORTUGAL
    Aula #10
    Tensorflow Lite no
    Android
    Próxima aula: 10 de Dezembro

    View Slide