Recursos e APIs do Android 9

O Android 9 (API de nível 28) introduz ótimos novos recursos e funcionalidades para usuários e desenvolvedores. Este documento destaca as novidades para os desenvolvedores.

Para saber mais sobre as novas APIs, leia o Relatório de diferenças da API ou acesse a Referência da API do Android. Consulte também Mudanças de comportamento do Android 9 para saber sobre as áreas em que as mudanças na plataforma podem afetar seus apps.

Posicionamento em ambiente fechado com Wi-Fi RTT

As novas APIs de RTT oferecem suporte ao posicionamento interno nos seus aplicativos.

O Android 9 adiciona suporte de plataforma para o protocolo de Wi-Fi IEEE 802.11-2016, também conhecido como Wi-Fi Round-Trip-Time (RTT), para que você aproveite o posicionamento interno nos seus apps.

Em dispositivos que executam o Android 9 com suporte a hardware, seus apps podem usar as APIs RTT para medir a distância até pontos de acesso (APs) Wi-Fi compatíveis com RTT. O dispositivo precisa ter os serviços de localização e a busca por Wi-Fi ativados (em Configurações > Localização), e o app precisa ter a permissão ACCESS_FINE_LOCATION. O dispositivo não precisa se conectar aos pontos de acesso para usar o RTT. Para manter a privacidade, somente o smartphone pode determinar a distância até o ponto de acesso. Os pontos de acesso não têm essa informação.

Se o dispositivo mede a distância até três ou mais pontos de acesso, é possível usar um algoritmo de multilateração para estimar a posição do dispositivo que melhor se encaixa nessas medidas. Normalmente, a precisão do resultado é de 1 a 2 metros.

Com esse nível de precisão, você pode criar novas experiências, como navegação dentro dos edifícios e serviços baseados em localização refinada, como controle de voz sem ambiguidade (por exemplo, "acenda esta luz") e informações baseadas em localização (como este produto tem ofertas especiais?).

Confira a API Wi-Fi RTT em uso no app de demonstração Android WifiRttScan.

Para mais informações, consulte Local de Wi-Fi: alcance com RTT.

Suporte a corte de tela

Tela de opções do desenvolvedor mostrando diferentes tamanhos de corte

Como testar o corte da tela usando um emulador

O Android 9 oferece suporte às telas de ponta a ponta mais recentes que contêm cortes de tela para câmeras e alto-falantes. A classe DisplayCutout permite descobrir o local e o formato das áreas não funcionais em que o conteúdo não será exibido. Para determinar a existência e o posicionamento dessas áreas de corte, use o método getDisplayCutout().

Um novo atributo de layout de janela, layoutInDisplayCutoutMode, permite que seu app disponha o conteúdo em torno dos cortes de um dispositivo. É possível definir esse atributo como um dos seguintes valores:

É possível simular um corte de tela em qualquer dispositivo ou emulador que execute o Android 9 da seguinte maneira:

  1. Ative as opções do desenvolvedor.
  2. Na tela Opções do desenvolvedor, role para baixo até a seção Desenho e selecione Simular uma tela com recorte.
  3. Selecione o tamanho do recorte.

Notificações

O Android 9 apresenta várias melhorias nas notificações, todas disponíveis para desenvolvedores direcionados ao nível 28 da API e versões mais recentes.

Notificações de mensagens

MessagingStyle com foto anexada.

Notificação de mensagem

MessagingStyle com respostas e conversa.

Para ver um exemplo de código que usa notificações, incluindo os recursos do Android 9, consulte o Exemplo de pessoas (em inglês).

Experiência de mensagens aprimorada

