APIs do Android 5.0

API de nível: 21

O Android 5.0 (LOLLIPOP) oferece novos recursos para usuários e desenvolvedores de apps. Este documento fornece uma introdução às novas APIs mais importantes.

Se você tiver um app publicado, confira as Mudanças de comportamento do Android 5.0 que você precisa considerar no app. Essas mudanças de comportamento podem afetar o app em dispositivos Android 5.0, mesmo que você não esteja usando novas APIs ou visando novas funcionalidades.

Para ter uma visão geral dos novos recursos da plataforma, consulte os destaques do Android Lollipop.

Comece a desenvolver

Para começar a criar apps para o Android 5.0, é preciso primeiro fazer o download do SDK do Android. Em seguida, use o SDK Manager para fazer o download da plataforma do SDK do Android 5.0 e das imagens do sistema.

Atualização do nível da API

Para otimizar melhor o app para dispositivos com Android 5.0, defina targetSdkVersion como "21", instale o app em uma imagem do sistema Android 5.0, teste e publique o app atualizado com essa mudança.

Você pode usar as APIs do Android 5.0 e oferecer suporte a versões mais antigas, adicionando condições ao código que verificam o nível da API do sistema antes de executar APIs sem suporte da minSdkVersion. Para saber mais sobre como manter a compatibilidade com versões anteriores, leia Compatibilidade com diferentes versões da plataforma.

Para mais informações sobre como os níveis da API funcionam, leia O que é um nível da API?.

Mudanças de comportamento importantes

Caso tenha publicado anteriormente um aplicativo para Android, saiba que ele pode ser afetado pelas alterações no Android 5.0.

Consulte Mudanças no Android 5.0 para ver informações completas.

Interface do usuário

Compatibilidade com Material Design

O Android 5.0 adiciona suporte ao novo estilo do Material Design do Android. Com o Material Design, é possível criar apps visualmente dinâmicos e com transições de elementos de interface que parecem naturais para os usuários. Essa compatibilidade inclui:

  • O tema do Material
  • Sombras de visualizações
  • O widget RecyclerView
  • Animação de desenháveis e efeitos de estilo
  • Animação do Material Design e efeitos de transição de atividade
  • Animadores para propriedades de visualização com base no estado da visualização
  • Widgets de IU personalizáveis e barras de aplicativos com paletas de cores controláveis
  • Desenháveis animados e não animados com base em gráficos de vetor XML

Para saber mais sobre como adicionar a funcionalidade do Material Design ao seu app, consulte Material Design.

Documentos e atividades simultâneos na tela Recentes

Nas versões anteriores, a tela Recentes só podia exibir uma tarefa para cada app com que o usuário interagiu mais recentemente. Agora, seu app pode abrir mais tarefas, conforme necessário, para outras atividades simultâneas para documentos. Esse recurso facilita a multitarefa, permitindo que os usuários alternem rapidamente entre atividades e documentos individuais na tela "Recentes", com uma experiência de alternância consistente em todos os apps. Exemplos dessas tarefas simultâneas podem incluir guias abertas em um app de navegador da Web, documentos em um app de produtividade, partidas simultâneas em um jogo ou chats em um app de mensagens. Seu app pode gerenciar as tarefas usando a classe ActivityManager.AppTask.

Para inserir uma quebra lógica para que o sistema trate sua atividade como uma nova tarefa, use FLAG_ACTIVITY_NEW_DOCUMENT ao iniciar a atividade com startActivity(). Você também pode conseguir esse comportamento definindo o atributo documentLaunchMode do elemento <activity> como "intoExisting" ou "always" no manifesto.

Para evitar sobrecarregar a tela Recentes, você pode definir o número máximo de tarefas do app que podem aparecer nessa tela. Para isso, defina o atributo <application> android:maxRecents. Atualmente, é possível especificar no máximo 50 tarefas por usuário (25 para dispositivos com pouca RAM).

Tarefas na tela Recentes podem ser definidas para persistir em reinicializações. Para controlar o comportamento de persistência, use o atributo android:persistableMode. Você também pode mudar as propriedades visuais de uma atividade na tela "Recentes", como a cor, o rótulo e o ícone, chamando o método setTaskDescription().

Atualizações do WebView

