Recursos e APIs do Android 8.0

O Android 8.0 (API de nível 26) introduz uma variedade de novos recursos e funcionalidades para usuários e desenvolvedores. Este documento destaca as novidades para os desenvolvedores.

Confira também Mudanças de comportamento do Android 8.0 para saber mais sobre as áreas em que a plataforma muda 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 do modo de várias janelas usado principalmente para reprodução de vídeo. O modo PIP estava disponível originalmente para Somente Android TV O Android 8.0 disponibiliza esse recurso em outros dispositivos Android.

Quando uma atividade está no modo PIP, está em estado pausado, mas deveria continuar mostrando conteúdo. Por isso, certifique-se de que seu app não pausa a reprodução no onPause() . Em vez disso, pause o vídeo em onStop() e retome 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 proporção preferencial da atividade.

Os métodos PIP existentes descritos em Adição O picture-in-picture agora pode ser usados em todos os dispositivos Android, não apenas no Android TV. Além disso, O Android 8.0 oferece os seguintes métodos para compatibilidade 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 estiverem vazios, o sistema usará os valores definidos na última vez que você chamado Activity.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 entra no estado pausado, mas permanece começar. Se o usuário tocar na atividade PIP, o sistema mostrará um menu para interagir com o usuário, nenhum evento de toque alcança a atividade enquanto ela está no estado PIP.

  • Activity.setPictureInPictureParams(): Atualiza as configurações de PIP de uma atividade. Se a atividade for no modo PIP, as configurações serão atualizadas. isso é útil se a proporção da atividade muda. Se a atividade não estiver no modo PIP, essas definições de configuração são usadas independentemente da enterPictureInPictureMode() que você chamar.

Notificações

No Android 8.0 (API de nível 26), reformulamos as notificações para fornecem uma maneira mais fácil e consistente de gerenciar o comportamento das notificações e configurações. Essas mudanças incluem:

    Um menu de notificação de pressionamento longo no Android 8.0 (API de nível 26).

    Os usuários podem tocar nos ícones do iniciador de apps e mantê-los pressionados para visualizar notificações no Android 8.0.

  • 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 exibir. A interface do usuário se refere a canais de notificação como categorias de notificação. Para saber como para implementar canais de notificação, consulte Gerenciamento 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 aprender a trabalhar com pontos de notificação, consulte Notificação selos.
  • 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 atualizar uma notificação adiada não faz com que que ela reapareça.
  • Tempos limite de notificação: você pode definir um tempo limite ao criar um notificação usando setTimeoutAfter(): Use esse método para especificar um período após o qual uma notificação deve ser cancelado. Se necessário, você pode cancelar uma notificação antes do término do tempo limite especificado.
  • Configurações de notificação: você pode ligar setSettingsText() para definir o texto que aparece quando você cria um link para o configurações de notificação em uma notificação usando o Notification.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 e NOTIFICATION_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() do NotificationListenerService.
  • Cores de plano de fundo: você pode definir e ativar uma cor de plano de fundo para um notificação. Use esse recurso somente em notificações para tarefas contínuas que são essenciais para um usuário 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. Também é possível definir cor de fundo desejada usando setColor(): Ao fazer isso permite que você use setColorized() para ativar o uso de uma cor de plano de fundo para uma notificação.
  • Estilo de mensagens: no Android 8.0, as notificações que usam o Tela da classe MessagingStyle mais conteúdo na forma recolhida. Use o método Classe MessagingStyle para relacionadas a mensagens. Você também pode usar o Método addHistoricMessage() para fornecer contexto a uma conversa, adicionando de mensagens históricas a notificações relacionadas a mensagens.

Estrutura de preenchimento automático

A criação de contas, o login e as transações com cartão de crédito levam tempo e estão propensos a erros. Os usuários podem se frustrar facilmente com apps que exigem esses tipos de tarefas repetitivas.