A partir do Android 7.0 (nível 24 da API), é possível adicionar uma ação para responder a mensagens ou inserir outros textos diretamente de uma notificação. O Android 9 aprimora esse recurso com as seguintes melhorias:

  • Suporte simplificado para participantes da conversa: a classe Person é usada para identificar as pessoas envolvidas em uma conversa, incluindo os avatares e URIs delas. Muitas outras APIs, como addMessage(), agora usam a classe Person em vez de um CharSequence. A classe Person também oferece suporte ao padrão de design Builder.

  • Compatibilidade com imagens: o Android 9 agora mostra imagens nas Notificações de Mensagens em smartphones. Você pode usar setData() na mensagem para mostrar uma imagem. O snippet de código a seguir demonstra como criar um Person e uma mensagem com uma imagem.

Kotlin

// Create new Person.
val sender = Person()
        .setName(name)
        .setUri(uri)
        .setIcon(null)
        .build()
// Create image message.
val message = Message("Picture", time, sender)
        .setData("image/", imageUri)
val style = Notification.MessagingStyle(getUser())
        .addMessage("Check this out!", 0, sender)
        .addMessage(message)

Java

// Create new Person.
Person sender = new Person()
        .setName(name)
        .setUri(uri)
        .setIcon(null)
        .build();
// Create image message.
Message message = new Message("Picture", time, sender)
        .setData("image/", imageUri);
Notification.MessagingStyle style = new Notification.MessagingStyle(getUser())
        .addMessage("Check this out!", 0, sender)
        .addMessage(message);
  • Salvar respostas como rascunhos: o app pode recuperar as EXTRA_REMOTE_INPUT_DRAFT enviadas pelo sistema quando um usuário fecha acidentalmente uma notificação de mensagem. Você pode usar esse extra para pré-preencher campos de texto no app para que os usuários possam terminar a resposta.

  • Identifique se uma conversa é em grupo: você pode usar setGroupConversation() para identificar uma conversa como sendo em grupo ou não.

  • Defina a ação semântica de uma intent: o método setSemanticAction() permite dar significado semântico a uma ação, como "marcar como lida", "excluir", "responder" e assim por diante.

  • Resposta inteligente: o Android 9 oferece suporte às mesmas respostas sugeridas disponíveis no seu app de mensagens. Use RemoteInput.setChoices() para fornecer uma matriz de respostas padrão ao usuário.

Configurações do canal, transmissões e "Não perturbe"

O Android 8.0 introduziu os Canais de notificação, permitindo que você crie um canal personalizável pelo usuário para cada tipo de notificação que quiser mostrar. O Android 9 simplifica as configurações de canal com as seguintes modificações:

  • Bloqueio de grupos de canais: agora os usuários podem bloquear grupos inteiros de canais nas configurações de notificação de um app. Você pode usar o método isBlocked() para identificar quando um grupo está bloqueado e, consequentemente, não enviar notificações para canais desse grupo.

    Além disso, seu app pode consultar as configurações atuais do grupo de canais usando o novo método getNotificationChannelGroup().

  • Novos tipos de intent de transmissão: o sistema Android agora envia intents de transmissão quando o estado de bloqueio de canais de notificação e grupos de canais muda. O app proprietário do canal ou grupo bloqueado pode detectar essas intents e reagir de acordo. Para mais informações sobre essas ações de intent e extras, consulte a lista de constantes atualizadas na referência de NotificationManager. Para informações sobre como reagir a intents de transmissão, consulte Transmissões.

  • NotificationManager.Policy tem três novas categorias de prioridade "Não perturbe":

  • O NotificationManager.Policy também tem sete novas constantes "Não perturbe" que podem ser usadas para suprimir a interrupção visual:

Suporte a várias câmeras e atualizações de câmera

Em dispositivos com o Android 9, é possível acessar streams simultaneamente de duas ou mais câmeras físicas. Em dispositivos com duas câmeras frontais ou traseiras, você pode criar recursos inovadores que seriam impossíveis com apenas uma câmera, como zoom, bokeh e visão estéreo integrados. A API também permite chamar um stream de câmera lógica ou combinada que alterna automaticamente entre duas ou mais câmeras.