O Android 5.0 atualiza a implementação de WebView para o Chromium M37, oferecendo melhorias de segurança e estabilidade, além de correções de bugs. A string do user agent padrão para um WebView em execução no Android 5.0 foi atualizada para incorporar 37.0.0.0 como o número da versão.

Esta versão introduz a classe PermissionRequest, que permite que o app conceda a permissão WebView para acessar recursos protegidos, como a câmera e o microfone, usando APIs da Web como getUserMedia(). Seu app precisa ter as permissões adequadas do Android para esses recursos para conceder as permissões ao WebView.

Com o novo método onShowFileChooser(), agora é possível usar um campo de formulário de entrada no WebView e iniciar um seletor de arquivos para selecionar imagens e arquivos do dispositivo Android.

Além disso, essa versão oferece suporte aos padrões abertos WebAudio, WebGL e WebRTC (links em inglês). Para saber mais sobre os novos recursos incluídos nessa versão, consulte WebView para Android.

Captura e compartilhamento de tela

O Android 5.0 permite adicionar recursos de captura e compartilhamento de tela ao seu app com as novas APIs android.media.projection. Essa funcionalidade é útil, por exemplo, se você quiser ativar o compartilhamento de tela em um app de videoconferência.

O novo método createVirtualDisplay() permite que seu app capture o conteúdo da tela principal (a tela padrão) em um objeto Surface, que o app poderá enviar pela rede. A API só permite capturar conteúdo não seguro da tela, e não o áudio do sistema. Para iniciar a captura de tela, o app precisa primeiro solicitar a permissão do usuário iniciando uma caixa de diálogo de captura de tela usando uma Intent recebida pelo método createScreenCaptureIntent().

Para ver um exemplo de como usar as novas APIs, consulte a classe MediaProjectionDemo no projeto de exemplo.

Notificações

Notificações na tela de bloqueio

As telas de bloqueio no Android 5.0 podem apresentar notificações. Os usuários podem escolher nas Configurações se querem permitir que o conteúdo de notificações confidenciais seja mostrado em uma tela de bloqueio segura.

Seu app pode controlar o nível de detalhamento visível quando as notificações são mostradas na tela de bloqueio segura. Para controlar o nível de visibilidade, chame setVisibility() e especifique um destes valores:

  • VISIBILITY_PRIVATE: mostra informações básicas, como o ícone da notificação, mas oculta o conteúdo completo.
  • VISIBILITY_PUBLIC: mostra todo o conteúdo da notificação.
  • VISIBILITY_SECRET: não mostra nada, excluindo até mesmo o ícone da notificação.

Quando o nível de visibilidade é VISIBILITY_PRIVATE, também é possível fornecer uma versão editada do conteúdo da notificação que oculta dados pessoais. Por exemplo, um app de SMS pode exibir uma notificação que mostre "Você tem três novas mensagens de texto", mas oculte o conteúdo e os remetentes da mensagem. Para fornecer essa notificação alternativa, primeiro crie a notificação de substituição usando Notification.Builder. Ao criar o objeto de notificação particular, anexe a notificação de substituição a ele usando o método setPublicVersion().

Metadados de notificação

O Android 5.0 usa metadados associados às notificações do app para classificá-las de maneira mais inteligente. Para definir os metadados, chame os seguintes métodos em Notification.Builder ao criar a notificação:

  • setCategory(): informa ao sistema como lidar com notificações de apps quando o dispositivo está no modo priority (por exemplo, se uma notificação representa uma chamada recebida, mensagem instantânea ou alarme).
  • setPriority(): marca a notificação como mais ou menos importante do que as notificações normais. As notificações com o campo de prioridade definido como PRIORITY_MAX ou PRIORITY_HIGH vão aparecer em uma pequena janela flutuante se elas também tiverem som ou vibração.
  • addPerson(): permite que você adicione uma ou mais pessoas relevantes a uma notificação. O app pode usar isso para sinalizar ao sistema que ele precisa agrupar as notificações das pessoas especificadas ou classificar as notificações dessas pessoas como mais importantes.

Gráficos

Compatibilidade com OpenGL ES 3.1

O Android 5.0 adiciona interfaces Java e suporte nativo para o OpenGL ES 3.1. As principais funcionalidades novas oferecidas no OpenGL ES 3.1 incluem:

  • Sombreadores de computação
  • Objetos shader separados
  • Comandos de desenho indiretos
  • Texturas multiamostra e de estêncil
  • Melhorias à linguagem de sombreamento
  • Extensões para o modo de mesclagem avançada e depuração
  • Compatibilidade reversa com o OpenGL ES 2.0 e 3.0

