Save the date! Android Dev Summit is coming to Sunnyvale, CA on Oct 23-24, 2019.

Recursos e APIs do Android 9

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

Para saber mais sobre as novas APIs, leia o Relatório diferencial da API ou acesse a Referência da API do Android. Não deixe também de conferir Mudanças de comportamento do Android 9 para conhecer as áreas em que as mudanças da plataforma podem afetar seus aplicativos.

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 Wi-Fi IEEE 802.11mc, também conhecido como Wi-Fi Round-Trip-Time (RTT ou tempo de ida e volta). Esse protocolo permite que os aplicativos usem o posicionamento em ambiente interno.

Em dispositivos executando o Android 9 com suporte a hardware, os aplicativos podem usar as APIs de RTT para medir a distância até pontos de acesso (APs) Wi-Fi próximos com capacidade para RTT. O dispositivo deve ter os serviços de localização e de Wi-Fi ativados (em Settings > Location), e o aplicativo deve ter a permissão ACCESS_FINE_LOCATION . O dispositivo não precisa se conectar aos pontos de acesso para usar RTT. Para manter a privacidade, somente o telefone pode determinar a distância até o ponto de acesso; os pontos de acesso não têm essa informação.

Se seu dispositivo medir a distância até 3 ou mais pontos de acesso, você poderá 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ê consegue criar novas experiências, como navegação dentro de edifícios e serviços baseados em localização precisa, como controle de voz sem ambiguidades (por exemplo, "acenda esta luz") e informações baseadas em localização (como "este produto tem ofertas especiais?").

Suporte a recorte de tela

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

Testando corte de tela usando um emulador

O Android 9 oferece suporte às telas ponta a ponta mais recentes que contêm cortes de tela para câmeras e alto-falantes. A classe DisplayCutout permite que você descubra o local e a forma das áreas não funcionais onde o conteúdo não deve 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 o aplicativo disponha o conteúdo em volta dos cortes de um dispositivo. Você pode 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 de desenvolvedor.
  2. Na tela Developer options, role para baixo até a seção Drawing e selecione Simulate a display with a cutout.
  3. Selecione o tamanho do corte.

Observação: recomendamos testar a exibição do conteúdo em torno da área de corte usando um dispositivo ou emulador que execute o Android 9.

Notificações

O Android 9 introduz diversos aprimoramentos nas notificações. Todos esses aprimoramentos estão disponíveis para os desenvolvedores que usam o nível de API 28 ou mais recente.

Notificações de mensagem

MessagingStyle com foto anexada.

Notificação de mensagem

MessagingStyle com respostas e conversa.

Experiência de mensagem aprimorada

A partir do Android 7.0 (nível de API 24), você pode adicionar uma ação para responder a mensagens ou inserir outros textos diretamente de uma notificação. O Android 9 aprimora esse recurso da seguinte maneira:

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

  • Suporte para imagens: Agora, o Android 9 mostra imagens na seção Notificações de Mensagens de telefones. Você pode usar setData() na mensagem para exibir uma imagem. O snippet de código a seguir demonstra como criar uma Person e uma mensagem que contém 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 aplicativo pode recuperar o EXTRA_REMOTE_INPUT_DRAFT enviado pelo sistema quando um usuário acidentalmente fecha uma notificação de mensagem. Você pode usar esse recurso para pré-preencher campos de texto no aplicativo para que os usuários possam terminar as respostas.

  • Identificar se uma conversa é de grupo: Você pode usar setGroupConversation() para identificar uma conversa como sendo de grupo ou não.

  • Definir a ação semântica de um intent: O método setSemanticAction() permite que você dê um significado semântico para uma ação, como "marcar como lido", "excluir", "responder" e assim por diante.

  • SmartReply: O Android 9 oferece suporte às mesmas respostas sugeridas disponíveis no aplicativo de mensagens. Use RemoteInput.setChoices() para fornecer uma gama de respostas padrão para o usuário.

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

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

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

    Além disso, o aplicativo 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 aplicativo ao qual o canal ou grupo bloqueado pertence pode escutar esses intents e reagir da maneira apropriada. Para saber mais sobre essas ações de intent e recursos adicionais, consulte a lista de constantes atualizada na referência do NotificationManager . Para saber mais sobre como reagir a intents de transmissão, consulte Transmissões.

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

  • Além disso, NotificationManager.Policy tem sete novas constantes "Não perturbe" que você pode usar para suprimir interrupções visuais:

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