Outras melhorias na câmera incluem outros parâmetros de sessão que ajudam a reduzir atrasos durante a captura inicial e o compartilhamento de superfície, que permite que os clientes da câmera processem vários casos de uso sem precisar interromper e iniciar o streaming da câmera. Também adicionamos APIs para suporte a flash baseado em tela e acesso a carimbos de data/hora OIS para estabilização de imagem e efeitos especiais no app.

No Android 9, a API de várias câmeras oferece suporte a câmeras monocromáticas para dispositivos com o recurso FULL ou LIMITED. A saída monocromática é alcançada pelo formato YUV_420_888, com Y como escala de cinza, U (Cb) como 128 e V (Cr) como 128.

O Android 9 também oferece suporte a câmeras USB/UVC externas em dispositivos com suporte.

ImageDecoder para drawables e bitmaps

O Android 9 introduz a classe ImageDecoder, que fornece uma abordagem modernizada para a decodificação de imagens. Use essa classe em vez das APIs BitmapFactory e BitmapFactory.Options.

O ImageDecoder permite criar um Drawable ou um Bitmap usando um buffer de bytes, um arquivo ou um URI. Para decodificar uma imagem, primeiro chame createSource() com a origem da imagem codificada. Em seguida, chame decodeDrawable() ou decodeBitmap() transmitindo o objeto ImageDecoder.Source para criar um Drawable ou Bitmap. Para mudar as configurações padrão, transmita OnHeaderDecodedListener para decodeDrawable() ou decodeBitmap(). ImageDecoder chama onHeaderDecoded() com a largura e a altura padrão da imagem, quando elas são conhecidas. Se a imagem codificada for um GIF ou WebP animado, decodeDrawable() retornará um Drawable, que é uma instância da classe AnimatedImageDrawable.

Há diferentes métodos que podem ser usados para definir as propriedades de uma imagem:

  • Para dimensionar a imagem decodificada para um tamanho exato, transmita as dimensões de destino para setTargetSize(). Também é possível dimensionar imagens usando um tamanho de exemplo. Transmita o tamanho da amostra diretamente para setTargetSampleSize().
  • Para cortar uma imagem dimensionada, chame setCrop().
  • Para criar um bitmap mutável, transmita true para setMutableRequired().

A ImageDecoder também permite adicionar efeitos personalizados e complicados a uma imagem, como cantos arredondados ou máscaras de círculos. Use setPostProcessor() com uma instância da classe PostProcessor para executar os comandos de desenho que quiser.

Animação

O Android 9 introduz a classe AnimatedImageDrawable para desenhar e exibir imagens animadas GIF e WebP. O AnimatedImageDrawable funciona de maneira semelhante a AnimatedVectorDrawable, em que a linha de execução de renderização orienta as animações de AnimatedImageDrawable. A linha de execução de renderização também usa uma linha de execução de worker para a decodificação. Assim, a decodificação não interfere em outras operações na linha de execução de renderização. Essa implementação permite que o app mostre uma imagem animada sem gerenciar as atualizações nem interferir em outros eventos na linha de execução de interface do app.

Um AnimatedImageDrawable pode ser decodificado usando uma instância de ImageDecoder. O snippet de código abaixo mostra como usar ImageDecoder para decodificar seu AnimatedImageDrawable:

Kotlin

@Throws(IOException::class)
private fun decodeImage() {
    val decodedAnimation = ImageDecoder.decodeDrawable(
        ImageDecoder.createSource(resources, R.drawable.my_drawable))

    // Prior to start(), the first frame is displayed.
    (decodedAnimation as? AnimatedImageDrawable)?.start()
}

Java

private void decodeImage() throws IOException {
    Drawable decodedAnimation = ImageDecoder.decodeDrawable(
        ImageDecoder.createSource(getResources(), R.drawable.my_drawable));

    if (decodedAnimation instanceof AnimatedImageDrawable) {
        // Prior to start(), the first frame is displayed.
        ((AnimatedImageDrawable) decodedAnimation).start();
    }
}