A interface Java para OpenGL ES 3.1 no Android é fornecida com GLES31. Ao usar o OpenGL ES 3.1, declare-o no arquivo de manifesto com a tag <uses-feature> e o atributo android:glEsVersion. Por exemplo:

<manifest>
    <uses-feature android:glEsVersion="0x00030001" />
    ...
</manifest>

Para mais informações sobre como usar o OpenGL ES, incluindo como verificar a versão do OpenGL ES compatível do dispositivo no momento da execução, consulte o guia da API OpenGL ES.

Pacote de extensões para Android

Além do OpenGL ES 3.1, esta versão oferece um pacote de extensão com interfaces Java e suporte nativo para funcionalidades gráficas avançadas. Essas extensões são tratadas como um único pacote pelo Android. Se a extensão ANDROID_extension_pack_es31a estiver presente, seu app poderá presumir que todas as extensões do pacote estejam presentes e ativar os recursos de linguagem de sombreamento com uma única instrução #extension.

O pacote de extensão oferece:

  • Suporte garantido ao sombreador de fragmento para buffers de armazenamento, imagens e atômicos. O suporte ao sombreador de fragmentos é opcional no OpenGL ES 3.1.
  • Sombreadores de mosaico e geometria
  • Formato de compactação de textura ASTC (LDR)
  • Sombreamento e interpolação por amostra
  • Modos diferentes de mesclagem para cada anexo colorido em um buffer de quadro

A interface Java para o pacote de extensões é fornecida com GLES31Ext. No manifesto do app, você pode declarar que o app precisa ser instalado somente em dispositivos compatíveis com o pacote de extensões. Por exemplo:

<manifest>
    <uses-feature android:name=“android.hardware.opengles.aep”
        android:required="true" />
    ...
</manifest>

Mídia

Camera API para recursos avançados da câmera

O Android 5.0 introduz a nova API android.hardware.camera2 para facilitar a captura de fotos com granularidade baixa e o processamento de imagens. Agora é possível acessar de forma programática os dispositivos de câmera disponíveis para o sistema com getCameraIdList() e se conectar a um dispositivo específico com openCamera(). Para começar a capturar imagens, crie uma CameraCaptureSession e especifique os objetos Surface para enviar imagens capturadas. O CameraCaptureSession pode ser configurado para tirar fotos individuais ou várias imagens de uma vez só.

Para receber uma notificação quando novas imagens forem capturadas, implemente o listener CameraCaptureSession.CaptureCallback e defina-o na solicitação de captura. Agora, quando o sistema concluir a solicitação de captura de imagem, o listener CameraCaptureSession.CaptureCallback receberá uma chamada para onCaptureCompleted(), fornecendo os metadados de captura de imagem em um CaptureResult.

A classe CameraCharacteristics permite que o app detecte quais recursos da câmera estão disponíveis no dispositivo. A propriedade INFO_SUPPORTED_HARDWARE_LEVEL do objeto representa o nível de funcionalidade da câmera.

  • Todos os dispositivos oferecem suporte pelo menos ao nível de hardware INFO_SUPPORTED_HARDWARE_LEVEL_LEGACY, que tem recursos aproximadamente equivalentes aos da API Camera descontinuada.
  • Os dispositivos compatíveis com o nível de hardware INFO_SUPPORTED_HARDWARE_LEVEL_FULL são capazes de controlar manualmente a captura e o pós-processamento, além de capturar imagens de alta resolução com frame rates altos.

Para saber como usar a API Camera atualizada, consulte os exemplos de implementação de Camera2Basic e Camera2Video nesta versão.

Reprodução de áudio

Essa versão inclui as seguintes mudanças em AudioTrack:

  • Seu app agora pode fornecer dados de áudio no formato de ponto flutuante (ENCODING_PCM_FLOAT). Isso permite maior alcance dinâmico, precisão mais consistente e margem maior. A aritmética do ponto de flutuação é muito útil durante cálculos intermediários. Os pontos de extremidade de reprodução usam formato de número inteiro para dados de áudio com menor intensidade de bits No Android 5.0, partes do pipeline interno ainda não são pontos flutuantes.
  • Agora seu app pode fornecer dados de áudio como um ByteBuffer, no mesmo formato fornecido por MediaCodec.
  • A opção WRITE_NON_BLOCKING pode simplificar o armazenamento em buffer e o uso de várias linhas de execução para alguns apps.