Em dispositivos que executam o Android 9, você pode acessar simultaneamente o fluxo 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, desfoque e visão estéreo integrados. A API também permite chamar um fluxo de uma câmera lógica ou combinada que alterna automaticamente entre duas ou mais câmeras.

Outros aprimoramentos na câmera incluem parâmetros de sessão adicionais que ajudam a reduzir atrasos durante a captura inicial, bem como compartilhamento de superfície que permite que clientes da câmera processem vários casos de uso sem necessidade de parar e reiniciar o streaming da câmera. Além disso, adicionamos APIs para suporte ao flash baseado na tela e acesso a carimbos de data/hora OIS para estabilização de imagem e efeitos especiais no aplicativo.

No Android 9, a API multicâmera oferece suporte a câmeras monocromáticas para dispositivos com os recursos FULL ou LIMITED. A saída monocromática é realizada 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 compatíveis.

ImageDecoder para drawables e bitmaps

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

O ImageDecoder permite que você crie um Drawable ou um Bitmap a partir de um buffer de bytes, um arquivo ou uma URI. Para decodificar uma imagem, primeiro faça uma chamada a createSource() com a origem da imagem codificada. Em seguida, faça uma chamada a decodeDrawable() ou decodeBitmap() passando o objeto ImageDecoder.Source para criar um Drawable] ou um Bitmap. para alterar as configurações padrão, passe OnHeaderDecodedListener para decodeDrawable() ou decodeBitmap(). O ImageDecoder faz chamada a onHeaderDecoded() com a largura e a altura padrão da imagem quando esses valores forem conhecidos. 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, passe as dimensões de destino em setTargetSize(). Também é possível dimensionar imagens usando um tamanho de exemplo. Passe o tamanho do exemplo diretamente a setTargetSampleSize().
  • Para cortar uma imagem dimensionada no limite, faça uma chamada a setCrop().
  • Para criar um bitmap mutável, passe true em setMutableRequired().

O ImageDecoder também permite que você adicione efeitos personalizados e complicados a uma imagem, como bordas arredondadas ou máscaras de círculo. Use setPostProcessor() com uma instância da classe PostProcessor para executar os comandos de desenho desejados.

Observação: quando você executa um pós-processamento de um AnimatedImageDrawable, os efeitos aparecem em todos os quadros da animação.

Animação

O Android 9 introduz a classe AnimatedImageDrawable para desenhar e exibir imagens animadas GIF e WebP. AnimatedImageDrawable trabalha de forma semelhante a AnimatedVectorDrawable, na medida em que o thread de renderização controla as animações de AnimatedImageDrawable. O thread de leitura usa um thread de worker para a decodificação. Assim, a decodificação não interfere com outras operações no thread de renderização. Essa implementação permite que o aplicativo exiba uma imagem animada sem gerenciar suas atualizações ou interferir com outros eventos do thread de IU do aplicativo.

Um AnimatedImageDrawable pode ser decodificado usando uma instância de ImageDecoder. O snippet de código a seguir mostra como usar o ImageDecoder para decodificar o 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 diversos métodos que permitem que você faça mais modificações na imagem. Por exemplo, é possível usar o método setPostProcessor() para modificar a aparência da imagem (por exemplo, aplicando uma máscara de círculo ou arredondando os cantos).

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

O Android 9 adiciona suporte integrado ao perfil 2 do VP9 de Alto Alcance Dinâmico (HDR), o que permite usar YouTube, Play Movies e outras origens para distribuir vídeos em HDR a usuários com dispositivos compatíveis com HDR.

O Android 9 adiciona suporte para a codificação de imagens HEIF (heic) à plataforma. Exemplos de imagens estáticas HEIF têm suporte nas classes MediaMuxer e MediaExtractor em que o HEIF melhora a compactação para reduzir o tamanho dos dados armazenados e transmitidos pela rede. Com suporte de plataforma nos dispositivos Android 9, fica fácil enviar e utilizar imagens HEIF em um servidor de back-end. Depois de confirmar que o aplicativo é compatível com esse formato de dados para compartilhamento e exibição, experimente o HEIF como formato de armazenamento de imagens do aplicativo. Você pode converter de jpeg para heic usando o ImageDecoder ou o BitmapFactory para transformar um jpeg em bitmap. Também é possível usar o HeifWriter para gravar imagens estáticas HEIF presentes em buffers de bytes YUV, no Surface ou no Bitmap.

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