O Android 8.0 (API de nível 26) faz o preenchimento de formulários, como login e de cartão de crédito, mais fáceis com a introdução da Estrutura de preenchimento automático. Os apps novos e existentes funcionam com a Estrutura de preenchimento automático depois que o usuário aceita preenchimento automático.

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 (API de nível 26) introduz um novo recurso, o Fonts in XML, que permite que você use fontes como recursos. Ou seja, 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. Isso significa que é muito mais fácil otimizar o tamanho do texto em diferentes telas 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 (API de nível 26) introduz ícones adaptativos na tela de início. Ícones adaptativos compatíveis com recursos visuais efeitos visuais e pode exibir uma variedade de formas em diferentes modelos de dispositivos. Para saber como criar ícones adaptativos, consulte a página Ícones adaptativos guia.

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 sinalização 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 seguinte:

  • API Version
  • Google SafeBrowsing API
  • Termination Handle API
  • API Renderer Importance

Para saber mais sobre como usar essas APIs, consulte Como gerenciar WebViews.

A classe WebView agora inclui uma API Safe Browsing para reforçar a segurança da navegação na Web. Para mais informações, consulte API Google Safe Browsing.

Fixação de atalhos e widgets

O Android 8.0 (API de nível 26) introduz a fixação 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 (API de nível 26) traz mudanças na forma de configurar a proporção máxima de um app.

Primeiro, o Android 8.0 introduz a maxAspectRatio, que você pode usar 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, pode especificar em qual tela a atividade deve 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 por vez pode estar no estado Retomado, mesmo se o app tem 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 alterações de tempo de execução conforme necessário. Sua atividade pode processar a mudança de configuração por conta própria ou permitir que o sistema destruir o processo que contém a atividade e recriá-la com o novo dimensões. Para mais informações, consulte Processamento de configurações Mudanças.

ActivityOptions fornece dois novos métodos de suporte 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:

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 de os novos atributos de layout vertical e horizontal, para criar o comportamento do 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, um View no seu app pode solicitar captura de ponteiro e define um listener para processar eventos de ponteiro capturados. A 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 mais informações sobre como usar esse recurso no app, consulte Captura de ponteiro.

Categorias de apps

O Android 8.0 (API de nível 26) permite que cada app declare uma categoria adequada quando for 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 seu aplicativo definindo o Atributo android:appCategory na sua <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 aplicativos podem publicar vários canais, e os usuários podem configurar quais canais quer 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 preenchimento de canais e programas são parte das APIs TvProvider, que são distribuídas como Módulo da Biblioteca de Suporte 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 definir a posição do conjunto de animações como um em um determinado momento. A reprodução ao contrário é útil se o app inclui animações para ações que podem ser desfeitas. Em vez de definir duas animações separadas é possível tocar a mesma música ao contrário.

Interação e navegação

Clusters de navegação por teclado

Se uma atividade no app usa uma hierarquia de visualização complexa, como a de Figura 2, considere organizar grupos de elementos de IU em agrupamentos para facilitar pelo teclado. Os usuários podem pressionar Meta+Tab ou Pesquisa+Tab ao 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.

Um exemplo de atividade que inclui cinco clusters de navegação que o usuário
  podem navegar usando o atalho do cluster de navegação do teclado. Os clusters
  aparecem na seguinte organização: painel superior, painel do lado esquerdo, conteúdo principal
  de navegação, painel inferior e botão de ação flutuante.
Figura 2. Atividade contendo cinco navegação clusters

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, mas não aninhados os clusters podem 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 isso configuração em um cluster, os usuários não poderão usar a tecla Tab ou as teclas de seta para navegar para dentro ou para fora do cluster; pressionar a barra de navegação do cluster combinação de teclado.

Foco padrão da vista

No Android 8.0 (API de nível 26), você pode atribuir a View que precisa receber foco depois que uma atividade (re)criada é retomada e o usuário pressiona um tecla de navegação do teclado, como a tecla Tab. 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

As atividades e os serviços podem usar instâncias do TextToSpeech para ditar e pronunciar o 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 chame a atenção para palavras específicas enquanto o mecanismo de conversão de texto em voz fala. para resolvê-los com rapidez.

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 monitorar o progresso da reprodução de uma conversão de texto em voz mecanismo, consulte a classe UtteranceProgressListener de referência.