Controle de reprodução de mídia

Use as novas APIs de notificação e mídia para garantir que a interface do sistema saiba sobre sua reprodução de mídia e possa extrair e mostrar a arte do álbum. Controlar a reprodução de mídia em uma interface e um serviço agora ficou mais fácil com as novas classes MediaSession e MediaController.

A nova classe MediaSession substitui a classe descontinuada RemoteControlClient e fornece um único conjunto de métodos de callback para gerenciar controles de transporte e botões de mídia. Se o app oferece reprodução de mídia e é executado na plataforma Android TV ou Wear, use a classe MediaSession para processar os controles de transporte usando os mesmos métodos de callback.

Agora, você pode criar seu próprio app controlador de mídia com a nova classe MediaController. Essa classe oferece uma maneira segura de linha de execução de monitorar e controlar a reprodução de mídia do processo de interface do app. Ao criar um controlador, especifique um objeto MediaSession.Token para que seu app possa interagir com o MediaSession especificado. Ao usar os métodos MediaController.TransportControls, você pode enviar comandos como play(), stop(), skipToNext() e setRating() para controlar a reprodução de mídia nessa sessão. Com o controlador, também é possível registrar um objeto MediaController.Callback para detectar mudanças de estado e metadados na sessão.

Além disso, você pode criar notificações avançadas que permitem o controle de reprodução vinculado a uma sessão de mídia com a nova classe Notification.MediaStyle.

Pesquisa de mídia

O Android 5.0 introduz um recurso para os apps navegarem pela biblioteca de conteúdo de mídia de outro app, por meio da nova API android.media.Browse. Para expor o conteúdo de mídia no app, estenda a classe MediaBrowserService. A implementação de MediaBrowserService precisa fornecer acesso a um MediaSession.Token para que os apps possam abrir conteúdo de mídia fornecido pelo seu serviço.

Para interagir com um serviço de navegação de mídia, use a classe MediaBrowser. Especifique o nome do componente para um MediaSession ao criar uma instância de MediaBrowser. Usando essa instância do navegador, seu app poderá se conectar ao serviço associado e receber um objeto MediaSession.Token para reproduzir conteúdo exposto por esse serviço.

Armazenamento

Seleção de diretório

O Android 5.0 estende o Framework de acesso ao armazenamento para permitir que os usuários selecionem uma subárvore de diretórios inteira, concedendo aos apps acesso de leitura/gravação a todos os documentos contidos sem exigir a confirmação do usuário para cada item.

Para selecionar uma subárvore de diretórios, crie e envie uma intent OPEN_DOCUMENT_TREE. O sistema exibe todas as instâncias de DocumentsProvider que oferecem suporte à seleção de subárvores, permitindo que o usuário procure e selecione um diretório. O URI retornado representa o acesso à subárvore selecionada. É possível usar buildChildDocumentsUriUsingTree() e buildDocumentUriUsingTree() com query() para explorar a subárvore.

O novo método createDocument() permite criar novos documentos ou diretórios em qualquer lugar abaixo da subárvore. Para gerenciar documentos atuais, use renameDocument() e deleteDocument(). Verifique COLUMN_FLAGS para conferir o suporte do provedor para essas chamadas antes de emiti-las.

Se você estiver implementando um DocumentsProvider e quiser oferecer suporte à seleção de subárvore, implemente isChildDocument() e inclua FLAG_SUPPORTS_IS_CHILD no COLUMN_FLAGS.

O Android 5.0 também introduz novos diretórios específicos de pacotes no armazenamento compartilhado, em que o app pode colocar arquivos de mídia para inclusão em MediaStore. O novo getExternalMediaDirs() retorna os caminhos para esses diretórios em todos os dispositivos de armazenamento compartilhado. Da mesma forma que getExternalFilesDir(), nenhuma permissão adicional é necessária para o app acessar os caminhos retornados. A plataforma procura periodicamente novas mídias nesses diretórios, mas também é possível usar MediaScannerConnection para verificar explicitamente se há novo conteúdo.

Redes sem fio e conectividade