O ImageDecoder tem vários métodos que permitem modificar ainda mais a imagem. Por exemplo, use o método setPostProcessor() para modificar a aparência da imagem, aplicando uma máscara circular ou cantos arredondados, por exemplo.

Vídeo VP9 HDR, compactação de imagens HEIF e APIs Media

O Android 9 oferece suporte integrado ao perfil 2 do VP9 de High Dynamic Range (HDR) para que você possa enviar filmes compatíveis com HDR aos usuários do YouTube, do Play Filmes e de outras fontes em dispositivos compatíveis com HDR.

O Android 9 também adiciona suporte à codificação de imagens usando o formato de arquivo de imagem de alta eficiência (HEIF ou HEIC), que melhora a compactação e reduz o espaço de armazenamento e o uso de dados da rede. As amostras de imagens estáticas HEIF têm suporte nas classes MediaMuxer e MediaExtractor. Com suporte de plataforma em dispositivos Android 9, é fácil enviar e usar imagens HEIF do seu servidor de back-end. Depois de verificar se o app é compatível com esse formato de dados para compartilhamento e exibição, teste o HEIF como um formato de armazenamento de imagens. É possível fazer uma conversão de jpeg para heic usando ImageDecoder ou BitmapFactory (que extrai um bitmap de um arquivo JPEG). Você pode usar HeifWriter para gravar imagens estáticas HEIF de buffers de byte YUV ou instâncias de Surface ou Bitmap.

As métricas de mídia também estão disponíveis nas classes AudioTrack, AudioRecord e MediaDrm.

O Android 9 introduz métodos à classe MediaDRM para acessar métricas, níveis de HDCP, os níveis de segurança e o número de sessões, além de adicionar mais controle sobre os níveis e as paradas de segurança. Consulte o Relatório de diferenças da API para ver mais detalhes.

No Android 9, a API AAudio adiciona suporte a vários outros atributos da AAudioStream, incluindo uso, tipo de conteúdo e predefinição de entrada. Com eles, você cria streams ajustados para aplicativos VoIP ou de filmadora. Também é possível definir o ID da sessão para associar um stream da AAudio a um submix que pode incluir efeitos. Use a API AudioEffect para controlar os efeitos.

O Android 9 introduz a API AudioEffect para processamento dinâmico. Com essa classe, você pode criar efeitos de áudio baseados em canal, incluindo Equalização, compactação em várias bandas e limitador, em vários estágios. O número de faixas e estágios ativos é configurável, e a maioria dos parâmetros pode ser controlada em tempo real.

Confidencialidade de custo de dados no JobScheduler

A partir do Android 9, o JobScheduler pode usar sinais de status de rede fornecidos pelas operadoras para melhorar o processamento de jobs relacionados à rede.

Os jobs podem declarar o tamanho de dados estimado, a pré-busca de indicadores e especificar requisitos detalhados de rede. O JobScheduler gerencia o trabalho de acordo com o status da rede. Por exemplo, quando a rede indica que está congestionada, o JobScheduler pode adiar solicitações de rede grandes. Em uma rede ilimitada, o JobScheduler pode executar jobs de pré-busca para melhorar a experiência do usuário, como a pré-busca de manchetes.

Ao adicionar jobs, use setEstimatedNetworkBytes(), setPrefetch() e setRequiredNetwork() quando for adequado para ajudar JobScheduler a lidar com o trabalho corretamente. Quando o job for executado, use o objeto Network retornado por JobParameters.getNetwork(). Caso contrário, você vai usar implicitamente a rede padrão do dispositivo, que pode não atender aos seus requisitos, causando um uso não intencional de dados.

API Neural Networks 1.1

A API Neural Networks foi introduzida no Android 8.1 (nível 27 da API) para acelerar o aprendizado de máquina no dispositivo Android. O Android 9 expande e melhora a API, adicionando suporte a nove novas operações:

Problema conhecido:ao transmitir tensores ANEURALNETWORKS_TENSOR_QUANT8_ASYMM para a operação ANEURALNETWORKS_PAD, que está disponível no Android 9 e versões mais recentes, a saída da NNAPI pode não corresponder à saída de frameworks de machine learning de nível mais alto, como o TensorFlow Lite. Transmita apenas ANEURALNETWORKS_TENSOR_FLOAT32 até que o problema seja resolvido.

Além disso, a API também introduz uma nova função, ANeuralNetworksModel_relaxComputationFloat32toFloat16(), que permite especificar se é preciso calcular ANEURALNETWORKS_TENSOR_FLOAT32 com um intervalo e uma precisão tão baixos quanto o do formato de ponto flutuante de 16 bits IEEE 754.

Estrutura de preenchimento automático

O Android 9 apresenta várias melhorias que os serviços de preenchimento automático podem implementar para aprimorar ainda mais a experiência do usuário ao preencher formulários. Para saber mais sobre como usar os recursos de preenchimento automático no seu app, consulte o guia Estrutura de preenchimento automático.

Melhorias na segurança

O Android 9 introduz vários recursos de segurança, resumidos nas seções a seguir:

Confirmação protegida pelo Android

Os dispositivos com suporte que executam o Android 9 ou versões mais recentes permitem que você use a Confirmação protegida pelo Android. Ao usar esse fluxo de trabalho, seu app solicita que o usuário aprove uma breve declaração. Essa declaração permite que o app reafirme que o usuário quer concluir uma transação confidencial, como fazer um pagamento.

Se o usuário aceitar a declaração, o Android Keystore vai receber e armazenar uma assinatura criptográfica protegida por um código de autenticação de mensagens de hash com chave (HMAC, na sigla em inglês). Depois que o Android Keystore confirmar a validade da mensagem, seu app poderá usar a chave gerada pelo trustedConfirmationRequired no ambiente de execução confiável (TEE) para assinar a mensagem que o usuário aceitou. A assinatura indica, com confiança muito alta, que o usuário viu a declaração e concordou com ela.

Atenção: a Confirmação protegida pelo Android não oferece um canal de informações seguro ao usuário. O app não pode presumir nenhuma garantia de confidencialidade além daquelas que a plataforma Android oferece. E, principalmente, não use esse fluxo de trabalho para exibir informações sensíveis que você normalmente não mostraria no dispositivo do usuário.

Para saber como adicionar suporte à Confirmação protegida pelo Android, consulte o guia Confirmação protegida pelo Android.

Caixa de diálogo de autenticação biométrica unificada

No Android 9, o sistema oferece caixas de diálogo de autenticação biométrica em nome do app. Essa funcionalidade cria uma aparência e um posicionamento padronizados para a caixa de diálogo, oferecendo aos usuários mais confiança de que estão fazendo a autenticação usando um verificador de credenciais biométricos confiável.

Se o app usa FingerprintManager para mostrar uma caixa de diálogo de autenticação por impressão digital aos usuários, passe a usar BiometricPrompt. O BiometricPrompt depende do sistema para mostrar a caixa de diálogo de autenticação. O comportamento dela também muda para se adaptar ao tipo de autenticação biométrica escolhida pelo usuário.

Módulo de segurança de hardware

Os dispositivos com suporte que executam o Android 9 ou versões mais recentes podem ter um StrongBox Keymaster, uma implementação da Keymaster HAL que reside em um módulo de segurança de hardware. O módulo contém:

  • a própria CPU;
  • armazenamento seguro;
  • um gerador de números aleatórios real;
  • Outros mecanismos para resistir a violações do pacote e sideload não autorizado de apps.

Ao verificar as chaves armazenadas no StrongBox Keymaster, o sistema confirma a integridade de uma chave com o Ambiente de execução confiável (TEE).

