O Android 8.0 (nível 26 da API) apresenta uma variedade de novos recursos e funções para usuários e desenvolvedores. Este documento destaca as novidades para os desenvolvedores.
Confira também as Mudanças de comportamento do Android 8.0 para conhecer as áreas em que as mudanças da plataforma podem afetar seus apps.
Experiência do usuário
Modo Imagem em imagem
Picture-in-picture no Android 8.0.
O Android 8.0 (API de nível 26) permite iniciar atividades em modo picture-in-picture. O PIP é um tipo especial de modo de várias janelas usado principalmente para reprodução de vídeo. O modo PIP estava disponível originalmente apenas para Android TV. O Android 8.0 disponibiliza o recurso em outros dispositivos Android.
Quando uma atividade está no modo PIP, ela está no estado pausado, mas precisa
continuar mostrando conteúdo. Por isso, certifique-se de que seu app
não pausa a reprodução no onPause()
. Em vez disso, você deve pausar o vídeo em onStop()
e retomar a reprodução em onStart()
. Para mais informações, consulte
Várias janelas
Lifecycle.
Para especificar que sua atividade pode usar o modo PIP, defina
android:supportsPictureInPicture
como verdadeiro no manifesto.
A partir do Android 8.0, o PIP não exige o
atributo de manifesto android:resizeableActivity
.
No entanto, é necessário definir
android:resizeableActivity
como "true" se a atividade for compatível com outros
modos de várias janelas.
O Android 8.0 (API de nível 26) introduz um novo objeto, PictureInPictureParams
,
que você passa para os métodos do PIP para especificar como uma atividade deve se comportar.
no modo PIP. Esse objeto especifica propriedades como a
proporção preferencial da atividade.
Os métodos PIP existentes, descritos em Adicionar imagem em imagem, agora podem ser usados em todos os dispositivos Android, e não apenas na Android TV. Além disso, o Android 8.0 oferece os seguintes métodos para oferecer suporte ao modo PIP:
Activity.enterPictureInPictureMode(PictureInPictureParams args)
: Coloca a atividade no modo picture-in-picture. A proporção da atividade e outras definições de configuração são especificadas por args. Se algum campo em args estiver vazio, o sistema vai usar os valores definidos na última vez que você chamouActivity.setPictureInPictureParams()
.A atividade especificada é colocada em um canto da tela. o restante a tela será preenchida com a atividade anterior que estava na tela. A atividade que entra no modo PIP assume o estado pausado, mas continua iniciada. Se o usuário tocar a atividade PIP, o sistema mostrará um menu para interação com o usuário. Nenhum evento de toque chega à atividade enquanto ela está no estado PIP.
-
Activity.setPictureInPictureParams()
: atualiza as configurações de PIP de uma atividade. Se a atividade estiver no modo PIP, as configurações serão atualizadas. Isso é útil quando a proporção da atividade muda. Se a atividade não estiver no modo picture-in-picture, essas definições de configuração serão usadas, independentemente do métodoenterPictureInPictureMode()
chamado.
Notificações
No Android 8.0 (nível 26 da API), reestruturamos as notificações para oferecer uma maneira mais fácil e uniforme de gerenciar o comportamento e as configurações de notificações. Essas mudanças incluem:
- Canais de notificação: o Android 8.0 introduz canais de notificação que permitem criar um canal personalizável pelo usuário para cada tipo de notificação que você quer mostrar. A interface do usuário se refere a canais de notificação como categorias de notificação. Para saber como implementar canais de notificação, consulte Como gerenciar canais de notificação.
- Pontos de notificação: o Android 8.0 introduz a compatibilidade com a exibição de dados pontos ou selos nos ícones na tela de início. Os pontos de notificação refletem o presença de notificações que o usuário ainda não dispensou ou ainda não agiu. Para saber como trabalhar com pontos de notificação, consulte Badges de notificação.
- Soneca: os usuários podem adiar as notificações, fazendo com que elas desapareçam. por um período antes de reaparecerem. As notificações reaparecem com o mesmo nível de importância com que apareceram pela primeira vez. Os apps podem remover ou atualizar uma notificação adiada, mas a atualização de uma notificação adiada não faz com que ela reapareça.
- Tempos limite de notificação: é possível definir um tempo limite ao criar uma
notificação usando
setTimeoutAfter()
. Você pode usar esse método para especificar um período após o qual uma notificação deve ser cancelada. Se necessário, você pode cancelar uma notificação antes do término do tempo limite especificado. - Configurações de notificação: é possível chamar
setSettingsText()
para definir o texto que aparece quando você cria um link para as configurações de notificação do seu app a partir de uma notificação usando a intentNotification.INTENT_CATEGORY_NOTIFICATION_PREFERENCES
. O sistema pode fornecer os extras a seguir com a intenção de filtrar as configurações que o app precisa exibir para os usuários:EXTRA_CHANNEL_ID
,NOTIFICATION_TAG
eNOTIFICATION_ID
. - Dispensa de notificação: os usuários podem dispensá-la por conta própria.
os apps podem removê-los de maneira programática. É possível determinar quando uma notificação
é dispensada e por que ela é dispensada implementando o
onNotificationRemoved()
doNotificationListenerService
. - Cores de plano de fundo: você pode definir e ativar uma cor de plano de fundo para um
notificação. Use esse recurso somente para notificações de
tarefas contínuas e essenciais que o usuário deve ver rapidamente. Para
por exemplo, você pode definir uma cor de fundo para notificações relacionadas a
rotas de carro ou uma chamada em andamento. Você também pode definir a
cor de fundo desejada usando
setColor()
. Ao fazer isso permite que você usesetColorized()
para ativar o uso de uma cor de plano de fundo para uma notificação. - Estilo de mensagem: no Android 8.0, as notificações que usam a
classe
MessagingStyle
exibem mais conteúdo na forma recolhida. Use o método ClasseMessagingStyle
para relacionadas a mensagens. Você também pode usar o MétodoaddHistoricMessage()
para fornecer contexto a uma conversa, adicionando de mensagens históricas a notificações relacionadas a mensagens.