Diversas conexões de rede

O Android 5.0 oferece novas APIs de várias redes que permitem que o app verifique dinamicamente se há redes disponíveis com recursos específicos e estabeleça uma conexão com elas. Essa funcionalidade é útil quando o app requer uma rede especializada, como uma rede COMPL, MMS ou de faturamento por operadora, ou se você quer enviar dados usando um tipo específico de protocolo de transporte.

Para selecionar e se conectar dinamicamente a uma rede no app, siga estas etapas:

  1. Crie uma ConnectivityManager.
  2. Use a classe NetworkRequest.Builder para criar um objeto NetworkRequest e especificar os recursos de rede e o tipo de transporte em que seu app está interessado.
  3. Para procurar redes adequadas, chame requestNetwork() ou registerNetworkCallback() e transmita o objeto NetworkRequest e uma implementação de ConnectivityManager.NetworkCallback. Use o método requestNetwork() se você quiser mudar ativamente para uma rede adequada assim que ela for detectada. Para receber apenas notificações de redes verificadas sem alternar ativamente, use o método registerNetworkCallback().

Quando o sistema detecta uma rede adequada, ele se conecta a ela e invoca o callback onAvailable(). É possível usar o objeto Network do callback para receber mais informações sobre a rede ou direcionar o tráfego para usar a rede selecionada.

Bluetooth de baixa energia

O Android 4.3 introduziu compatibilidade com a plataforma para o Bluetooth de baixa energia (Bluetooth LE) no papel central. No Android 5.0, um dispositivo Android agora pode agir como um dispositivo periférico Bluetooth LE. Os apps podem usar esse recurso para tornar a presença deles conhecida para dispositivos por perto. Por exemplo, é possível criar apps que permitam que um dispositivo funcione como um pedômetro ou monitor de integridade e comunique os dados com outro dispositivo Bluetooth LE.

As novas APIs android.bluetooth.le permitem que seus apps transmitam anúncios, verifiquem respostas e estabeleçam conexões com dispositivos Bluetooth LE por perto. Para usar os novos recursos de publicidade e verificação, adicione a permissão BLUETOOTH_ADMIN ao manifesto. Quando os usuários atualizam ou fazem o download do seu app na Play Store, eles são solicitados a conceder a seguinte permissão a ele: "Informações de conexão Bluetooth: permite que o app controle o Bluetooth, incluindo a transmissão ou o recebimento de informações sobre dispositivos Bluetooth por perto".

Para iniciar a publicidade Bluetooth LE para que outros dispositivos possam descobrir seu app, chame startAdvertising() e transmita uma implementação da classe AdvertiseCallback. O objeto de callback recebe um relatório do sucesso ou falha da operação de publicidade.

O Android 5.0 introduz a classe ScanFilter para que o app possa procurar apenas os tipos específicos de dispositivos em que está interessado. Para começar a procurar dispositivos Bluetooth LE, chame startScan() e transmita uma lista de filtros. Na chamada do método, também é necessário fornecer uma implementação de ScanCallback para informar quando um anúncio Bluetooth LE é encontrado.

Melhorias à NFC

O Android 5.0 adiciona estas melhorias para permitir o uso mais amplo e flexível da NFC:

  • O Android Beam agora está disponível no menu Compartilhar.
  • Seu app pode invocar o Android Beam no dispositivo do usuário para compartilhar dados chamando invokeBeam(). Isso evita a necessidade do usuário tocar manualmente no dispositivo em outro dispositivo compatível com NFC para concluir a transferência de dados.
  • É possível usar o novo método createTextRecord() para criar um registro NDEF contendo dados de texto UTF-8.
  • Se você estiver desenvolvendo um app de pagamento, agora é possível registrar um ID do aplicativo NFC (AID, na sigla em inglês) de maneira dinâmica chamando registerAidsForService(). Também é possível usar setPreferredService() para definir o serviço de emulação de cartão preferencial que precisa ser usado quando uma atividade específica estiver em primeiro plano.

Project Volta

Além dos novos recursos, o Android 5.0 enfatiza melhorias na duração da bateria. Use as novas APIs e ferramentas para entender e otimizar o consumo de energia do seu app.

Agendamento de trabalhos