Sistema

Novos detectores de StrictMode

O Android 8.0 (nível 26 da API) adiciona três novos detectores de StrictMode para ajudar a identificar possíveis bugs no seu aplicativo:

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 precisar liberar espaço em disco, ele começará excluindo os arquivos em cache dos apps que ultrapassarem a cota alocada. Assim, se você mantiver os dados armazenados em cache cota alocada, seus arquivos em cache serão os últimos a serem apagados no sistema quando necessários. Quando o sistema estiver decidindo quais arquivos em cache excluir do aplicativo, ele considere os arquivos mais antigos primeiro (conforme determinado pelo horário da modificação).

Há também dois novos comportamentos que podem ser ativados por diretório para controlar como o sistema libera os dados em cache:

  • StorageManager.setCacheBehaviorAtomic() pode ser usado para indicar que um diretório e todo o conteúdo dele sejam excluídos como uma única unidade atômica.
  • setCacheBehaviorTombstone(File, boolean) pode ser usado para indicar que, em vez de excluir arquivos dentro de um diretório, eles devem ser truncados para ter 0 bytes em tamanho original, 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 dispositivo tem espaço em disco suficiente para armazenar seus novos dados, chame getAllocatableBytes(UUID) em vez de usar getUsableSpace(), já que o primeiro vai considerar todos os dados dados que o sistema pode 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 aplicativo de fotos com muitos milhares de imagens podem consultar um subconjunto dos dados para apresentar em uma página. Cada página dos resultados retornados por um provedor de conteúdo são representados por um único Cursor objeto. Tanto o cliente quanto o provedor precisam implementar a paginação para usar esse recurso.

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

Os métodos ContentProvider e Agora, cada classe ContentResolver inclui um método refresh(), o que torna mais fácil para os clientes saberem se se as informações solicitadas estão atualizadas.

É possível adicionar lógica personalizada de atualização de conteúdo estendendo 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() da no lado do cliente apenas quando há uma forte indicação de que o conteúdo está desatualizado. O motivo mais comum para realizar esse tipo de atualização de conteúdo é em resposta a um recurso deslizar para atualizar um gesto, solicitando explicitamente que a interface atual exiba conteúdo atualizado.

Melhorias no JobScheduler

O Android 8.0 (API de nível 26) introduz várias melhorias na JobScheduler. Essas melhorias facilitam o trabalho do seu app para cumprir o novo pano de fundo limites de execução, já que geralmente é possível usar jobs programados para substituir serviços em segundo plano restritos ou broadcast receivers 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 na 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 chamado para iniciar um serviço de segundo plano, especialmente serviços que implementam IntentService:
  • No Android A Biblioteca de Suporte 26.0.0 apresenta uma nova classe JobIntentService, que fornece os mesmos funcionalidade como IntentService, mas usa jobs em vez de quando executados no Android 8.0 (nível 26 da API) ou mais recente.
  • Agora você pode ligar JobInfo.Builder.setClipData() para associar um ClipData a uma vaga. 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 para Context.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 será executado se o armazenamento disponível do dispositivo for 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 limitada, como a maioria dos dados da rede celular de negócios.

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. Usar 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 essa classe como parâmetro 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 PersistableBundle. que contém o arquivo de configuração e informações de desempenho, expressas como um mapa de atributos e valores. O método getMetrics() é definido para estas classes de mídia:

As métricas são coletadas separadamente para cada instância e mantidas 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 introduz uma nova seekTo(), que fornece controle de acesso refinado, 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 de chave) associadas a uma fonte de dados localizada logo antes ou no momento determinado.
  • 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 está 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 procurar continuamente, os apps precisam usar qualquer um dos modos SEEK_ em vez de SEEK_CLOSEST, que é executado relativamente mais devagar, 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);
    

    ver MediaRecorder.OutputFormat

  • O MediaMuxer agora pode lidar com inúmeras transmissões de áudio e vídeo. Você não está mais limitado a uma faixa de áudio e/ou de vídeo. Usar o addTrack() para misturar quantas faixas você quiser.
  • O MediaMuxer também pode adicionar uma ou mais faixas de metadados contendo por frame definidos pelo usuário. informações imprecisas ou inadequadas. O formato dos metadados é definido por seu aplicativo. A 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 de o sensor pode ser usado para estabilizar o vídeo.