Os usuários podem pressionar o ícone de inicialização de apps por alguns segundos para conferir as notificações no Android 8.0.
Estrutura de preenchimento automático
Criação de contas, login e transações com cartão de crédito levam tempo e estão propensos a erros. Aplicativos que exigem esse tipo de tarefa repetitiva podem frustrar facilmente os usuários.
O Android 8.0 (nível 26 da API) facilita o preenchimento de formulários, como de login e de cartão de crédito, com a introdução da estrutura de preenchimento automático. Depois que o usuário ativar o preenchimento automático, apps novos e existentes vão funcionar com o Autofill Framework.
Você pode realizar algumas etapas para otimizar a maneira com a qual seu aplicativo trabalha com a estrutura. Para mais informações, consulte Visão geral da estrutura de preenchimento automático.
Fontes para download
O Android 8.0 (API de nível 26) e a Biblioteca de Suporte 26 do Android permitem solicitar fontes de um em vez de agrupar fontes no APK ou permitir que o Fontes do download do APK. Esse recurso reduz o tamanho do APK e aumenta o app taxa de instalação bem-sucedida e permite que vários apps compartilhem a mesma fonte.
Para mais informações sobre como fazer o download de fontes, consulte Fontes para download.
Fontes em XML
O Android 8.0 (nível 26 da API) introduz um novo recurso, Fonts in XML, que
permite usar fontes como recursos. Isso significa que não é necessário agrupar fontes
como recursos. As fontes são compiladas no arquivo R
e são automaticamente
disponíveis no sistema como um recurso. Você pode acessar essas fontes com o
ajuda de um novo tipo de recurso, font
.
A Biblioteca de Suporte 26 oferece suporte total a esse recurso em dispositivos com as versões 14 e mais recentes da API.
Para mais informações sobre como usar fontes como recursos e recuperar fontes do sistema, consulte Fontes em XML.
Dimensionamento automático do TextView
O Android 8.0 (API de nível 26) permite definir o tamanho da expansão ou contrato automaticamente com base no tamanho da TextView. Com isso, ficou muito mais fácil otimizar o tamanho do texto em telas diferentes ou com conteúdo dinâmico. Para mais informações sobre o dimensionamento automático da TextView no Android 8.0, consulte Dimensionar automaticamente o TextView.
Ícones adaptativos
O Android 8.0 (nível 26 da API) introduz ícones de inicialização adaptativos. Os ícones adaptativos oferecem suporte a efeitos visuais e podem exibir uma variedade de formas em diferentes modelos de dispositivos. Para saber como criar ícones adaptativos, consulte o guia Ícones adaptativos.
Gerenciamento de cores
Desenvolvedores Android de apps de imagem agora podem aproveitar os novos dispositivos que têm uma tela com uma ampla gama de cores. Para exibir a ampla gama imagens, os apps precisarão ativar uma flag no manifesto (por atividade) e carregar bitmaps com um perfil amplo de cores incorporado (AdobeRGB, Pro Photo RGB, DCI-P3 etc.).
WebView APIs
O Android 8.0 fornece várias APIs para ajudar você a gerenciar
os objetos WebView
que exibem conteúdo da Web no seu app.
Essas APIs, que melhoram a estabilidade e a segurança do seu aplicativo, incluem as APIs
seguintes:
- API Version
- Google SafeBrowsing API
- Termination Handle API
- API Renderer Importance
Para saber mais sobre como usar essas APIs, consulte Gerenciar WebViews.
A classe WebView
agora inclui uma API Safe Browsing para melhorar a segurança
na navegação na Web. Para mais informações, consulte a
API Google Safe Browsing.
Fixação de atalhos e widgets
O Android 8.0 (nível 26 da API) introduz a fixação no app de atalhos e widgets. No seu aplicativo, você pode criar atalhos e widgets fixados para telas de início compatíveis, sujeitas à permissão do usuário.
Para mais informações, consulte a Fixar atalhos e widgets guia de recursos.
Proporção máxima da tela
O Android 8.0 (nível 26 da API) traz mudanças na forma de configurar a proporção máxima de um app.
Primeiro, o Android 8.0 apresenta o atributo maxAspectRatio, que pode ser usado para definir a proporção máxima do app. Além disso, no Android 8.0 e em versões mais recentes, a proporção máxima padrão é a proporção nativa do dispositivo em que o app está sendo executado.
Para mais informações sobre como declarar a proporção máxima, consulte Compatibilidade com várias telas.
Suporte a várias telas
A partir do Android 8.0 (API de nível 26), a plataforma oferece suporte a várias telas. Se uma atividade oferece suporte ao modo de várias janelas e está sendo executado em um dispositivo com várias telas, os usuários podem mover a atividade de uma tela para outra. Quando um app inicia uma atividade, ele pode especificar em que tela a atividade precisa ser executada.
Observação : se uma atividade oferecer suporte a essa atividade, o modo de várias janelas, o Android 8.0 ativa automaticamente suporte a várias telas para essa atividade. Teste seu app para garantir se ele funciona adequadamente em um ambiente com várias telas.
Apenas uma atividade poderá estar no estado retomado por vez, mesmo se tiver várias telas. A atividade com foco está no estado retomado. todas as outras atividades visíveis serão pausadas, mas não interrompidas. Para mais informações do ciclo de vida da atividade quando várias atividades estão visíveis, consulte Várias janelas Lifecycle.
Quando um usuário move uma atividade de uma tela para outra, o sistema redimensiona a atividade e emite as alterações de tempo de execução necessárias. A atividade pode processar a mudança de configuração por conta própria ou permitir que o sistema destrua o processo que contém a atividade e a recrie com as novas dimensões. Para mais informações, consulte Processamento de configurações Mudanças.
ActivityOptions
oferece dois novos métodos para permitir
várias telas:
setLaunchDisplayId()
- Especifica em qual tela a atividade vai ser mostrada quando iniciada.
getLaunchDisplayId()
- Retorna a tela de inicialização atual da atividade.
O shell adb foi ampliado para permitir várias telas.
O comando shell start
agora pode ser usado para iniciar uma atividade,
e especificar a tela de destino da atividade:
adb shell start <activity_name> --display <display_id>
Margens e preenchimento unificados de layout
O Android 8.0 (API de nível 26) facilita a especificação de situações em que lados opostos
de um elemento View
usem a mesma margem ou padding.
Especificamente, agora é possível usar os seguintes atributos no XML do layout
arquivos:
-
layout_marginVertical
, que definelayout_marginTop
elayout_marginBottom
ao mesmo tempo. -
layout_marginHorizontal
, que definelayout_marginLeft
elayout_marginRight
ao mesmo tempo. -
paddingVertical
, que definepaddingTop
epaddingBottom
ao mesmo tempo. -
paddingHorizontal
, que definepaddingLeft
epaddingRight
ao mesmo tempo.
Observação:se você personalizar a lógica do app para
oferecem suporte a diferentes
idiomas e culturas, incluindo a direção do texto, lembre-se de que essas
não afetam os valores dos
layout_marginStart
,
layout_marginEnd
,
paddingStart
ou
paddingEnd
Você mesmo pode definir esses valores, além dos
novos atributos de layout vertical e horizontal, para criar o comportamento de layout
que depende da direção do texto.
Captura de ponteiro
Alguns aplicativos, como jogos, área de trabalho remota e clientes de virtualização, controlar o ponteiro do mouse. A captura de ponteiro é uma nova recurso do Android 8.0 (API de nível 26) que oferece esse controle enviando todos os eventos do mouse para uma visualização focada no app.
A partir do Android 8.0, uma View
no app pode solicitar
a captura do ponteiro e definir um listener para processar eventos de ponteiro capturados. O
ponteiro do mouse fica oculto nesse modo. A visualização pode liberar a captura do ponteiro
quando não precisar mais das informações do mouse. O sistema também pode liberar
captura do ponteiro quando a visualização perde o foco, por exemplo, quando o usuário abre
outro app.
Para saber mais sobre como usar esse recurso no seu app, consulte Captura do ponteiro.
Categorias de apps
O Android 8.0 (nível 26 da API) permite que cada app declare uma categoria adequada a ele,
quando relevante. Essas categorias são usadas para agrupar aplicativos de
finalidade ou função ao apresentá-los aos usuários, como no uso de dados, uso da bateria ou
Uso do armazenamento. Você pode definir uma categoria para o app definindo o
atributo android:appCategory
na tag de manifesto
<application>
.
Inicializador do Android TV
O Android 8.0 (API de nível 26) inclui uma nova versão Experiência da tela inicial do Android TV, disponível em o emulador do Android TV e a imagem do dispositivo Nexus Player para o Android 8.0. A nova tela inicial organiza conteúdo de vídeo em linhas correspondentes aos canais, cada uma preenchida com programas por um aplicativo no sistema. Os apps podem publicar vários canais, e os usuários podem configurar quais canais gostam de ver na tela inicial. A tela inicial do Android TV também inclui uma linha "Assistir a seguir", que é preenchida com programas de apps com base nos hábitos de visualização do usuário. Os apps também podem oferecer prévias de vídeo, que são reproduzidas automaticamente quando um usuário foca em um programa. As APIs para preencher canais e programas fazem parte das APIs TvProvider, que são distribuídas como um módulo da Biblioteca de Suporte do Android com o Android 8.0.
AnimatorSet
A partir do Android 8.0 (API de nível 26), a API AnimatorSet
agora oferece suporte à busca e reprodução em
inverter. A busca permite posicionar o conjunto de animações em um ponto específico
no tempo. A reprodução ao contrário é útil se o app inclui animações
para ver as ações que podem ser desfeitas. Em vez de definir dois conjuntos de animação
separados, você pode reproduzir o mesmo conjunto ao contrário.
Interação e navegação
Clusters de navegação por teclado
Se uma atividade do seu app usa uma hierarquia de vistas complexa, como a da Figura 2, pense em organizar grupos de elementos da IU em clusters para facilitar a navegação por teclado. Os usuários podem pressionar Meta+Tab ou Search+Tab em dispositivos Chromebook para navegar de um cluster a outro. Bons exemplos de os clusters incluem: painéis laterais, barras de navegação, principais áreas de conteúdo e elementos que pode conter muitos elementos filhos.

