O Android 9 (nível 28 da API) introduz novos recursos e funcionalidades incríveis 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. Confira também Mudanças de comportamento do Android 9 para saber sobre as áreas em que as mudanças da plataforma podem afetar seus apps.
Posicionamento interno com RTT de Wi-Fi
O Android 9 adiciona suporte à plataforma com o protocolo 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é os pontos de acesso (APs) Wi-Fi compatíveis com RTT. O dispositivo precisa ter
os serviços de localização e a busca de Wi-Fi ativados (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 a 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 até três 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 essa precisão, é possível criar novas experiências, como navegação dentro do prédio e serviços baseados em localização refinados, como controle de voz sem ambiguidade (por exemplo, "Turn on this light") e informações com base na localização (como "Há ofertas especiais para este produto?").
Confira a API Wi-Fi RTT em uso no app de demonstração Android WifiRttScan.
Para mais informações, consulte Local do Wi-Fi: alcance com RTT.
Suporte a corte de tela
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 pode ser mostrado. 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 mostre o conteúdo ao redor dos cortes do dispositivo. É possível 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 direcionados ao nível 28 da API e versões mais recentes.
Para ver um exemplo de código que usa notificações, incluindo os recursos do Android 9, consulte o Exemplo de pessoas (link 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 a participantes de conversa: a classe
Person
é usada para identificar as pessoas envolvidas em uma conversa, incluindo os avatares e URIs. Muitas outras APIs, comoaddMessage()
, agora usam a classePerson
em vez de umCharSequence
A classePerson
também oferece suporte ao padrão de design Builder.Compatibilidade com imagens: o Android 9 agora exibe imagens nas notificações de mensagens em smartphones. Você pode usar
setData()
na mensagem para exibir uma imagem. O snippet de código a seguir demonstra como criar umaPerson
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 app pode extrair a
EXTRA_REMOTE_INPUT_DRAFT
enviada pelo sistema quando um usuário fecha acidentalmente uma notificação de mensagem. Você pode usar esse recurso para pré-preencher campos de texto no app para que os usuários possam concluir a resposta.Identifique se uma conversa é em grupo: você pode usar
setGroupConversation()
para identificar se uma conversa é em grupo ou não.Definir a ação semântica de uma intent: o método
setSemanticAction()
permite dar um 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 variedade de respostas padrão ao usuário.
Configurações do canal, transmissões e o modo 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ê quer exibir. 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, assim, não enviar notificações para 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: o sistema Android agora envia intents de transmissão quando o estado de bloqueio de canais de notificação e grupos de canais é modificado. O app proprietário do canal ou grupo bloqueado pode detectar essas intents e reagir de acordo. Para saber mais sobre essas ações de intent e extras, consulte a lista de constantes atualizada na referência de
NotificationManager
. Para ver 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":PRIORITY_CATEGORY_ALARMS
prioriza alarmes.PRIORITY_CATEGORY_MEDIA
prioriza sons de fontes de mídia, como mídia e navegação por voz.PRIORITY_CATEGORY_SYSTEM
prioriza sons do sistema.
O
NotificationManager.Policy
também tem sete novas constantes "Não perturbe" que podem ser usadas para suprimir a interrupção visual:SUPPRESSED_EFFECT_FULL_SCREEN_INTENT
impede que a notificação inicie atividades em tela cheia.SUPPRESSED_EFFECT_LIGHTS
bloqueia luzes de notificação.SUPPRESSED_EFFECT_PEEK
impede que as notificações deslizem brevemente para a visualização ("peeking").SUPPRESSED_EFFECT_STATUS_BAR
impede que as notificações apareçam na barra de status em dispositivos com suporte a essa opção.SUPPRESSED_EFFECT_BADGE
bloqueia selos em dispositivos com suporte a esse recurso. Para mais informações, consulte Modificar um ícone de notificação.SUPPRESSED_EFFECT_AMBIENT
bloqueia notificações em dispositivos com suporte a telas ambiente.SUPPRESSED_EFFECT_NOTIFICATION_LIST
impede que as notificações apareçam na visualização em lista em dispositivos com suporte a esse recurso, como aba de notificações ou tela de bloqueio.
Compatibilidade com 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 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 os 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 na tela e acesso a carimbos de data/hora OIS para estabilização de imagem e efeitos especiais no app.
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 é 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 esses valores são 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, 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 dimensionada, chame
setCrop()
. - Para criar um bitmap mutável, transmita
true
parasetMutableRequired()
.
O ImageDecoder
também permite adicionar efeitos personalizados e complicados a uma imagem,
como cantos arredondados ou
máscaras de círculo. 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 do AnimatedImageDrawable
.
A linha de execução de renderização também usa uma linha de execução de worker para decodificar, para que essa decodificação não
interfere com 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
a seguir mostra como usar ImageDecoder
para decodificar
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 fazer 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
cantos arredondados.
Vídeo VP9 HDR, compactação de imagens HEIF e APIs Media
O Android 9 oferece suporte integrado ao perfil 2 do VP9 de Alto Alcance Dinâmico (HDR) para que você possa enviar filmes em 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
de rede. Exemplos 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 no app. Você pode 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 receber 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 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 do AAudioStream, incluindo uso, tipo de
conteúdo e predefinição de entrada. Ao usar esses atributos, você pode criar streams ajustados para aplicativos de VoIP ou filmadoras. 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 canais, incluindo
igualização, compactação em várias bandas e limitador, em vários estágios. O
número de bandas e de 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 por operadoras para melhorar o processamento
de tarefas relacionadas à rede.
Os jobs podem declarar o tamanho estimado dos dados, a pré-busca de indicadores 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. Quando em uma
rede ilimitada, 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 apropriado 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 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 a nove novas operações:
- Operações matemáticas por elemento:
- Operações de matriz:
Problema conhecido:ao transmitir tensores
ANEURALNETWORKS_TENSOR_QUANT8_ASYMM
para a operação
ANEURALNETWORKS_PAD
, 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 você quer calcular
ANEURALNETWORKS_TENSOR_FLOAT32
com um alcance e 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 exibe uma solicitação ao usuário pedindo que ele 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 receberá e armazenará uma
assinatura criptográfica protegida por um código de autenticação de mensagens de hash
com chave (HMAC). 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, na sigla em inglês) 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 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 sensíveis que você normalmente não mostraria no dispositivo do usuário.
Para orientações sobre 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 posição padronizadas para a caixa de diálogo, proporcionando aos usuários mais confiança de que estão fazendo a autenticação em um verificador de credenciais biométricas confiável.
Se o app usa o
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 exibir 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 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;
- Mecanismos extras 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 como usar o strongbox Keymaster, consulte Módulo de segurança de hardware.
Importação de chave segura para o Keystore
O Android 9 oferece mais segurança na 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 do Keystore para que o conteúdo delas nunca apareça como texto simples na memória do host do dispositivo.
Saiba mais sobre 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. Esse recurso permite que seu app seja assinado com um novo certificado de assinatura ao vincular os certificados antigos do arquivo APK àquele com o qual ele está assinado agora.
Saiba mais sobre como fazer a rotação de chaves usando
apksigner
.
Opção para permitir a descriptografia de chaves 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 chave são adequados para criptografar dados confidenciais a serem armazenados em disco, como dados corporativos ou de saúde. A flag fornece 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 a descriptografia de uma chave enquanto o dispositivo estiver bloqueado, ative a sinalização
transmitindo 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 vai falhar. Um dispositivo bloqueado exige um
PIN, uma senha, uma impressão digital ou outro fator confiável para ser
acessado.
Suporte à criptografia legada
Os dispositivos Android 9 fornecidos com o Keymaster 4 oferecem suporte ao algoritmo de criptografia de dados tripla, ou Triple DES. Se o app interopera com sistemas legados que exigem DES triplo, use esse tipo de cifra ao criptografar credenciais confidenciais.
Para saber mais sobre como deixar seu app mais seguro, consulte Segurança para desenvolvedores Android.
Descontinuação da WPS
O uso da Configuração protegida do Wi-Fi (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 cliente. Esse suporte é ativado automaticamente quando as seguintes condições são atendidas:
- O usuário ativou o backup usando o Android 9 ou versões mais recentes.
- O usuário definiu um bloqueio de tela para o dispositivo que exige um PIN, padrão ou senha para ser desbloqueado.
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 incluírem informações ou preferências confidenciais, o Android 9 permitirá definir as condições do dispositivo em que os dados do app serão incluídos no backup do usuário, por exemplo, quando a criptografia do lado do cliente está ativada ou uma transferência local entre dispositivos 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 introduz 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 percorrer rapidamente o 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 podem 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 de IU agrupados logicamente e relacionados visualmente que normalmente compõem um fragmento.
No Android 9, é possível 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 vão receber informações mais detalhadas quando o painel for modificado. Esse recurso permite que os serviços forneçam informações mais granulares 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 no
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 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 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 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 precisam ler uma
ViewGroup
ou uma coleção de objetos
View
como uma única unidade. Dessa forma,
os usuários podem entender que as visualizações estão logicamente relacionadas entre si.
No Android 8.1 e versões anteriores, é necessário marcar cada objeto View
em uma
ViewGroup
como não focalizável e a própria ViewGroup
como focalizável. Essa
disposição fazia com que algumas instâncias de View
fossem marcadas como focalizáveis de uma forma que
tornava a navegação pelo 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
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 dão acesso a
dicas na interface de um app. Use
getTooltipText()
para ler o texto de uma dica e useACTION_SHOW_TOOLTIP
eACTION_HIDE_TOOLTIP
para instruir as instâncias deView
a mostrar ou ocultar as dicas. - Ações globais adicionadas
- O Android 9 introduz o suporte a duas outras ações de dispositivo 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 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 alteradas. 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 ocorrer um
evento TYPE_WINDOW_STATE_CHANGED
, use os tipos retornados por
getContentChangeTypes()
para determinar como a janela mudou. Por exemplo, o framework pode
detectar quando um painel tem um novo título ou quando ele desapareceu.
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 algum comportamento de rotação personalizado ou usar configurações de orientação de tela incomuns, talvez você encontre problemas que teriam passado despercebidos quando a preferência de rotação do usuário sempre estava definida como retrato. Confira 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.
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.Linkify inteligente: o Android 9 aprimora a classe
TextClassifier
, que utiliza 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 chamada telefônica usando esse número. Os recursos deTextClassifier
substituem a funcionalidade da classeLinkify
.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 de 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 inicie mais rapidamente e consuma menos espaço em disco e em RAM.
Essa melhoria beneficia principalmente dispositivos de baixo custo, com velocidades de E/S de disco mais lentas.
Rastreamento do sistema no dispositivo
O Android 9 permite que você grave rastros do sistema no seu dispositivo e compartilhe um relatório dessas gravações com sua equipe de desenvolvimento. Esse relatório suporta vários formatos, inclusive HTML.
Ao coletar esses rastros, é possível capturar dados de tempo relacionados aos processos e linhas de execução do app e visualizar outros tipos de estados de dispositivo com relevância global.
Para saber mais sobre essa ferramenta, consulte Executar rastreamento do sistema no dispositivo.