O Android 9 (API nível 28) introduz ótimos 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 entre APIs ou acesse a Referência da API Android. Confira também as mudanças de comportamento do Android 9 para saber mais sobre as áreas em que as mudanças na plataforma podem afetar seus apps.
Posicionamento em ambientes internos com Wi-Fi RTT

O Android 9 adiciona suporte da plataforma ao protocolo IEEE 802.11-2016 Wi-Fi, também conhecido como tempo de retorno (RTT) do Wi-Fi, para que você possa aproveitar o posicionamento em ambientes internos nos seus apps.
Em dispositivos com o Android 9 e suporte de hardware, seus apps podem usar as APIs RTT para medir a distância dos pontos de acesso (APs) Wi-Fi próximos e compatíveis com RTT. O dispositivo precisa ter os serviços de localização ativados e a busca por Wi-Fi ativada (em Configurações > Localização), e seu 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 medir a distância de até três ou mais pontos de acesso, será 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, é possível criar novas experiências, como navegação em edifícios e serviços aprimorados baseados na localização, como controle de voz sem ambiguidades (por exemplo, "acenda esta luz") e informações baseadas na localização (por exemplo, "este produto tem ofertas especiais?").
Confira a API WiFi RTT em uso no app de demonstração Android WifiRttScan.
Para mais informações, consulte Localização de Wi-Fi: alcance com RTT.
Compatibilidade com corte de tela

Testar o corte da tela usando o 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 a localização e o formato das áreas não funcionais em que
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 app organize o conteúdo em torno dos cortes de um dispositivo. Você pode definir esse atributo como um dos seguintes valores:
LAYOUT_IN_DISPLAY_CUTOUT_MODE_DEFAULT
LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES
LAYOUT_IN_DISPLAY_CUTOUT_MODE_NEVER
Você pode simular um corte de tela em qualquer dispositivo ou emulador com o Android 9 da seguinte maneira:
- Ative as opções do desenvolvedor.
- Na tela Opções do desenvolvedor, role para baixo até a seção Desenho e selecione Simular uma tela com corte.
- Selecione o tamanho do corte.
Notificações
O Android 9 apresenta várias melhorias nas notificações, todas disponíveis para desenvolvedores que segmentam o nível 28 da API e versões mais recentes.