Para criar um elemento View
ou ViewGroup
em um cluster, defina
android:keyboardNavigationCluster
para
true
no arquivo XML de layout do elemento ou transmita true
.
em setKeyboardNavigationCluster()
na lógica da interface do seu app.
Observação: os clusters não podem ser aninhados, embora clusters não aninhados
possam aparecer em diferentes níveis da hierarquia. Se você tentar
aninhar clusters, o framework trata apenas dos
ViewGroup
como um cluster.
Em dispositivos com touchscreen, é possível definir um cluster designado
ViewGroup
do objeto
Elemento android:touchscreenBlocksFocus
a true
para
permitir navegação somente em cluster para dentro e para fora dele. Se você aplicar essa
configuração a um cluster, os usuários não poderão usar a tecla Tab nem as setas para
entrar e sair da navegação no cluster. Eles terão que pressionar a combinação do teclado de navegação
no cluster.
Foco padrão da vista
No Android 8.0 (nível 26 da API), é possível atribuir a View
que deve
receber foco depois que uma atividade (re)criada é retomada e o usuário pressiona uma
tecla de navegação do teclado, como a tecla de guia. Para aplicar essa configuração "focado por padrão",
de configuração, defina o valor de um elemento View
android:focusedByDefault
como true
no
arquivo XML de layout que contém o elemento da interface ou transmita true
para
setFocusedByDefault()
na sua
lógica da IU do seu app.
Saída de voz
Atividades e serviços podem usar instâncias de
TextToSpeech
para ditar e pronunciar conteúdo. A partir de
No Android 8.0 (nível 26 da API), seu app pode receber informações de tempo mais precisas
sobre quando um mecanismo de conversão de texto em voz começa a falar palavras sintetizadas individuais,
desde que o mecanismo forneça essas informações. Você pode usar essa funcionalidade
para chamar a atenção para palavras específicas enquanto o mecanismo de conversão de texto em voz as
lê.
Para usar essas melhorias do mecanismo de conversão de texto em voz no seu app, registre um
instância de UtteranceProgressListener
. Como parte do
de registro, inclua um manipulador para o
onRangeStart()
.
O mecanismo de conversão de texto em voz chama
rangeStart()
para gravar
o momento em que espera a reprodução de áudio de um intervalo específico de texto
para começar. Quando o áudio para esse intervalo de texto iniciar a reprodução, o
onRangeStart()
é executado. Seu app pode responder a esse callback, como
destacando a faixa de texto associada ao enunciado.
Para mais informações sobre como acompanhar o progresso da reprodução de um mecanismo de conversão de texto em fala, consulte a referência da classe
UtteranceProgressListener
.
Sistema
Novos detectores de StrictMode
O Android 8.0 (nível 26 da API) adiciona três novos detectores do StrictMode para ajudar a identificar possíveis bugs no app:
detectUnbufferedIo()
vai detectar quando o app ler ou gravar dados sem buffer, o que pode afetar drasticamente o desempenho.detectContentUriWithoutPermission()
vai detectar quando seu app esquece acidentalmente de conceder permissões a outro app ao iniciar uma atividade fora do app.- O app
detectUntaggedSockets()
vai detectar quando o app executa tráfego de rede sem usarsetThreadStatsTag(int)
para marcar seu tráfego para depuração propósitos.
Dados em cache
O Android 8.0 (API de nível 26) oferece melhores orientações e comportamentos em relação aos dados armazenados em cache. Cada
app agora recebe uma cota de espaço em disco para dados em cache, conforme retornado por
getCacheQuotaBytes(UUID)
:
Quando o sistema precisa liberar espaço em disco, ele começa excluindo arquivos em cache dos apps que mais ultrapassaram a cota alocada. Dessa forma, se você manter seus dados em cache dentro da cota alocada, os arquivos em cache serão alguns dos últimos que serão excluídos do sistema quando necessário. Quando o sistema está decidindo quais arquivos em cache excluir de dentro do seu app, ele considera primeiro os mais antigos (conforme é determinado pelo tempo modificado).
Há também dois novos comportamentos que podem ser ativados de acordo com o diretório para controlar como o sistema libera o cache com dados:
StorageManager.setCacheBehaviorAtomic()
pode ser usado para indicar que um diretório e todo o conteúdo dele precisa ser excluído como uma única unidade atômica.setCacheBehaviorTombstone(File, boolean)
pode ser usado para indicar que, em vez de excluir arquivos de um diretório, eles devem ser truncados para terem 0 bytes de tamanho, deixando o arquivo vazio intacto.
Por fim, quando precisar alocar espaço em disco para arquivos grandes, considere usar o novo
API allocateBytes(FileDescriptor, long)
, que será limpa automaticamente
arquivos armazenados em cache pertencentes a outros apps (conforme necessário) para atender à sua solicitação. Ao decidir se o
dispositivo tem espaço em disco suficiente para armazenar os novos dados, chame
getAllocatableBytes(UUID)
em vez de usar
getUsableSpace()
, já que o primeiro considera todos os dados em cache
que o sistema está disposto a limpar em seu nome.
Paginação do provedor de conteúdo
Atualizamos os provedores de conteúdo para incluir suporte ao carregamento de um arquivo grande uma página por vez. Por exemplo, um app de fotos com milhares de imagens pode consultar um subconjunto dos dados para exibição em uma página. Cada página dos resultados retornados por um provedor de conteúdo são representados por um único Cursor objeto. Para usar esse recurso, o cliente e o provedor precisam implementar a paginação.
Para informações detalhadas sobre as mudanças nos provedores de conteúdo, consulte
ContentProvider
e
ContentProviderClient
.
Solicitações de atualização de conteúdo
Agora, as classes ContentProvider
e
ContentResolver
incluem um
método refresh()
. Assim, os clientes conseguem saber se
as informações que solicitaram são as atuais.
É possível adicionar uma lógica personalizada de atualização de conteúdo ampliando
ContentProvider
. Substitua o parâmetro
Método refresh()
a ser retornado
true
, indicando aos clientes do seu provedor que você tentou
para atualizar os dados por conta própria.
Seu app cliente pode solicitar explicitamente um conteúdo atualizado chamando um
método diferente, também chamado
refresh()
: Ao chamar isso
, transmita o URI dos dados a serem atualizados.
Observação: como você pode solicitar dados por uma rede,
invoque refresh()
do
lado do cliente somente quando houver uma forte indicação de que o conteúdo está desatualizado.
O motivo mais comum para se realizar esse tipo de atualização de conteúdo é em resposta a
um gesto de deslizar para atualizar,
solicitando explicitamente que a IU atual exiba conteúdo atualizado.
Melhorias no JobScheduler
O Android 8.0 (nível 26 da API) introduz várias melhorias em JobScheduler
. Essas melhorias facilitam o cumprimento
dos novos limites de execução
em segundo plano pelo app, já que você pode usar jobs agendados para substituir
os serviços de segundo plano agora restritos ou receptores de transmissão implícitos.
As atualizações do JobScheduler
incluem:
-
Agora é possível associar uma fila de trabalho a um job agendado. Para adicionar um item de trabalho à
fila de um job, chame
JobScheduler.enqueue()
. Quando o job estiver em execução, ele pode retirar o trabalho pendente da fila e processá-lo. Essa funcionalidade lida com muitos dos casos de uso que anteriormente teriam exigido a inicialização de um serviço em segundo plano, particularmente serviços que implementamIntentService
. -
No Android
A Biblioteca de Suporte 26.0.0 apresenta uma nova classe
JobIntentService
, que fornece os mesmos funcionalidade comoIntentService
, mas usa jobs em vez de quando executados no Android 8.0 (nível 26 da API) ou mais recente. -
Agora é possível chamar
JobInfo.Builder.setClipData()
para associar umClipData
a um job. Essa opção ativa associar concessões de permissão de URI a um trabalho, da mesma forma que essas permissões podem ser propagadas paraContext.startService()
. Também é possível usar concessões de permissão de URI com intents nas filas de trabalho. -
Os jobs programados agora oferecem suporte a várias novas restrições:
JobInfo.isRequireStorageNotLow()
- O job não é executado se o armazenamento disponível do dispositivo estiver baixo.
JobInfo.isRequireBatteryNotLow()
- O job não é executado quando o nível da bateria está no nível crítico ou abaixo dele limite esse é o nível em que o dispositivo mostra o aviso Bateria fraca aviso do sistema.
NETWORK_TYPE_METERED
- O job exige uma conexão de rede tarifada, como a maioria dos planos de dados celulares.
Repositório de dados personalizado
O Android 8.0 (API de nível 26) permite fornecer um repositório de dados personalizado de acordo com suas preferências, que pode serão úteis se o app armazenar as preferências em um banco de dados local ou na nuvem; ou se as preferências forem específicas do dispositivo. Para mais informações sobre para implementar o repositório de dados, consulte Repositório de dados personalizado.
Aprimoramentos de mídia
VolumeShaper
Há uma nova classe VolumeShaper
. Use-a
para realizar transições curtas de volume automatizadas, como fade-ins, fade-outs e cross fades.
Consulte Como controlar a amplitude com o VolumeShaper
para saber mais.
Melhorias na seleção de áudio
Aplicativos de áudio compartilham a saída de áudio em um dispositivo ao solicitar e abandonar o foco do áudio.
Um aplicativo lida com as mudanças de foco ao iniciar ou interromper a reprodução, ou atenuando o volume.
Há uma nova classe AudioFocusRequest
. Ao usar esta classe como parâmetro de
requestAudioFocus()
,
os apps têm novas capacidades ao lidar com mudanças na seleção de áudio:
redução automática de volume e
ganho atrasado de foco.
Métricas de mídia
Um novo método getMetrics()
retorna um objeto PersistableBundle
que contém informações de configuração
e desempenho, expressas como um mapa de atributos e valores.
O método getMetrics()
é definido para estas classes de mídia:
MediaPlayer.getMetrics()
MediaRecorder.getMetrics()
MediaCodec.getMetrics()
MediaExtractor.getMetrics()
As métricas são coletadas separadamente para cada instância e persistem para o o ciclo de vida da instância. Se nenhuma métrica estiver disponível, o método retornará nulo. As métricas reais retornadas dependem da classe.
MediaPlayer
A partir do Android 8.0 (API de nível 26), o MediaPlayer pode reproduzir protegido por DRM material e mídia criptografada em nível de amostra HLS.
O Android 8.0 apresenta um novo comando
seekTo()
sobrecarregado que oferece controle detalhado
ao buscar um frame. Ele inclui um segundo parâmetro que especifica um modo de busca:
SEEK_PREVIOUS_SYNC
move a posição da mídia para um frame de sincronização (ou chave) associado a uma fonte de dados localizada antes ou no momento especificado.SEEK_NEXT_SYNC
move a posição da mídia para um frame de sincronização (ou de chave) associado com uma fonte de dados localizada logo após ou no momento determinado.SEEK_CLOSEST_SYNC
move a posição da mídia para um frame de sincronização (ou de chave) associadas a uma fonte de dados que esteja mais próxima ou no momento em questão.SEEK_CLOSEST
move a posição da mídia para um frame (não necessariamente para uma sincronização) ou frame-chave) associados a uma fonte de dados que está mais próxima ou em um determinado momento.
Ao buscar continuamente, os apps precisam usar qualquer um dos modos SEEK_
em vez de SEEK_CLOSEST
, que é executado de forma relativamente mais lenta, mas pode ser mais preciso.
MediaRecorder
- O MediaRecorder agora oferece suporte ao formato MPEG2_TS, que é útil para
streaming:
Kotlin
mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_2_TS)
Java
mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_2_TS);
- O
MediaMuxer
agora pode gerenciar qualquer quantidade de streams de áudio e vídeo. Você não está mais limitado a uma faixa de áudio e/ou uma faixa de vídeo. UseaddTrack()
para combinar quantas faixas você quiser. - O
MediaMuxer
também pode adicionar uma ou mais faixas de metadados que contenham informações por frame definidas pelo usuário. O formato dos metadados é definido por seu aplicativo. O a faixa de metadados só é compatível com contêineres MP4.
Metadados podem ser úteis para processamento off-line. Por exemplo, sinais de giroscópio do sensor podem ser usados para estabilizar o vídeo.
Ao adicionar uma faixa de metadados, o formato MIME da faixa precisa começar com o prefixo
"application/". Escrever metadados é o mesmo que escrever dados de áudio/vídeo, mas os dados não são originados de um MediaCodec
. Em vez disso, o aplicativo passa uma
ByteBuffer
pelo carimbo de data/hora associado ao
writeSampleData()
.
O carimbo de data/hora precisa estar na mesma base de tempo que as faixas de vídeo e áudio.
O arquivo MP4 gerado usa o TextMetaDataSampleEntry
definido na seção
12.3.3.2 do ISOBMFF para sinalizar o formato MIME dos metadados. Ao usar MediaExtractor
para extrair o arquivo com a faixa de metadados, o objeto MIME
dos metadados será extraído para MediaFormat
.
Acesso melhorado a arquivos de mídia
O
O Framework de acesso ao armazenamento (SAF, na sigla em inglês) permite que os apps exponham uma
DocumentsProvider
, que pode conceder acesso a arquivos
em uma fonte de dados para outros apps. Na verdade, um
provedor de documentos pode até mesmo conceder acesso a arquivos
que residam no armazenamento de rede ou que usem um protocolo como
Media Transfer Protocol (MTP).
No entanto, acessar grandes arquivos de mídia de uma fonte de dados remota apresenta alguns desafios:
- Media players exigem acesso com busca a um arquivo de um provedor de documentos. Nos casos em que um grande arquivo de mídia reside em uma fonte de dados remota, o o provedor de documentos precisa buscar todos os dados com antecedência e criar um snapshot descritor do arquivo. O media player não pode reproduzir o arquivo sem o descritor de arquivo. Portanto, a reprodução não pode ser iniciada até que o provedor de documentos termine de fazer o download do arquivo.
- Gerenciadores de coleta de mídia, como aplicativos de foto, precisam passar por uma série de URIs de acesso para alcançar mídias armazenadas em um cartão SD externo por meio de pastas com escopo. Esse padrão de acesso torna operações em massa em mídias, como mover, copiar e excluir, muito lentas.
- Os gerenciadores de coleta de mídia não podem determinar a localização de um documento por seu URI. Isso torna difícil para esses tipos de apps permitirem que os usuários escolham onde salvar um arquivo de mídia.
O Android 8.0 soluciona cada um desses desafios ao melhorar a Estrutura de Acesso ao Armazenamento.
Provedores de documentos personalizados
A partir do Android 8.0, a Estrutura de Acesso ao Armazenamento permite que provedores de documentos personalizados criem descritores de arquivo com busca para arquivos que residem em uma fonte de dados remota. A SAF pode abrir um arquivo para obter um descritor de arquivo com busca nativo. A SAF então entrega solicitações de bytes discretos para o provedor de documentos. Esse recurso permite que um provedor de documentos retorne o intervalo exato de bytes que um app de media player solicitou em vez de armazenar todo o arquivo em cache antecipadamente.
Para usar esse recurso, é necessário chamar o novo
método StorageManager.openProxyFileDescriptor()
. O
método openProxyFileDescriptor()
aceita um objeto ProxyFileDescriptorCallback
como um callback. A SAF invoca
o callback sempre que um aplicativo cliente executa operações de arquivo no
descritor de arquivo retornado do provedor de documentos.
Acesso direto a documentos
A partir do Android 8.0 (nível 26 da API), é possível usar o
método getDocumentUri()
para
receber um URI que referencia o mesmo documento que o mediaUri
fornecido.
No entanto, como o URI retornado tem o suporte de uma
DocumentsProvider
, os gerentes de coleta de mídia podem acessar
o documento diretamente, sem precisar atravessar árvores de diretórios com escopo.
Consequentemente, os gerenciadores de mídia podem realizar operações de arquivo no documento
com uma velocidade significativamente superior.
Cuidado:o método getDocumentUri()
localiza apenas arquivos de mídia. ele não concede apps
para acessar esses arquivos. Para saber mais sobre como conseguir permissão
de acesso aos arquivos de mídia, consulte a documentação de referência.
Caminhos para documentos
Ao usar a Estrutura de Acesso ao Armazenamento no Android 8.0 (nível 26 da API), você pode usar o
método findDocumentPath()
, disponível nas classes
DocumentsContract
e
DocumentsProvider
,
para determinar o caminho da raiz de um sistema de arquivos com o ID
de um documento. O método retorna esse caminho em um
objeto DocumentsContract.Path
. Nos casos em que um sistema de arquivos
tem vários caminhos definidos para o mesmo documento, o método retorna o
caminho usado com mais frequência para acessar o documento com o ID fornecido.
Essa funcionalidade é particularmente útil nos seguintes cenários:
- O app usa a opção "Salvar como" caixa de diálogo que exibe a localização de um em um documento específico.
- O app mostra pastas em uma visualização de resultados da pesquisa e precisa carregar o arquivo filho documentos que estão em uma pasta específica se o usuário selecionar essa do Compute Engine.
Observação:caso seu app tenha permissão para acessar apenas alguns dos documentos
no caminho, o valor de retorno de findDocumentPath()
inclui apenas
as pastas e os documentos que o app pode acessar.
Monitorar a reprodução de áudio
O serviço do sistema AudioManager
mantém uma lista de
objetos AudioPlaybackConfiguration
ativos, cada um dos quais
contém informações sobre uma sessão de reprodução de áudio específica. Seu app pode
extrair o conjunto de configurações ativas chamando
getActivePlaybackConfigurations()
.
A partir do Android 8.0 (API de nível 26), é possível registrar um callback que notifica
seu app quando um ou mais
AudioPlaybackConfiguration
objetos foram alterados. Para fazer isso,
chame registerAudioPlaybackCallback()
, transmitindo uma instância de
AudioManager.AudioPlaybackCallback
. A
classe AudioManager.AudioPlaybackCallback
contém o
método onPlaybackConfigChanged()
, que o sistema chama quando a configuração de
reprodução de áudio muda.
Conectividade
Wi-Fi Aware
O Android 8.0 (API de nível 26) adiciona suporte ao Wi-Fi Aware, que é baseado no Especificação de rede de reconhecimento (NAN, na sigla em inglês). Em dispositivos com o Hardwares, apps e dispositivos por perto do Wi-Fi Aware podem detectar e se comunicar por Wi-Fi sem um ponto de acesso à Internet. Estamos trabalhando com nosso hardware parceiros levarem a tecnologia Wi-Fi Aware para os dispositivos o mais rápido possível. Para Para mais informações sobre como integrar o Wi-Fi Aware no seu app, consulte Wi-Fi Aware.
Bluetooth
O Android 8.0 (nível 26 da API) enriquece o suporte a Bluetooth da plataforma adicionando os seguintes recursos:
- Suporte ao padrão AVRCP 1.4, que permite navegação em bibliotecas de música.
- Suporte ao padrão Bluetooth Low-Energy (BLE) 5.0.
- Integração com o codec Sony LDAC na pilha Bluetooth.
Pareamento de dispositivo complementar
O Android 8.0 (nível 26 da API) oferece APIs que permitem personalizar a caixa de diálogo de solicitação de pareamento ao tentar parear com dispositivos complementares por Bluetooth, BLE e Wi-Fi. Para mais informações, consulte Dispositivo complementar Pareamento.
Para mais informações sobre como usar o Bluetooth no Android, consulte o guia Bluetooth. Para saber quais mudanças no Bluetooth são específicas do Android 8.0 (nível 26 da API), consulte a seção Bluetooth da página Mudanças de comportamento do Android 8.0.
Compartilhamento
Compartilhamento inteligente
O Android 8.0 (nível 26 da API) reconhece as preferências de compartilhamento personalizado dos usuários e compreende melhor o tipo de conteúdo que deve ser compartilhado como cada aplicativo. Por exemplo, se um usuário tira uma foto de um recibo, o Android 8.0 pode sugerir um aplicativo de rastreamento de despesas. Se o usuário tirar uma selfie, um aplicativo de mídia social pode ser mais adequado para a imagem. O Android 8.0 aprende automaticamente todos esses padrões de acordo com as preferências personalizadas dos usuários.
O compartilhamento inteligente funciona para tipos de conteúdo diferentes de image
, como
audio
, video
, text
, URL
etc.
Para ativar o compartilhamento inteligente, adicione uma ArrayList
de até três
anotações de string para a intent que compartilha o conteúdo. As anotações devem
descrever os principais componentes ou tópicos do conteúdo. O exemplo de código a seguir
mostra como adicionar anotações à intent:
Kotlin
val annotations: ArrayList<String> = arrayListOf( "topic1", "topic2", "topic3" ) intent.putStringArrayListExtra( Intent.EXTRA_CONTENT_ANNOTATIONS, annotations )
Java
ArrayList<String> annotations = new ArrayList<>(); annotations.add("topic1"); annotations.add("topic2"); annotations.add("topic3"); intent.putStringArrayListExtra( Intent.EXTRA_CONTENT_ANNOTATIONS, annotations );
Para informações detalhadas sobre as anotações de compartilhamento inteligente, consulte
EXTRA_CONTENT_ANNOTATIONS
:
Classificador de texto
Em dispositivos compatíveis, os apps podem usar um novo classificador de texto para verificar se uma
string corresponde a um tipo de entidade de classificador conhecido e receber sugestões de
alternativas de seleção. As entidades reconhecidas pelo sistema incluem endereços, URLs,
números de telefone e endereços de e-mail. Para mais informações, consulte
TextClassifier
.
Acessibilidade
O Android 8.0 (nível 26 da API) oferece suporte a vários novos recursos de acessibilidade para desenvolvedores que criam seus próprios serviços de acessibilidade:
- Uma nova categoria de volume para ajustar acessibilidade volume.
- Gestos de impressão digital como um mecanismo de entrada.
- Multilíngue conversão de texto em voz.
- Um sistema baseado em hardware acessibilidade atalho para acessar rapidamente um serviço de acessibilidade preferencial.
- Suporte a gestos contínuos ou sequências programáticas de traços.
- Um botão de acessibilidade para invocar um dos vários recursos de acessibilidade ativados (disponível apenas em dispositivos que usam uma área de navegação renderizada por software).
- Padronizado valores de intervalo unilateral.
- Vários recursos para processar texto com mais facilidade, incluindo texto de dica e locais de caracteres de texto na tela.
Segurança e privacidade
Permissões
O Android 8.0 (nível 26 da API) introduz várias novas permissões relacionadas à telefonia:
- O
A permissão
ANSWER_PHONE_CALLS
permite que o app responda chamadas telefônicas recebidas de forma programática. Para lidar com uma chamada telefônica recebida no app, use o métodoacceptRingingCall()
. - O
A permissão
READ_PHONE_NUMBERS
concede ao app acesso de leitura a os números de telefone armazenados em um dispositivo.
Essas permissões são classificadas como
perigosas
e fazem parte do grupo de permissões
PHONE
.
Novas APIs de acesso e descoberta de contas
O Android 8.0 (API de nível 26) introduz várias melhorias na forma como tenham acesso a contas de usuário. Para as contas que gerenciam, os autenticadores podem usar suas próprias políticas para decidir se devem ocultar ou revelar contas para um app. O sistema Android rastreia aplicativos que podem acessar uma conta específica.
Nas versões anteriores do Android, os aplicativos que queriam acompanhar a lista de
contas de usuário precisavam receber atualizações sobre todas as contas, incluindo aquelas com
tipos não relacionados. O Android 8.0 adiciona a
addOnAccountsUpdatedListener(android.accounts.OnAccountsUpdateListener, android.os.Handler, boolean, java.lang.String[])
que permite que os apps especifiquem uma lista de tipos de conta
para o qual as alterações da conta devem ser recebidas.
Mudanças na API
O AccountManager oferece seis novos métodos para ajudar os autenticadores a gerenciar quais podem ver uma conta:
setAccountVisibility(android.accounts.Account, java.lang.String, int)
: define o nível de visibilidade para uma combinação específica de conta de usuário e pacote.-
getAccountVisibility(android.accounts.Account, java.lang.String)
: retorna o nível de visibilidade para uma combinação específica de conta de usuário e pacote. -
getAccountsAndVisibilityForPackage(java.lang.String, java.lang.String)
: permite que autenticadores recebam as contas e níveis de visibilidade de um determinado pacote. -
getPackagesAndVisibilityForAccount(android.accounts.Account)
: permite que os autenticadores recebam valores de visibilidade armazenados de uma determinada conta. -
addAccountExplicitly(android.accounts.Account, java.lang.String, android.os.Bundle, java.util.Map<java.lang.String, java.lang.Integer>)
: permite que autenticadores inicializem os valores de visibilidade de uma conta. -
addOnAccountsUpdatedListener(android.accounts.OnAccountsUpdateListener, android.os.Handler, boolean, java.lang.String[])
: adiciona um listenerOnAccountsUpdateListener
ao objetoAccountManager
. O sistema chama esse listener sempre que a lista de contas no dispositivo muda.
O Android 8.0 (API de nível 26) introduz dois valores especiais de nome de pacote para especificar a visibilidade
para aplicativos que não foram definidos usando o
setAccountVisibility(android.accounts.Account, java.lang.String, int)
. O valor de visibilidade
PACKAGE_NAME_KEY_LEGACY_VISIBLE
é aplicado a apps que têm a permissão
GET_ACCOUNTS
e são direcionados a versões do
Android anteriores ao Android 8.0 ou cujas
assinaturas correspondem ao autenticador quando direcionados a qualquer versão do Android.
PACKAGE_NAME_KEY_LEGACY_NOT_VISIBLE
oferece um valor de visibilidade padrão para
apps que não foram definidos anteriormente e para os quais
PACKAGE_NAME_KEY_LEGACY_VISIBLE
não é
aplicável.
Para mais informações sobre as novas APIs de acesso e descoberta de contas, consulte a
referência para
AccountManager
e
OnAccountsUpdateListener
.
Teste
Teste de instrumentação
O Android 8.0 (API de nível 26) oferece os seguintes recursos adicionais para a e testes de instrumentação.
Executar em processos não padrão do aplicativo
Agora é possível especificar que um teste de instrumentação específico seja executado um processo fora do processo padrão do seu app. Essa configuração é útil se o app tiver várias atividades executadas em processos diferentes.
Para definir a instrumentação de processos não padrão, navegue até o manifesto
e na pasta de destino
<instrumentation>
. Adicione o
atributo android:targetProcess
e defina o valor como uma das
opções a seguir:
- O nome de um determinado processo.
- Uma lista separada por vírgula de nomes de processo.
- Um caractere curinga (
"*"
), que permite executar a instrumentação em qualquer processo iniciado que execute código no pacote especificado em o atributoandroid:targetPackage
.
Enquanto o teste de instrumentação é executado, você pode verificar qual processo
que está testando, chamando getProcessName()
.
Relatar resultados durante um teste
Agora é possível relatar os resultados enquanto o teste de instrumentação estiver em execução.
em vez de depois, chamando addResults()
.
Intents simulados para testes
Para facilitar a criação de testes de IU independentes e isolados para as atividades
do app, o Android 8.0 (nível 26 da API) introduz o
método onStartActivity()
. Você modifica esse método em uma subclasse personalizada da
classe Instrumentation.ActivityMonitor
para processar uma intent
específica invocada pela classe de teste.
Quando sua classe de teste invoca o intent, o método retorna um objeto
Instrumentation.ActivityResult
de stub em vez de executar
o próprio intent. Ao usar essa lógica de intent simulado nos testes, você pode se concentrar
em como sua atividade prepara e lida com a intent que você transmite para uma
atividade diferente ou para um app totalmente diferente.
Tempo de execução e ferramentas
Otimizações de plataforma
O Android 8.0 (nível 26 da API) traz o tempo de execução e outras otimizações para a plataforma, resultando em várias melhorias de desempenho. Essas otimizações incluem coleta de lixo com compactação simultânea, uso mais eficiente da memória e da localidade do código.
Essas otimizações resultam em tempos de inicialização mais rápidos e melhor desempenho no SO e apps.
Suporte atualizado para a linguagem Java
O Android 8.0 (nível 26 da API) adiciona suporte a várias APIs Java do OpenJDK:
java.time
do OpenJDK 8.java.nio.file
ejava.lang.invoke
do OpenJDK 7.
Para saber mais sobre as classes e os métodos nessas classes , consulte a documentação de referência da API.
Se você quiser usar os recursos de linguagem do Java 8 no Android Studio, faça o download da versão de pré-lançamento mais recente.
ICU4J Android Framework APIs atualizadas
O Android 8.0 (API de nível 26) estende a
Framework do Android para ICU4J
APIs, que são um subconjunto das APIs ICU4J, para os desenvolvedores de apps poderem fazer
para uso no pacote android.icu
. Essas APIs usam dados de localização
presentes no dispositivo para você pode reduzir o tamanho do seu APK por não compilar as
bibliotecas ICU4J nele.
Tabela 1. Versões ICU, CLDR e Unicode usadas. no Android.
Nível da Android API | Versão ICU | Versão CLDR | Versão unicode |
---|---|---|---|
Android 7.0 (API nível 24), Android 7.1 (API nível 25) | 56 | 28 | 8.0 |
Android 8.0 (API de nível 26) | 58.2 | 30.0.3 | 9.0 |
Para mais informações sobre internacionalização no Android, incluindo Suporte a ICU4J, consulte Internacionalização no Android.
Android empresarial
Novos recursos e APIs empresariais foram introduzidos para dispositivos que executam Android 8.0 (nível 26 da API) Os destaques incluem:
- Os perfis de trabalho em dispositivos totalmente gerenciados permitem que as empresas separem o trabalho dados pessoais e gerenciar ambos.
- A delegação de APIs permite que os proprietários do dispositivo e de perfil atribuam o gerenciamento do app a outros aplicativos.
- Melhorias no fluxo de provisionamento da experiência do usuário (incluindo novas opções de personalização) reduzem o tempo de configuração.
- Novos controles sobre Bluetooth, Wi-Fi, backup e segurança permitem que as empresas gerenciem mais partes do dispositivo. Os registros de atividade de rede ajudam as empresas a monitorar problemas.
Para saber mais sobre esses e outros novos recursos e APIs para empresas do Android, consulte O Android nas empresas.