O Android 9 adiciona métodos à classe MediaDRM para obter métricas, níveis de HDCP , níveis de segurança e 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 diferencial da API para obter detalhes.

No Android 9, a API AAudio inclui atributos AAudioStream para uso, tipo de conteúdo e predefinição de entrada. Usando esses atributos, você pode criar streams ajustados para aplicativos de VoIP ou câmeras de vídeo. Também é possível definir o SessionID para associar um stream AAudio a uma submixagem que pode incluir efeitos. Use a AudioEffect API para controlar os efeitos.

O Android 9 inclui uma AudioEffect API para DynamicsProcessing. Com essa classe, você pode criar efeitos de áudio baseados em canal, compostos por várias etapas de vários tipos, incluindo equalização, compressão multibanda e limitador. O número de bandas e de etapas ativas é configurável, e a maioria dos parâmetros pode ser controlada em tempo real.

Sensibilidade a custo de dados no JobScheduler

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

As vagas podem declarar o tamanho de dados estimado, a recuperação antecipada de sinais 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 volumosas. Em uma rede ilimitada, o JobScheduler pode executar jobs de recuperação antecipada para aprimorar a experiência do usuário (por exemplo, recuperação antecipada de manchetes).

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

Neural Networks API 1.1

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

Problema conhecido: Ao passar tensores ANEURALNETWORKS_TENSOR_QUANT8_ASYMM para a operação ANEURALNETWORKS_PAD, disponível no Android 9 ou mais recente, a saída da NNAPI pode não corresponder à saída de bibliotecas de aprendizado de máquina de nível mais alto, como TensorFlow Lite. Em vez disso, passe apenas ANEURALNETWORKS_TENSOR_FLOAT32 até que o problema seja resolvido.

Além disso, a API também introduziu uma nova função, ANeuralNetworksModel_relaxComputationFloat32toFloat16(), que permite especificar se ANEURALNETWORKS_TENSOR_FLOAT32 deve ser calculado com um intervalo e uma precisão baixos, como no formato de ponto flutuante de 16 bits IEEE 754.

Biblioteca de preenchimento automático

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

Melhorias na segurança

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

Android Protected Confirmation

Dispositivos compatíveis que executam o Android 9 ou versões posteriores oferecem o recurso de usar a Android Protected Confirmation. Ao usar esse fluxo de trabalho, o aplicativo solicita que o usuário aprove uma breve declaração. Essa declaração permite ao aplicativo reafirmar que o usuário quer realizar uma transação confidencial, como fazer um pagamento.

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

Atenção: A Android Protected Confirmation não oferece um canal de informações seguro ao usuário. O aplicativo não pode assumir garantias de confidencialidade além das que a plataforma Android oferece. E, principalmente, não use esse fluxo de trabalho para exibir informações confidenciais que você normalmente não exibiria no dispositivo do usuário.

Para obter orientação sobre como adicionar o suporte à Android Protected Confirmation, consulte o guia Android Protected Confirmation .

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 aplicativo. Esse recurso cria um aspecto visual e um posicionamento padronizados para a caixa de diálogo, dando aos usuários mais confiança de que estão autenticando com um verificador de credenciais biométricas seguro.

Se o aplicativo usa FingerprintManager para exibir uma caixa de diálogo de autenticação de impressões digitais aos usuários, altere-o para usar BiometricPrompt . BiometricPrompt depende do sistema para exibir a caixa de diálogo de autenticação. Além disso, altera seu comportamento para adaptar-se ao tipo de autenticação biométrica escolhida pelo usuário.

Observação: Antes de usar BiometricPrompt no aplicativo, use o método hasSystemFeature() para garantir que o dispositivo oferece suporte a FEATURE_FINGERPRINT, FEATURE_IRIS ou FEATURE_FACE. Se o dispositivo não for compatível com autenticação biométrica, você poderá voltar a verificar o PIN, o padrão ou a senha do usuário usando o método createConfirmDeviceCredentialIntent() .

Módulo de segurança de hardware

Dispositivos compatíveis com o Android 9 instalado (ou versões posteriores) podem ter uma StrongBox Keymaster, uma implementação da Keymaster HAL que reside em um módulo de segurança de hardware. O módulo contém:

  • Sua própria CPU.
  • Armazenamento seguro.
  • Um gerador de números aleatórios real.
  • Mecanismos adicionais para resistir a violações do pacote e carga não autorizada de aplicativos.

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

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