O Android 5.0 oferece uma nova API JobScheduler que permite otimizar a duração da bateria definindo tarefas para que o sistema seja executado de forma assíncrona posteriormente ou sob condições específicas (como quando o dispositivo está carregando). O agendamento de tarefas é útil em situações como quando:

  • O aplicativo tem tarefas não orientadas ao usuário que podem ser adiadas.
  • O app tem um trabalho que você preferiria fazer quando a unidade estiver conectada.
  • O app tem uma tarefa que exige acesso à rede ou uma conexão Wi-Fi.
  • O app tem diversas tarefas que você quer executar em lote com uma programação regular.

Uma unidade de trabalho é encapsulada por um objeto JobInfo. Esse objeto especifica os critérios de agendamento.

Use a classe JobInfo.Builder para configurar como a tarefa agendada será executada. É possível programar a tarefa para ser executada sob condições específicas, como:

  • Iniciar quando o dispositivo estiver carregando
  • Iniciar quando o dispositivo estiver conectado a uma rede ilimitada
  • Iniciar quando o dispositivo estiver ocioso
  • Terminar antes de um determinado prazo ou com um mínimo de atraso

Por exemplo, você pode adicionar um código como este para executar a tarefa em uma rede ilimitada:

Kotlin

val uploadTask: JobInfo = JobInfo.Builder(
        jobId,
        serviceComponent /* JobService component */
).run {
    setRequiredNetworkType(JobInfo.NETWORK_TYPE_UNMETERED)
    build()
}
val jobScheduler = context.getSystemService(Context.JOB_SCHEDULER_SERVICE) as JobScheduler
jobScheduler.schedule(uploadTask)

Java

JobInfo uploadTask = new JobInfo.Builder(jobId,
                                         serviceComponent /* JobService component */)
        .setRequiredNetworkCapabilities(JobInfo.NETWORK_TYPE_UNMETERED)
        .build();
JobScheduler jobScheduler =
        (JobScheduler) context.getSystemService(Context.JOB_SCHEDULER_SERVICE);
jobScheduler.schedule(uploadTask);

Se o dispositivo tiver energia estável (ou seja, se estiver conectado por mais de dois minutos e a bateria estiver em um nível íntegro), o sistema vai executar qualquer job programado pronto para ser executado, mesmo que o prazo do job não tenha expirado.

Para conferir um exemplo de como usar a API JobScheduler, consulte o exemplo de implementação JobSchedulerSample nesta versão.

Ferramentas de desenvolvedor para uso da bateria

O novo comando dumpsys batterystats gera dados estatísticos interessantes sobre o uso da bateria de um dispositivo, organizados pelo ID de usuário exclusivo (UID, na sigla em inglês). As estatísticas incluem:

  • Histórico de eventos relacionados à bateria
  • Estatísticas gerais do dispositivo
  • Uso aproximado da bateria por UID e componentes do sistema
  • Ms por dispositivo móvel por pacote
  • Estatísticas agregadas do UID do sistema
  • Estatísticas agregadas do UID do app

Use a opção --help para saber mais sobre as várias opções de personalização da saída. Por exemplo, para imprimir as estatísticas de uso da bateria de um determinado pacote de apps desde a última carga do dispositivo, execute este comando:

$ adb shell dumpsys batterystats --charged <package-name>

Você pode usar a ferramenta Battery Historian na saída do comando dumpsys para gerar uma visualização HTML de eventos relacionados à energia dos registros. Essas informações facilitam a compreensão e o diagnóstico de qualquer problema relacionado à bateria.

Android no local de trabalho e na educação

Provisionamento gerenciado

O Android 5.0 oferece uma nova funcionalidade para a execução de apps em um ambiente corporativo. Um administrador de dispositivo pode iniciar um processo de provisionamento gerenciado para adicionar um perfil gerenciado copresente, mas separado, a um dispositivo, se o usuário tiver uma conta pessoal. Os apps associados a perfis gerenciados aparecem ao lado dos apps não gerenciados na tela de início, na tela Recentes e nas notificações do usuário.

Para iniciar o processo de provisionamento gerenciado, envie ACTION_PROVISION_MANAGED_PROFILE em um Intent. Se a chamada for bem-sucedida, o sistema vai acionar o callback onProfileProvisioningComplete(). Em seguida, chame setProfileEnabled() para ativar esse perfil gerenciado.

Por padrão, somente um subgrupo de aplicativos são habilitados no perfil gerenciado. Para instalar outros apps no perfil gerenciado, chame enableSystemApp().