Para saber mais sobre o uso do Strongbox Keymaster, consulte Módulo de segurança de hardware.

Importação de chave segura para o Keystore

O Android 9 oferece maior segurança de descriptografia de chaves, adicionando a capacidade de importar chaves criptografadas com segurança para o Keystore usando um formato de chave codificado em ASN.1. Em seguida, o Keymaster descriptografa as chaves no Keystore para que o conteúdo delas nunca apareça como texto simples na memória do host do dispositivo.

Saiba como importar chaves criptografadas com mais segurança.

Esquema de assinatura do APK com rotação de chaves

O Android 9 adiciona suporte ao APK Signature Scheme v3. Esse esquema tem a opção de incluir um registro de prova de rotação no bloco de assinatura para cada certificado de assinatura. Esse recurso permite que seu app seja assinado com um novo certificado de assinatura vinculando os certificados anteriores do arquivo APK ao que está sendo assinado agora.

Saiba mais sobre como fazer a rotação de chaves usando apksigner.

Opção para permitir a descriptografia de chave apenas em dispositivos desbloqueados

O Android 9 introduz a sinalização unlockedDeviceRequired. Essa opção determina se o Keystore exige que a tela seja desbloqueada antes de permitir a descriptografia de quaisquer dados em trânsito ou armazenados usando a chave especificada. Esses tipos de chaves são adequados para criptografar dados sensíveis e armazenar em disco, como dados corporativos ou de saúde. A flag oferece aos usuários uma garantia maior de que os dados não poderão ser descriptografados enquanto o dispositivo estiver bloqueado, caso o smartphone seja perdido ou roubado.

Para proteger uma chave contra descriptografia enquanto o dispositivo estiver bloqueado, ative a flag transmitindo true para o método setUnlockedDeviceRequired(). Depois de concluir essa etapa, quando a tela do usuário estiver bloqueada, qualquer tentativa de descriptografar ou assinar dados usando essa chave vai falhar. Um dispositivo bloqueado exige um PIN, uma senha, uma impressão digital ou outro fator confiável antes de ser acessado.

Suporte à criptografia legada

Os dispositivos Android 9 que vêm com o Keymaster 4 têm suporte ao algoritmo triplo de criptografia de dados, ou Triple DES. Se o app interopera com sistemas legados que exigem o Triple DES, use esse tipo de cifra ao criptografar credenciais confidenciais.

Para saber mais sobre como aumentar a segurança do seu app, consulte Segurança para desenvolvedores Android.

Descontinuação da WPS

O uso do Wi-Fi Protected Setup (WPS) foi descontinuado por motivos de segurança.

Backups do Android

O Android 9 adiciona novas funcionalidades e opções do desenvolvedor relacionadas a backup e restauração. Os detalhes sobre essas mudanças aparecem nas seções a seguir.

Backups de criptografia do lado do cliente

O Android 9 adiciona suporte à criptografia de backups do Android com uma chave secreta do lado do cliente. Esse suporte é ativado automaticamente quando as seguintes condições são atendidas:

Quando essa medida de privacidade está ativada, o PIN, o padrão ou a senha do dispositivo é necessário para restaurar dados dos backups feitos pelo dispositivo do usuário. Para saber mais sobre a tecnologia por trás desse recurso, consulte o artigo Serviço do Google Cloud Key Vault.

Definir as condições do dispositivo necessárias para backup

Se os dados do app incluem preferências ou informações sensíveis, o Android 9 permite definir as condições do dispositivo em que os dados do app são incluídos no backup do usuário, por exemplo, quando a criptografia do lado do cliente está ativada ou uma transferência local de um dispositivo para outro está ocorrendo.

Para saber mais sobre como fazer backup de dados em dispositivos Android, consulte Visão geral do backup de dados.

Acessibilidade

O Android 9 apresenta melhorias no framework de acessibilidade que facilitam o fornecimento de experiências ainda melhores aos usuários do seu app.