Ao adicionar uma faixa de metadados, o formato MIME da faixa deve iniciar com o prefixo "application/". Gravar metadados é o mesmo que gravar dados de vídeo/áudio, mas que os dados não sejam provenientes de um MediaCodec. Em vez disso, o aplicativo passa uma ByteBuffer pelo carimbo de data/hora associado à 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

A 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, o provedor de documentos pode até fornecer acesso a arquivos que residem no armazenamento de rede ou que usam um protocolo como Protocolo de transferência de mídia (MTP, na sigla em inglês):

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 player de mídia não pode reproduzir o arquivo sem o arquivo . Portanto, a reprodução não pode começar até que o provedor de documentos termine fazer o download do arquivo.
  • Os gerenciadores de coleta de mídia, como apps de fotos, precisam passar por uma série de acessar URIs para alcançar mídia armazenada em um cartão SD externo por meio de escopo do Google Cloud. Esse padrão de acesso torna as operações em massa na mídia, como
  • Os gerentes de coleta de mídia não podem determinar o local de um documento de acordo com URI. Isso dificulta a escolha dos usuários por esses tipos de app. onde salvar um arquivo de mídia.

O Android 8.0 resolve cada um desses desafios, melhorando o acesso ao armazenamento de machine learning.

Provedores de documentos personalizados

A partir do Android 8.0, o framework de acesso ao armazenamento permite documentos personalizados provedores para criar descritores de arquivo pesquisável para arquivos que residem em um origem de dados remota. A SAF pode abrir um arquivo para obter um arquivo nativo pesquisável descritor. Em seguida, a SAF entrega solicitações de bytes discretas para os documentos. de nuvem. Esse recurso permite que um provedor de documentos retorne o intervalo exato de bytes solicitados por um app de player de mídia, em vez de armazenar todo o com antecedência.

Para usar esse recurso, é necessário chamar o novo método StorageManager.openProxyFileDescriptor(). A O método openProxyFileDescriptor() aceita um objeto ProxyFileDescriptorCallback como callback. A SAF invoca o retorno de chamada sempre que um aplicativo cliente executa operações de arquivo na descritor de arquivo retornado do provedor de documentos.

Acesso direto a documentos

A partir do Android 8.0 (API de nível 26), é possível usar o getDocumentUri() para recebe um URI que faz referência ao mesmo documento do 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. Dessa forma, os gerenciadores de mídia podem realizar operações de arquivo no documento muito mais rápido.

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 acesso permissão para arquivos de mídia, consulte a documentação de referência.

Caminhos para documentos

Ao usar o Framework de acesso ao armazenamento no Android 8.0 (API de nível 26), você pode usar o findDocumentPath(), disponível nas APIs os DocumentsContract e DocumentsProvider classes, para determinar o caminho da raiz de um sistema de arquivos de acordo com o tamanho ID. O método retorna esse caminho em uma DocumentsContract.Path. Nos casos em que um arquivo sistema tiver vários caminhos definidos para o mesmo documento, o método retornará o caminho mais usado para chegar ao documento com o ID fornecido.

Essa funcionalidade é particularmente útil nos seguintes cenários:

  • Seu 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.

Como 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 recuperam 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 isso, chamar registerAudioPlaybackCallback(), transmitindo uma instância do AudioManager.AudioPlaybackCallback. A A classe AudioManager.AudioPlaybackCallback contém a método onPlaybackConfigChanged(), que o sistema chama quando o áudio alterações na configuração de reprodução.

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 (API de nível 26) enriquece o suporte a Bluetooth da plataforma adicionando o seguinte 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 (API de nível 26) fornece APIs que permitem personalizar a caixa de diálogo de solicitação de pareamento ao tentar parear com dispositivos complementares 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 a Bluetooth. Para alterações no Bluetooth específicas do Android 8.0 (API de nível 26), consulte as seção Bluetooth do Página Mudanças de comportamento do Android 8.0.