Se você estiver desenvolvendo um app de acesso rápido, poderá usar a nova classe LauncherApps para acessar uma lista de atividades inicializáveis para o usuário atual e todos os perfis gerenciados associados. A tela de início pode destacar visualmente os apps gerenciados adicionando um selo de trabalho ao drawable de ícone. Para recuperar o ícone com selo, chame getUserBadgedIcon().

Para saber como usar a nova funcionalidade, consulte o exemplo de implementação de BasicManagedProfile nesta versão.

Proprietário de dispositivo

O Android 5.0 apresenta a capacidade de implantar um app proprietário do dispositivo. Um proprietário de dispositivo é um tipo especializado de administrador de dispositivo que tem a capacidade adicional de criar e remover usuários secundários e definir configurações globais no dispositivo. O app proprietário do dispositivo pode usar os métodos na classe DevicePolicyManager para assumir um controle detalhado da configuração, da segurança e dos apps em dispositivos gerenciados. Um dispositivo só pode ter um proprietário de dispositivo ativo por vez.

Para implantar e ativar um proprietário de dispositivo, você precisa realizar uma transferência de dados NFC de um app de programação para o dispositivo enquanto ele estiver no estado não provisionado. Essa transferência de dados envia as mesmas informações que a intent de provisionamento descrita em Provisionamento gerenciado.

Fixar tela

O Android 5.0 introduz uma nova API de fixação de tela que permite impedir temporariamente que os usuários deixem sua tarefa ou sejam interrompidos por notificações. Isso pode ser usado, por exemplo, se você estiver desenvolvendo um app educacional para oferecer suporte a avaliações de alto risco no Android ou um aplicativo de quiosque ou de finalidade única. Quando o app ativar a fixação de tela, os usuários não poderão ver as notificações, acessar outros apps nem voltar à tela inicial até que o app saia do modo.

Há duas formas de ativar a fixação de tela:

  • Manualmente:os usuários podem ativar a fixação de tela em Configurações > Segurança > Fixação de tela e selecionar as tarefas que querem fixar tocando no ícone de fixação verde na tela "Recentes".
  • De forma programática:para ativar a fixação de tela de forma programática, chame startLockTask() no app. Se o app solicitante não for um proprietário do dispositivo, o usuário vai receber uma confirmação. Um app proprietário do dispositivo pode chamar o método setLockTaskPackages() para permitir que apps sejam fixados sem a etapa de confirmação do usuário.

Quando o bloqueio de tarefas estiver ativo, ocorrerá o seguinte comportamento:

  • A barra de status vai ficar em branco, e as notificações do usuário e informações de status vão ficar ocultas.
  • Os botões Home e Recent Apps serão ocultados.
  • Outros aplicativos não poderão iniciar novas atividades.
  • O app atual pode iniciar novas atividades, desde que isso não crie novas tarefas.
  • Quando a fixação de tela é invocada por um proprietário do dispositivo, o usuário permanece bloqueado no seu app até que ele chame stopLockTask().
  • Se a fixação de tela for ativada por outro app que não seja o proprietário do dispositivo ou diretamente pelo usuário, ele poderá sair pressionando os botões "Voltar" e "Recentes".

Estrutura de impressão

Renderização de PDF como bitmap

Agora é possível renderizar páginas de documentos PDF em imagens bitmap para impressão usando a nova classe PdfRenderer. É necessário especificar um ParcelFileDescriptor pesquisável (ou seja, o conteúdo que pode ser acessado aleatoriamente) em que o sistema grava o conteúdo para impressão. Seu app pode acessar uma página para renderização com openPage() e, em seguida, chamar render() para transformar o PdfRenderer.Page aberto em um bitmap. Também é possível definir outros parâmetros caso você queira apenas converter uma parte do documento em uma imagem bitmap (por exemplo, para implementar a renderização em blocos para aumentar o zoom do documento).

Para ver um exemplo de como usar as novas APIs, consulte o exemplo PdfRendererBasic.

Sistema

Estatísticas de uso do aplicativo

Agora é possível acessar o histórico de uso do app em um dispositivo Android com a nova API android.app.usage. Essa API fornece informações de uso mais detalhadas do que o método descontinuado getRecentTasks(). Para usar essa API, primeiro é necessário declarar a permissão "android.permission.PACKAGE_USAGE_STATS" no manifesto. O usuário também precisa ativar o acesso a esse app em Configurações > Segurança > Apps com acesso de uso.