Importação segura de chaves no Keystore

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

Observação: esse recurso é compatível apenas com dispositivos fornecidos com o Keymaster 4 ou versões posteriores.

Saiba mais sobre como importar chaves criptografadas com mais segurança.

Esquema de assinatura de APK com rodízio 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. Isso permite que o seu aplicativo seja assinado com um novo certificado de assinatura por meio do vínculo dos certificados antigos do arquivo APK ao que está sendo assinado agora.

Observação: Dispositivos que executam o Android 8.1 (nível de API 27) ou anteriores não oferecem suporte à alteração de certificados de assinatura. Se a minSdkVersion do aplicativo for 27 ou menor, além da nova assinatura, use um certificado de assinatura antigo para assinar o aplicativo.

Saiba mais sobre como fazer rodízio de chaves usando apksigner.

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

O Android 9 introduz o sinalizador unlockedDeviceRequired. Essa opção determina se o Keystore exige que a tela esteja desbloqueada antes de permitir a descriptografia de quaisquer dados ativos ou armazenados usando a chave especificada. Esses tipos de chave são adequados à criptografia de dados confidenciais para armazenamento em disco, como dados de saúde ou empresariais. O sinalizador oferece aos usuários uma maior garantia de que os dados não poderão ser descriptografados enquanto o dispositivo estiver bloqueado, em caso de perda ou roubo do telefone.

Observação: Quando o sinalizador unlockedDeviceRequired está ativado, a criptografia e a verificação de assinatura podem ocorrer a qualquer momento. O indicador impede apenas a descriptografia de dados quando o dispositivo está desbloqueado.

Para evitar que uma chave seja descriptografada enquanto o dispositivo está bloqueado, ative o sinalizador passando true para o método setUnlockedDeviceRequired() . Após concluir essa etapa, quando a tela do usuário estiver bloqueada, qualquer tentativa de descriptografar ou assinar dados usando essa chave 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 fornecidos com o Keymaster 4 oferecem suporte a algoritmo triplo de criptografia de dados, ou Triple DES. Se o seu aplicativo usa a interoperabilidade com sistemas legados que exigem o Triple DES, use esse tipo de cifra para criptografar credenciais confidenciais.

Para saber mais sobre como aumentar a segurança de um aplicativo, consulte Segurança para o desenvolvedor Android.

Backups do Android

O Android 9 adiciona novas funcionalidades e opções de desenvolvedor relacionadas ao backup e à restauração. Os detalhes dessas alterações estão nas seções a seguir.

Backups com criptografia do lado do cliente

O Android 9 adiciona suporte à criptografia de backups do Android com um segredo do lado do cliente. Esse suporte será ativado automaticamente quando as seguintes condições forem atendidas:

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

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

Se os dados do aplicativo incluem informações ou preferências confidenciais, o Android 9 permite definir as condições do dispositivo que devem ser cumpridas para que os dados do aplicativo sejam incluídos no backup do usuário, como quando a criptografia do lado do cliente está ativada ou uma transferência local entre dispositivos está ocorrendo.

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

Acessibilidade

O Android 9 introduz aprimoramentos na biblioteca de acessibilidade que facilitam o fornecimento de experiências ainda melhores para os usuários do seu aplicativo.

Semântica de navegação

Os atributos adicionados ao Android 9 facilitam a definição de como serviços de acessibilidade, particularmente leitores de tela, navegam de uma parte da tela para a outra. Esses atributos podem ajudar usuários com deficiências visuais a percorrerem rapidamente o texto da IU dos seus aplicativos e fazer uma seleção.

Por exemplo, em um aplicativo 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 o leitor de tela precise ler todos os itens de uma categoria antes de mudar para a próxima.

Títulos de painel de acessibilidade

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

No Android 9, você pode informar 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 alterado. Esse recurso permite que os serviços forneçam informações mais detalhadas ao usuário sobre o que foi alterado na IU.

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 IU substituído em tempo de 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 aplicativo exibir conteúdo textual que inclui cabeçalhos lógicos, defina o atributo android:accessibilityHeading como true para as instâncias de View que representam esses cabeçalhos. Com a adição desses cabeçalhos, você possibilita 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 aprimorar a experiência de navegação de IU do usuário.