Semântica de navegação

Os atributos adicionados no Android 9 facilitam a definição de como os serviços de acessibilidade, especialmente leitores de tela, navegam de uma parte da tela para outra. Esses atributos podem ajudar usuários com deficiência visual a navegar rapidamente pelo texto na interface do app e permitir que eles façam uma seleção.

Por exemplo, em um app de compras, um leitor de tela pode ajudar os usuários a navegar diretamente de uma categoria de ofertas para a próxima, sem que ele precise ler todos os itens de uma categoria antes de passar para a próxima.

Títulos do painel de acessibilidade

No Android 8.1 (API de nível 27) e versões anteriores, os serviços de acessibilidade nem sempre podem determinar quando um painel específico da tela foi atualizado, por exemplo, quando uma atividade substitui um fragmento por outro fragmento. Os painéis consistem em elementos de interface agrupados logicamente e relacionados visualmente que normalmente compõem um fragmento.

No Android 9, você pode fornecer títulos de painéis de acessibilidade ou títulos identificáveis individualmente para esses painéis. Se um painel tiver um título de painel de acessibilidade, os serviços de acessibilidade receberão informações mais detalhadas quando o painel for modificado. Esse recurso permite que os serviços forneçam informações mais detalhadas ao usuário sobre o que mudou na interface.

Para especificar o título de um painel, use o atributo android:accessibilityPaneTitle. Também é possível atualizar o título de um painel de interface que é substituído durante a execução usando setAccessibilityPaneTitle(). Por exemplo, você pode fornecer um título para a área de conteúdo de um objeto Fragment.

Navegação baseada em cabeçalhos

Se o app mostrar conteúdo textual que inclui títulos lógicos, defina o atributo android:accessibilityHeading como true para as instâncias de View que representam esses títulos. Ao adicionar esses cabeçalhos, você permite que os serviços de acessibilidade ajudem os usuários a navegar diretamente de um cabeçalho para o próximo. Qualquer serviço de acessibilidade pode usar esse recurso para melhorar a experiência de navegação da IU dos usuários.

Navegação e saída de grupos

Tradicionalmente, os leitores de tela usam o atributo android:focusable para determinar quando ler um ViewGroup ou uma coleção de objetos View como uma única unidade. Dessa forma, os usuários poderiam entender que as visualizações estavam logicamente relacionadas entre si.

No Android 8.1 e versões anteriores, é necessário marcar cada objeto View dentro de uma ViewGroup como não focalizável e a própria ViewGroup como focalizável. Essa organização fazia com que algumas instâncias de View fossem marcadas como focalizáveis, de modo que tornava a navegação pelo teclado mais complicada.

A partir do Android 9, você pode usar o atributo android:screenReaderFocusable no lugar do atributo android:focusable em situações em que tornar um objeto View focalizável tem consequências indesejáveis. Os leitores de tela colocam o foco em todos os elementos que definiram android:screenReaderFocusable ou android:focusable como true.

Ações de conveniência

O Android 9 adiciona suporte para realizar ações de conveniência em nome dos usuários:

Interação com dicas
Recursos adicionados ao framework de acessibilidade oferecem acesso a dicas na interface de um app. Use getTooltipText() para ler o texto de uma dica e use ACTION_SHOW_TOOLTIP e ACTION_HIDE_TOOLTIP para instruir instâncias de View a mostrar ou ocultar as dicas.
Ações globais adicionadas
O Android 9 introduz o suporte a duas outras ações do dispositivo na classe AccessibilityService. Seu serviço pode ajudar os usuários a bloquear os dispositivos e fazer capturas de tela usando as ações GLOBAL_ACTION_LOCK_SCREEN e GLOBAL_ACTION_TAKE_SCREENSHOT, respectivamente.

Detalhes de mudança de janela