O sistema coleta os dados de uso por app, agregando os dados em intervalos diários, semanais, mensais e anuais. O tempo máximo que o sistema mantém esses dados é o seguinte:

  • Dados diários: 7 dias
  • Dados semanais: 4 semanas
  • Dados mensais: 6 meses
  • Dados anuais: dois anos

Para cada aplicativo, o sistema registra os seguintes dados:

  • A última vez em que o aplicativo foi usado
  • O tempo total que o app ficou em primeiro plano nesse intervalo de tempo (por dia, semana, mês ou ano)
  • Captura de carimbo de data/hora quando um componente (identificado por um pacote e nome de atividade) é movido para o primeiro ou segundo plano durante um dia
  • Captura de carimbo de data/hora quando a configuração de um dispositivo mudou (como quando a orientação do dispositivo mudou devido à rotação)

Testes e acessibilidade

Melhorias de teste e acessibilidade

O Android 5.0 adiciona o seguinte suporte para testes e acessibilidade:

  • Os novos métodos getWindowAnimationFrameStats() e getWindowContentFrameStats() capturam estatísticas de frames para animações e conteúdo da janela. Esses métodos permitem criar testes de instrumentação para avaliar se um app está renderizando frames com uma frequência de atualização suficiente para oferecer uma boa experiência ao usuário.
  • O novo método executeShellCommand() permite executar comandos do shell no teste de instrumentação. A execução do comando é semelhante à execução do adb shell em um host conectado ao dispositivo, permitindo que você use ferramentas baseadas em shell, como dumpsys, am, content e pm.
  • Os serviços de acessibilidade e as ferramentas de teste que usam as APIs de acessibilidade (como UiAutomator) agora podem extrair informações detalhadas sobre as propriedades das janelas na tela com as quais os usuários com deficiência visual podem interagir. Para extrair uma lista de objetos AccessibilityWindowInfo, chame o novo método getWindows().
  • A nova classe AccessibilityNodeInfo.AccessibilityAction permite definir ações padrão ou personalizadas a serem realizadas em um AccessibilityNodeInfo. A nova classe AccessibilityNodeInfo.AccessibilityAction substitui as APIs relacionadas a ações anteriormente encontradas em AccessibilityNodeInfo.
  • O Android 5.0 oferece controle mais refinado sobre a síntese de conversão de texto em voz no seu app. A nova classe Voice permite que seu app use perfis de voz associados a localidades específicas, classificação de qualidade e latência, além de parâmetros específicos do mecanismo de conversão de texto em voz.

IME

Troca mais fácil entre idiomas de entrada

No Android 5.0 e versões mais recentes, os usuários podem alternar mais facilmente entre todos os Editores de método de entrada (IME, na sigla em inglês) com suporte à plataforma. A execução da ação de alternância designada (geralmente tocando em um ícone de globo no teclado virtual) percorre todos esses IMEs. Essa mudança de comportamento é implementada pelo método shouldOfferSwitchingToNextInputMethod().

Além disso, o framework agora verifica se o próximo IME inclui um mecanismo de alternância e, portanto, se esse IME oferece suporte à mudança para o IME seguinte. Um IME com um mecanismo de alternância não percorrerá um IME sem esse mecanismo. Essa mudança de comportamento é implementada pelo método switchToNextInputMethod().

Para conferir um exemplo de como usar as APIs atualizadas de alternância de IME, consulte o exemplo de implementação de teclado virtual nesta versão. Para saber mais sobre como implementar a alternância entre IMEs, consulte Como criar um método de entrada.

Declarações do manifesto

Recursos necessários declaráveis

Os valores a seguir agora têm suporte no elemento <uses-feature>, para que você possa garantir que seu app seja instalado somente em dispositivos que fornecem os recursos de que seu app precisa.

Permissões do usuário

A permissão a seguir agora tem suporte do elemento <uses-permission> para declarar as permissões que seu app precisa para acessar determinadas APIs.

  • BIND_DREAM_SERVICE: ao segmentar a API de nível 21 e versões mais recentes, essa permissão é exigida por um serviço Daydream para garantir que somente o sistema possa se vincular a ele.