Navegação de grupo e saída

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

No Android 8.1 e versões anteriores, é necessário marcar cada objeto View em um ViewGroup como não focável e o próprio ViewGroup como focável. Isso fazia com que algumas instâncias de View fossem marcadas como focáveis, dificultando a navegação pelo teclado.

A partir do Android 9, você pode usar o atributo android:screenReaderFocusable em vez do atributo android:focusable em situações em que tornar um objeto View focável apresenta 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 de ferramentas
novos recursos na biblioteca de acessibilidade oferecem acesso a dicas de ferramentas na IU de um aplicativo. Use getTooltipText() para ler o texto de uma dica de ferramenta e use ACTION_SHOW_TOOLTIP e ACTION_HIDE_TOOLTIP para instruir as instâncias de View a mostrar ou ocultar as dicas de ferramentas.
Ações globais adicionadas
o Android 9 introduz o suporte a duas ações de dispositivo adicionais na classe AccessibilityService. Seu serviço pode ajudar os usuários a bloquear seus dispositivos e capturar telas usando as ações GLOBAL_ACTION_LOCK_SCREEN e GLOBAL_ACTION_TAKE_SCREENSHOT , respectivamente.

Detalhes sobre mudanças em janelas

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

Se um aplicativo tiver definido títulos de painel de acessibilidade para seus objetos View, seu serviço poderá reconhecer quando a IU do aplicativo for atualizada. Quando um evento TYPE_WINDOW_STATE_CHANGED ocorrer, use os tipos retornados por getContentChangeTypes() para determinar o que foi alterado na janela. Por exemplo, a biblioteca pode detectar quando um painel tem um novo título ou desaparece.

Rotação

Para eliminar rotações acidentais, adicionamos um modo que fixa a orientação atual, mesmo se a posição do dispositivo mudar. 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. Entretanto, se seu aplicativo tiver qualquer comportamento de rotação personalizado ou se usar configurações de orientação de tela incomuns, você poderá ter problemas que talvez não tenham sido notados quando a preferência de rotação do usuário era sempre definida como retrato. Não deixe de examinar o comportamento de rotação em todas as atividades principais do seu aplicativo para garantir que as configurações de orientação de tela ainda estejam proporcionando a melhor experiência possível.

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

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é-calculado: A classe PrecomputedText aprimora o desempenho da renderização de texto, permitindo que você calcule e armazene em cache antecipadamente as informações necessárias. Além disso, a classe permite que o aplicativo execute a disposição de texto fora do thread principal.

  • Ampliador: A classe Magnifier é um widget de plataforma que oferece uma API de ampliador, o que permite oferecer uma experiência consistente de recurso de ampliação em todos os aplicativos.

  • Linkify inteligente: O Android 9 aprimora a classe TextClassifier, que usa aprendizado de máquina para identificar algumas entidades em um texto selecionado e sugerir ações. Por exemplo, TextClassifier pode permitir que o aplicativo detecte que o usuário selecionou um número de telefone. Dessa forma, o aplicativo pode sugerir que o usuário faça uma chamada telefônica usando esse número. Os recursos de TextClassifier substituem a funcionalidade da classe Linkify.

  • Layout de texto: Vários métodos e atributos convenientes facilitam a implementação do projeto de IU. Para obter detalhes, consulte a documentação de referência de TextView.

Conversão ART antecipada de arquivos DEX

Em dispositivos que executam o Android 9 ou versões posteriores, o compilador antecipado do tempo de execução do Android (ART) otimiza ainda mais arquivos compactados no formato Dalvik Executable (DEX), convertendo-os em um pacote de aplicativo com uma representação mais compacta. Essa alteração permite que o aplicativo inicie mais rapidamente e consuma menos espaço em disco e em RAM.

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

Rastreamento de sistema no dispositivo

O Android 9 permite registrar rastreamento do sistema no dispositivo e compartilhar um relatório desses registros com a equipe de desenvolvimento. Esse relatório oferece suporte a vários formatos, incluindo HTML.

A coleta desses rastreamentos permite capturar dados de tempo relacionados aos processos e threads do aplicativo, bem como visualizar outros tipos de estados de dispositivo com relevância global.

Observação: Não é necessário instrumentar o código para registrar rastreamentos. No entanto, essa instrumentação pode ajudar a ver quais partes do código do aplicativo podem estar contribuindo com o travamento de threads ou a instabilidade da IU.

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