MessagingStyle com foto anexada.

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.
Experiência de mensagens aprimorada
A partir do Android 7.0 (API de nível 24), é possível adicionar uma ação para responder mensagens ou inserir outros textos diretamente de uma notificação. O Android 9 melhora 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 avatars e URIs delas. Muitas outras APIs, comoaddMessage()
, agora usam a classePerson
em vez de umCharSequence
. A classePerson
também é compatível com o padrão de projeto Builder.Suporte a 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 umPerson
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: seu app pode recuperar o
EXTRA_REMOTE_INPUT_DRAFT
enviado pelo sistema quando um usuário fecha uma notificação de mensagens por engano. Você pode usar esse extra para preencher previamente os campos de texto no app para que os usuários concluam a resposta.Identificar se uma conversa é em grupo: use
setGroupConversation()
para identificar uma conversa como 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. Use o método
isBlocked()
para identificar quando um grupo é bloqueado e, como resultado, não enviar nenhuma notificação para os canais desse grupo.Além disso, o app pode consultar as configurações atuais do grupo de canais usando o novo método
getNotificationChannelGroup()
.Novos tipos de intents de transmissão: agora o sistema Android envia intents de transmissão quando o estado de bloqueio dos canais de notificação e dos 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 e extras de intent, consulte a lista de constantes atualizada na referência do
NotificationManager
. Para informações sobre como reagir a intents de transmissão, consulte Transmissões.O
NotificationManager.Policy
tem três novas categorias de prioridade do modo Não perturbe:PRIORITY_CATEGORY_ALARMS
prioriza alarmes.PRIORITY_CATEGORY_MEDIA
prioriza sons de fontes de mídia, como mídia e navegação por voz.- O
PRIORITY_CATEGORY_SYSTEM
prioriza os sons do sistema.
NotificationManager.Policy
também tem sete novas constantes do modo "Não perturbe" que você pode usar para suprimir interrupções visuais:SUPPRESSED_EFFECT_FULL_SCREEN_INTENT
impede que a notificação inicie uma atividade em tela cheia.SUPPRESSED_EFFECT_LIGHTS
bloqueia as luzes de notificação.SUPPRESSED_EFFECT_PEEK
impede que as notificações deslizem brevemente para a visualização ("espiando").SUPPRESSED_EFFECT_STATUS_BAR
impede que as notificações apareçam na barra de status em dispositivos compatíveis com ela.SUPPRESSED_EFFECT_BADGE
bloqueia selos em dispositivos que oferecem suporte a eles. Para mais informações, consulte Modificar um ícone de notificação.- O
SUPPRESSED_EFFECT_AMBIENT
bloqueia notificações em dispositivos compatíveis com telas ambiente. SUPPRESSED_EFFECT_NOTIFICATION_LIST
impede que as notificações apareçam na visualização em lista em dispositivos que oferecem suporte a esse recurso, como a tela de bloqueio ou a tela de notificações.
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, é possível criar recursos inovadores que não seriam possíveis com apenas uma câmera, como zoom contínuo, bokeh e visão estéreo. A API também permite chamar um fluxo de câmera lógica ou combinada que alterna automaticamente entre duas ou mais câmeras.
Outras melhorias na câmera incluem mais 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 nível do app.
No Android 9, a API de várias câmeras é compatível com câmeras monocromáticas para dispositivos com capacidade FULL
ou LIMITED
.
A saída monocromática é alcançada usando o formato
YUV_420_888
com Y como escala de cinza, U (Cb) como 128 e V (Cr) como 128.
O Android 9 também permite o 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 decodificar imagens. Use essa classe em vez das APIs BitmapFactory
e BitmapFactory.Options
.
Com ImageDecoder
, é possível criar um
Drawable
ou um
Bitmap
de 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 um 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, assim que elas são conhecidas.
Se a imagem codificada for um GIF ou WebP animado, decodeDrawable()
vai 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 parasetTargetSampleSize()
. - Para cortar uma imagem dentro do intervalo da imagem dimensionada, chame
setCrop()
. - Para criar um bitmap mutável, transmita
true
parasetMutableRequired()
.
Com o ImageDecoder
, também é possível adicionar efeitos personalizados e complicados a uma imagem, como cantos arredondados ou máscaras circulares. Use
setPostProcessor()
com uma instância da classe
PostProcessor
para executar os comandos de desenho que você quiser.
Animação
O Android 9 apresenta a classe
AnimatedImageDrawable
para desenhar e mostrar imagens animadas em GIF e WebP.
O AnimatedImageDrawable
funciona de maneira semelhante ao
AnimatedVectorDrawable
porque a linha de execução de renderização impulsiona as animações de AnimatedImageDrawable
.
A linha de execução de renderização também usa uma linha de execução de trabalho para decodificar, para que a decodificação não
interfira 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 ou
interferir em outros eventos na linha de execução da UI do app.
Uma AnimatedImageDrawable
pode ser decodificada usando uma instância de
ImageDecoder
. O snippet de código a seguir 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, é possível usar o método
setPostProcessor()
para modificar a aparência da imagem, como aplicar uma máscara circular ou
cantos arredondados.
Vídeo HDR VP9, compactação de imagens HEIF e APIs de mídia
O Android 9 oferece suporte integrado para High Dynamic Range (HDR) VP9 Perfil 2, assim você pode oferecer filmes em HDR aos seus usuários no YouTube, Play Filmes e outras fontes em dispositivos compatíveis com HDR.
O Android 9 também adiciona suporte para 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 uso de espaço de armazenamento e dados de rede. As amostras de imagens estáticas HEIF são compatíveis com as classes
MediaMuxer
e MediaExtractor
. Com o suporte da 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 formato de armazenamento de imagens no app. Você pode fazer uma conversão de jpeg para heic usando ImageDecoder
ou BitmapFactory
(que obtém um bitmap de um arquivo JPEG). Em seguida, use
HeifWriter
para gravar imagens
estáticas HEIF de buffers de bytes 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 apresenta métodos para a classe
MediaDRM
para receber métricas, níveis de HDCP
e de segurança, além do número de sessões, e para adicionar mais controle sobre
níveis de segurança e paradas seguras. Consulte o relatório de diferenças da API para mais detalhes.
No Android 9, a API AAudio adiciona
suporte a vários atributos AAudioStream, incluindo uso, tipo de
conteúdo e pré-definição de entrada. Com esses atributos, é possível criar streams ajustados para aplicativos de VoIP ou filmadoras. Também é possível definir o ID da sessão para associar um stream AAudio a uma submixagem que pode incluir efeitos. Use a API
AudioEffect
para controlar os
efeitos.
O Android 9 introduz a API
AudioEffect
para
processamento de dinâmica.
Com essa classe, é possível criar efeitos de áudio baseados em canais, incluindo equalização, compressão multibanda e limiter, em várias etapas. O número de bandas e etapas ativas é 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 tarefas relacionadas à rede.
Os jobs podem declarar o tamanho estimado dos dados, sinalizar a pré-busca e especificar requisitos detalhados de rede. Em seguida, 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
sem medição, o JobScheduler
pode executar trabalhos de pré-busca para
melhorar a experiência do usuário, como pré-buscar manchetes.
Ao adicionar jobs, use setEstimatedNetworkBytes()
,
setPrefetch()
e
setRequiredNetwork()
quando apropriado para ajudar
JobScheduler
a processar 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 uso de dados não intencional.
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 para nove novas operações:
- Operações matemáticas com elementos:
- Operações de matriz:
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 aprendizado de máquina de nível mais alto, como o TensorFlow Lite. Passe apenas
ANEURALNETWORKS_TENSOR_FLOAT32
até que o problema seja resolvido.
Além disso, a API também apresenta uma nova função, ANeuralNetworksModel_relaxComputationFloat32toFloat16()
, que permite especificar se ANEURALNETWORKS_TENSOR_FLOAT32
deve ser calculado com um intervalo e uma precisão tão baixos quanto os 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 melhorar 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 da estrutura de preenchimento automático.
Melhorias na segurança
O Android 9 apresenta vários recursos de segurança, resumidos nas seções a seguir:
Confirmação protegida pelo Android
Com dispositivos compatíveis que executam o Android 9 ou versões mais recentes, você pode usar a Confirmação protegida pelo Android. Ao usar esse fluxo de trabalho, o app solicita que o usuário aprove uma breve declaração. Essa declaração permite ao app 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 vai receber e armazenar uma assinatura criptográfica protegida por um código de autenticação de mensagem com hash de chave (HMAC). Depois que o Android Keystore confirmar a validade da mensagem, seu app
poderá usar a chave gerada de trustedConfirmationRequired
no ambiente
de execução confiável (TEE, na sigla em inglês) 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 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 orientações sobre como adicionar suporte à Confirmação protegida do Android, consulte o guia Confirmação protegida do Android.
Caixa de diálogo unificada de autenticação biométrica
No Android 9, o sistema fornece caixas de diálogo de autenticação biométrica em nome do seu app. Essa funcionalidade cria uma aparência, uma sensação e um posicionamento padronizados para a caixa de diálogo, dando aos usuários mais confiança de que eles estão se autenticando em um verificador de credenciais biométricas confiável.
Se o app usa
FingerprintManager
para mostrar uma caixa de diálogo de autenticação por impressão digital aos usuários, mude para
BiometricPrompt
em vez disso. O BiometricPrompt
depende do sistema para mostrar a caixa de diálogo de autenticação. Ele também muda o comportamento para se adaptar ao tipo de autenticação
biométrica escolhida pelo usuário.
Módulo de segurança de hardware
Os dispositivos compatíveis que executam o Android 9 ou versões mais recentes podem ter um StrongBox KeyMint (antes Keymaster), uma implementação da HAL KeyMint (antes Keymaster) 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 KeyMint, o sistema confirma a integridade de uma chave com o Ambiente de execução confiável (TEE, na sigla em inglês).
Para saber mais sobre como usar o StrongBox KeyMint, consulte Módulo de segurança de hardware.
Importação segura de chaves para o Keystore
O Android 9 oferece mais segurança de descriptografia de chave ao adicionar a capacidade de importar chaves criptografadas com segurança para o Keystore usando um formato de chave codificado por ASN.1. Em seguida, o KeyMint 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 de 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. Com essa capacidade, é possível assinar o app com um novo certificado de assinatura vinculando os certificados de assinatura anteriores do arquivo APK ao certificado com que ele está assinado agora.
Saiba como alternar chaves usando
apksigner
.
Opção para permitir a descriptografia de chaves apenas em dispositivos desbloqueados
O Android 9 introduz a flag unlockedDeviceRequired
. Essa opção determina se o Keystore exige que a tela seja desbloqueada antes de permitir a descriptografia de dados em trânsito ou armazenados usando a chave especificada. Esses tipos de chaves são adequados para criptografar dados sensíveis para armazenar em disco, como dados de saúde ou empresariais. A flag oferece aos usuários uma garantia maior de que os
dados não podem ser descriptografados enquanto o dispositivo está bloqueado, caso o smartphone seja perdido
ou roubado.
Para manter uma chave protegida contra descriptografia enquanto o dispositivo está bloqueado, ative a flag
transmitindo true
ao 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, senha, impressão digital ou algum outro fator de confiança antes de poder ser
acessado.
Suporte à criptografia legada
Os dispositivos Android 9 que vêm com o Keymaster 4 são compatíveis com o algoritmo de criptografia de dados tripla (Triple DES). Se o app interoperar com sistemas legados que exigem o Triple DES, use esse tipo de criptografia ao criptografar credenciais sensíveis.
Para saber mais sobre como aumentar a segurança do seu app, consulte Segurança para desenvolvedores Android.
Suspensão do uso de WPS
O Wi-Fi Protected Setup (WPS) foi suspenso 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. Detalhes sobre essas mudanças aparecem nas seções a seguir.
Backups de criptografia do lado do cliente
O Android 9 adiciona suporte para criptografar backups do Android com uma chave secreta do cliente. Esse suporte é ativado automaticamente quando as seguintes condições são atendidas:
- O usuário ativou o backup usando o Android 9 ou mais recente.
- O usuário definiu um bloqueio de tela para o dispositivo que exige um PIN, padrão ou senha para desbloquear.
Quando essa medida de privacidade está ativada, o PIN, o padrão ou a senha do dispositivo são necessários para restaurar os dados dos backups feitos pelo dispositivo do usuário. Para saber mais sobre a tecnologia por trás desse recurso, consulte o whitepaper Serviço de cofre de chaves do Google Cloud.
Definir as condições do dispositivo necessárias para backup
Se os dados do app incluírem informações ou preferências 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, como quando a criptografia do lado do cliente está ativada ou uma transferência local de dispositivo para dispositivo está em andamento.
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 na estrutura de acessibilidade que facilitam a oferta 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 os 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 fazer 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 precisar 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 conseguem determinar quando um painel específico da tela foi atualizado, como quando uma atividade substitui um fragmento por outro. Os painéis consistem em elementos da interface logicamente agrupados e visualmente relacionados que normalmente compreendem um fragmento.
No Android 9, é possível fornecer títulos de painel de acessibilidade ou títulos identificáveis individualmente para esses painéis. Se um painel tiver um título de acessibilidade, os serviços de acessibilidade vão receber informações mais detalhadas quando ele mudar. Isso permite que os serviços ofereç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 da interface que é substituído em
tempo de execução usando setAccessibilityPaneTitle()
.
Por exemplo, é possível dar um título à área de conteúdo de um objeto
Fragment
.
Navegação baseada em cabeçalhos
Se o app mostrar conteúdo textual com cabeçalhos lógicos, defina o atributo
android:accessibilityHeading
como true
para as instâncias de
View
que representam esses cabeçalhos. 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 essa
capacidade para melhorar a experiência de navegação na interface do usuário.
Navegação e saída de grupo
Os leitores de tela tradicionalmente usam o atributo
android:focusable
para
determinar quando devem ler um
ViewGroup
ou uma coleção de
objetos View
como uma única unidade. Assim, os usuários entenderiam que as visualizações estavam logicamente relacionadas.
No Android 8.1 e versões anteriores, é necessário marcar cada objeto View
em um
ViewGroup
como não focalizável e o próprio ViewGroup
como focalizável. Esse
arranjo fez com que algumas instâncias de View
fossem marcadas como focáveis de uma forma que
tornou a navegação por teclado mais complicada.
A partir do Android 9, é possível usar o atributo
android:screenReaderFocusable
em vez do atributo android:focusable
em situações em que
tornar um objeto View
focalizável tem consequências indesejáveis. Os leitores de tela
focam 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
- Os recursos adicionados no framework de acessibilidade dão acesso a
dicas na interface do usuário de um app. Use
getTooltipText()
para ler o texto de uma dica e useACTION_SHOW_TOOLTIP
eACTION_HIDE_TOOLTIP
para instruir instâncias deView
a mostrar ou ocultar as dicas. - Ações globais adicionadas
- O Android 9 introduz compatibilidade com duas ações de dispositivo adicionais na classe
AccessibilityService
. Seu serviço pode ajudar os usuários a bloquear os dispositivos e fazer capturas de tela usando as açõesGLOBAL_ACTION_LOCK_SCREEN
eGLOBAL_ACTION_TAKE_SCREENSHOT
, respectivamente.
Detalhes da mudança de janela
O Android 9 facilita o rastreamento de atualizações nas janelas de um app quando ele
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 alterada. Por exemplo, o framework pode
detectar quando um painel tem um novo título ou desaparece.
Rotação
Para evitar rotações não intencionais, 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 de sistema.
Na maioria dos casos, os impactos de compatibilidade nos aplicativos são mínimos. No entanto, se o app tiver um comportamento de rotação personalizado ou usar configurações de orientação de tela incomuns, você poderá encontrar problemas que passariam despercebidos antes, quando a preferência de rotação do usuário era sempre 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 oferecem a melhor experiência.
Para 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
melhora o desempenho da renderização de texto ao permitir que você calcule e armazene em cache as informações necessárias com antecedência. Ele também permite que o app faça 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 de 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 seu app detecte que o usuário selecionou um número de telefone. Em seguida, o app pode sugerir que o usuário faça uma ligação usando esse número. Os recursos emTextClassifier
substituem a funcionalidade da classeLinkify
.Layout de texto: vários métodos e atributos de conveniência facilitam a implementação do design da interface. Para mais detalhes, consulte a documentação de referência para
TextView
.
Conversão antecipada de arquivos DEX pelo ART
Em dispositivos com Android 9 ou versões mais recentes, o compilador antecipado do Android Runtime (ART) otimiza ainda mais os arquivos compactados do formato Dalvik Executable (DEX) ao converter os arquivos DEX em um pacote de apps em uma representação mais compacta. Essa mudança permite que seu app seja iniciado mais rápido e consuma menos espaço em disco e RAM.
Essa melhoria beneficia principalmente dispositivos mais simples com velocidades de E/S de disco mais lentas.
Rastreamento do sistema no dispositivo
O Android 9 permite gravar rastreamentos do sistema no seu dispositivo e compartilhar um relatório dessas gravações com sua equipe de desenvolvimento. Esse relatório é compatível com vários formatos, incluindo HTML.
Ao coletar esses rastreamentos, é possível capturar dados de tempo relacionados aos processos e linhas de execução do app e visualizar outros tipos de estados de dispositivos globalmente significativos.
Para saber mais sobre essa ferramenta, consulte Realizar rastreamento do sistema no dispositivo.