Compartilhamento

Compartilhamento inteligente

O Android 8.0 (API de nível 26) aprende sobre compartilhamento personalizado suas preferências e entende melhor cada tipo de conteúdo. e apps para compartilhar. Por exemplo, se um usuário tirar uma foto de um comprovante, o Android 8.0 possa sugerir um app de controle de despesas; se o usuário tirar uma selfie, uma rede social o app pode processar melhor a imagem. O Android 8.0 aprende automaticamente todos esses de acordo com as necessidades preferências personalizadas.

O compartilhamento inteligente funciona para outros tipos de conteúdo além do image, como: audio, video, text e 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 descrevem 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 aplicativos podem usar um novo classificador de texto para verificar se um a string corresponde a um tipo de entidade do classificador conhecido e recebe sugestões de seleção alternativas. 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 (API de nível 26) oferece suporte a vários novos recursos de acessibilidade para desenvolvedores que criam os próprios serviços de acessibilidade:

. Para saber mais sobre como deixar seu app mais acessível, consulte Acessibilidade.

Segurança e privacidade

Permissões

O Android 8.0 (API de nível 26) introduz várias novas permissões relacionadas à telefonia:

Ambas as permissões são classificadas como perigosa e fazem parte do PHONE do grupo de permissões.

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 eles gerenciam, autenticadores podem usar suas próprias políticas para decidir se devem ocultar contas ou revelar contas para um aplicativo. O sistema Android rastreia aplicativos que podem acessar uma determinada conta.

Nas versões anteriores do Android, os apps 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:

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) . A PACKAGE_NAME_KEY_LEGACY_VISIBLE valor de visibilidade é aplicado a aplicativos que têm o GET_ACCOUNTS e as versões de destino com Android anterior à 8.0 ou com versões as assinaturas correspondem ao autenticador direcionado a qualquer versão do Android. PACKAGE_NAME_KEY_LEGACY_NOT_VISIBLE fornece um valor de visibilidade padrão para 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 contém 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 método android:targetProcess e defina o valor como um dos o seguinte:

  • 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 atributo android: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 interface isolados e independentes para o atividades, o Android 8.0 (API de nível 26) introduz a onStartActivity(). Você substitui esse método em uma subclasse personalizada do Instrumentation.ActivityMonitor para lidar com um determinado que a classe de teste invoca.

Quando a classe de teste invoca a intent, o método retorna um stub Instrumentation.ActivityResult em vez de executar a própria intent. Ao usar essa lógica de intent simulada nos testes, você pode se concentrar sobre como sua atividade prepara e processa a intent que você transmite a um atividade diferente ou para um aplicativo completamente diferente.

Ambiente de execução e Ferramentas

Otimizações de plataforma

O Android 8.0 (API de nível 26) traz o ambiente de execução e outras otimizações para a plataforma que resultam em uma série de melhorias no 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 à linguagem Java

O Android 8.0 (API de nível 26) adiciona suporte a várias outras APIs OpenJDK Java:

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 recursos da linguagem Java 8 no Android Studio, recomendamos 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 que você possa reduzir o tamanho do APK não compilando o Bibliotecas ICU4J no seu APK.

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.
  • Com a delegação de APIs, os proprietários de dispositivos e perfis podem atribuir apps o gerenciamento de configurações a outros aplicativos.
  • Melhorias na experiência do usuário no fluxo de provisionamento (incluindo novas opções de personalização) reduzem o tempo de configuração.
  • Os novos controles sobre Bluetooth, Wi-Fi, backup e segurança permitem que as empresas gerenciar mais do dispositivo. Os registros de atividade de rede ajudam as empresas a monitorar problemas.

Para saber mais sobre essas e outras novas APIs e recursos do Android Enterprise, consulte Android no Enterprise.