O Android 9 facilita o rastreamento de atualizações nas janelas de um app quando um app redesenha várias janelas simultaneamente. Quando um evento TYPE_WINDOWS_CHANGED ocorrer, use a API getWindowChanges() para determinar como as janelas foram modificadas. Durante uma atualização de várias janelas, cada janela produz o próprio conjunto de eventos. O método getSource() retorna a visualização raiz da janela associada a cada evento.

Se um app tiver definido títulos do painel de acessibilidade para os objetos View, o serviço poderá reconhecer quando a interface do app for atualizada. Quando um evento TYPE_WINDOW_STATE_CHANGED ocorrer, use os tipos retornados por getContentChangeTypes() para determinar como a janela foi modificada. Por exemplo, o framework pode detectar quando um painel tem um novo título ou quando ele desaparece.

Rotação

Para eliminar rotações acidentais, adicionamos um modo que fixa a orientação atual, mesmo que a posição do dispositivo mude. Os usuários podem acionar a rotação manualmente quando necessário pressionando um botão na barra do sistema.

Na maioria dos casos, os impactos de compatibilidade nos aplicativos são mínimos. No entanto, se o app tiver qualquer comportamento de rotação personalizado ou usar configurações de orientação de tela incomuns, é possível que você encontre problemas que teriam passado despercebidos quando a preferência de rotação do usuário sempre estava definida como retrato. Recomendamos que você analise o comportamento de rotação em todas as atividades principais do app e verifique se todas as configurações de orientação da tela ainda estão fornecendo a experiência ideal.

Para mais detalhes, consulte as mudanças de comportamento associadas.

Dispositivo móvel mostrando o novo modo de rotação, permitindo que os usuários acionem a rotação manualmente

Um novo modo de rotação permite que os usuários acionem a rotação manualmente quando necessário usando um botão na barra do sistema.

Texto

O Android 9 traz os seguintes recursos relacionados a texto para a plataforma:

  • Texto pré-computado: a classe PrecomputedText melhora o desempenho de renderização de texto, permitindo que você calcule e armazene em cache as informações necessárias antecipadamente. Ela também permite que o app execute o layout de texto fora da linha de execução principal.

  • Lupa: a classe Magnifier é um widget de plataforma que fornece uma API de lupa, permitindo uma experiência consistente do recurso de lupa em todos os apps.

  • Smart Linkify: o Android 9 melhora a classe TextClassifier, que usa o aprendizado de máquina para identificar algumas entidades no texto selecionado e sugerir ações. Por exemplo, TextClassifier pode permitir que o app detecte que o usuário selecionou um número de telefone. O app pode sugerir que o usuário faça uma ligação usando esse número. Os recursos em TextClassifier substituem a funcionalidade da classe Linkify.

  • Layout de texto: vários métodos e atributos convenientes facilitam a implementação do design da interface. Para mais detalhes, consulte a documentação de referência para TextView.

Conversão ART antecipada de arquivos DEX

Em dispositivos com o Android 9 ou versões mais recentes, o compilador antecipado do Android Runtime (ART) otimiza ainda mais os arquivos compactados no formato Dalvik Executable (DEX) convertendo os arquivos DEX de um pacote de apps em uma representação mais compacta. Essa mudança permite que o app seja iniciado mais rapidamente e consuma menos espaço em disco e em RAM.

Essa melhoria beneficia especialmente dispositivos de baixo custo, com velocidades de E/S de disco mais lentas.

Rastreamento do sistema no dispositivo

O Android 9 permite gravar rastros do sistema no dispositivo e compartilhar um relatório dessas gravações com sua equipe de desenvolvimento. Esse relatório oferece suporte a vários formatos, incluindo HTML.

Ao coletar esses rastros, você pode capturar dados de tempo relacionados aos processos e linhas de execução do seu app e visualizar outros tipos de estados de dispositivo com relevância global.

Para saber mais sobre essa ferramenta, consulte Executar o rastreamento do sistema no dispositivo.