O segundo Visualização do Desenvolvedor do Android 11 já está disponível, teste e compartilhe seu feedback.

Android 5.0 APIs

Nível da API: 21

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

Se você tem um aplicativo publicado, não deixe de conferir as Mudanças de comportamento do Android 5.0 que você deve considerar no seu aplicativo. Essas mudanças de comportamento podem afetar seu aplicativo em dispositivos com Android 5.0, mesmo que você não esteja usando APIs novas nem visando novas funcionalidades.

Para obter uma visão mais detalhada dos novos recursos de plataforma, dê uma olhada em destaques do Android Lollipop.

Comece a desenvolver

Para começar a desenvolver aplicativos para o Android 5.0, você precisa obter o Android SDK. Em seguida, use o SDK Manager para baixar a plataforma Android 5.0 SDK e as imagens do sistema.

Atualização do nível da API

Para otimizar o aplicativo para dispositivos que usam o Android 5.0, defina a targetSdkVersion como "21", instale o aplicativo em uma imagem do sistema do Android 5.0, teste e publique o aplicativo atualizado com essa alteração.

Você pode usar as Android 5.0 APIs e ainda oferecer compatibilidade com versões anteriores adicionando ao código condições que verifiquem o nível da API do sistema antes de executar APIs não compatíveis com sua minSdkVersion. Para saber mais sobre manutenção de retrocompatibilidade, leia Compatibilidade com diferentes versões de plataforma.

Para obter mais informações sobre como os níveis de API funcionam, leia O que é o nível de uma 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 Alterações no Android 5.0 para obter informações completas.

Interface do usuário

Compatibilidade com Material Design

O Android 5.0 oferece compatibilidade com o novo estilo do Material Design do Android. Com o Material Design, é possível criar aplicativos visualmente dinâmicos e com transições de elemento de IU 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 o recurso Material Design ao seu aplicativo, consulte Material Design.

Documentos e atividades simultâneos na tela Recentes

Em versões anteriores, a tela Recentes só podia exibir uma tarefa para cada aplicativo com o qual o usuário tenha interagido mais recentemente. Agora, o aplicativo pode abrir mais tarefas, conforme necessário, para atividades simultâneas adicionais para documentos. Esse recurso facilita a multitarefa, já que permite que os usuários alternem rapidamente entre atividades e documentos individuais pela tela Recentes, com uma experiência de troca consistente em todos os aplicativos. Exemplos de tais tarefas concomitantes podem incluir abas abertas em um aplicativo de navegador da Web, documentos em um aplicativo de produtividade, partidas simultâneas em um jogo ou bate-papos em um aplicativo de conversa. Seu aplicativo pode gerenciar suas tarefas com 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 inicializar a atividade com startActivity(). Esse comportamento também pode ser obtido definindo o atributo documentLaunchMode do elemento <activity> como "intoExisting" ou "always" no manifesto.

Para evitar que a tela Recentes seja sobrecarregada, é possível definir o número máximo de tarefas do aplicativo que podem aparecer nessa tela. Para tanto, 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. Além disso, é possível alterar as propriedades visuais de uma atividade na tela Recentes, como a cor, o rótulo e o ícone da atividade, chamando o método setTaskDescription().

Atualizações do WebView

O Android 5.0 atualiza a implementação WebView para Chromium M37, oferecendo melhorias de segurança e estabilidade, assim como correções de erros. A string padrão de agente do usuário para uma WebView executada no Android 5.0 foi atualizada para incorporar 37.0.0.0 como número da versão.

Esta versão introduz a classe PermissionRequest, que permite que o seu aplicativo conceda à WebView permissão para acessar recursos protegidos, como a câmera e o microfone, usando Web APIs como getUserMedia(). O seu aplicativo deve ter as permissões apropriadas do Android para esses recursos para poder conceder permissões à WebView.

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

Além disso, essa versão disponibiliza compatibilidade com os padrões abertos WebAudio, WebGL e WebRTC. 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 os recursos de captura e compartilhamento de tela ao seu aplicativo com as novas android.media.projection APIs. Esse recurso é útil, por exemplo, se você quiser permitir o compartilhamento de tela em um aplicativo de videoconferência.

O novo método createVirtualDisplay() permite que o aplicativo capture o conteúdo da tela principal (a tela padrão) em um objeto Surface que o aplicativo pode enviar pela rede. A API só permite capturar conteúdo não protegido da tela, não do áudio do sistema. Para começar a captura de tela, o seu aplicativo deverá solicitar a permissão do usuário executando a caixa de diálogo de captura de tela usando uma Intent obtida pelo método createScreenCaptureIntent().

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

Notificações

Notificações na tela de bloqueio

As telas de bloqueio no Android 5.0 têm a capacidade de apresentar notificações. Os usuários podem escolher em Settings se desejam permitir que conteúdo de notificações sigilosas será mostrado em uma tela de bloqueio protegida.

O aplicativo pode controlar o nível de detalhamento visível quando suas notificações forem exibidas na tela de bloqueio protegida. Para controlar o nível de visibilidade, chame setVisibility() e especifique um destes valores:

  • VISIBILITY_PRIVATE: Exibe informações básicas, como o ícone da notificação, mas oculta o conteúdo integral da notificação.
  • VISIBILITY_PUBLIC: Exibe o conteúdo integral da notificação.
  • VISIBILITY_SECRET: Não exibe nada, inclusive o ícone da notificação.

Quando o nível de visibilidade é VISIBILITY_PRIVATE, também é possível oferecer uma versão alternativa do conteúdo da notificação que oculte dados pessoais. Por exemplo, um aplicativo de SMS pode exibir uma notificação que informe "Você tem 3 novas mensagens de texto", mas oculte o conteúdo e os remetentes. Para fornecer essa notificação alternativa, crie uma notificação de substituição usando Notification.Builder. Ao criar o objeto de notificação privada, 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 aplicativo para organizar as notificações de forma mais inteligente. Para definir os metadados, chame os seguintes métodos no Notification.Builder ao construir a notificação:

  • setCategory(): Diz ao sistema como lidar com as notificações do aplicativo quando o dispositivo estiver no modo Priority (por exemplo, se a notificação representar uma chamada recebida, uma mensagem instantânea ou um alarme).
  • setPriority(): Marca a notificação como mais ou menos importante do que notificações normais. Notificações com o campo Priority definido como PRIORITY_MAX ou PRIORITY_HIGH aparecem em uma pequena janela flutuante se a notificação também tiver som ou vibração.
  • addPerson(): Permite adicionar uma ou mais pessoas relevantes a uma notificação. O aplicativo pode usar isso para sinalizar ao sistema que ele deve agrupar as notificações de pessoas específicas ou classificar notificações dessas pessoas como sendo mais importantes.

Gráficos

Compatibilidade com OpenGL ES 3.1

O Android 5.0 adiciona interfaces Java e compatibilidade nativa com OpenGLES 3.1. As principais novas funcionalidades fornecidas 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 isso no arquivo de manifesto junto com a tag <uses-feature> e o atributo android:glEsVersion. Por exemplo:

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

Para obter mais informações sobre como usar o OpenGL ES, incluindo como verificar a versão do OpenGL ES compatível do dispositivo no tempo de execução, consulte o guia da API do 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 compatibilidade nativa para funcionalidades de gráficos avançados. Essas extensões são tratadas como um único pacote pelo Android (se a extensão ANDROID_extension_pack_es31a estiver presente, o aplicativo poderá presumir que todas as extensões do pacote estão presentes e ativar os recursos de linguagem de sombreamento com uma única declaração de #extension).

O pacote de extensão oferece:

  • Compatibilidade garantida com o sombreador de fragmentos para buffers de armazenamento, imagens e atômicos (a compatibilidade com 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 aplicativo, é possível declarar que o aplicativo precisa ser instalado somente em dispositivos que ofereçam suporte ao 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 apresenta a nova android.hardware.camera2 API para facilitar a captura de fotos com granularidade baixa e o processamento de imagens. Agora, você pode acessar programaticamente os dispositivos de câmera disponíveis para o sistema com getCameraIdList() e conectar-se 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. A CameraCaptureSession pode ser configurada para tirar fotos individuais ou diversas imagens de uma vez só.

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

A classe CameraCharacteristics permite que o aplicativo detecte os recursos da câmera disponíveis em um dispositivo. A propriedade INFO_SUPPORTED_HARDWARE_LEVEL do objeto representa o nível de funcionalidade da câmera.

  • Todos os dispositivos oferecem compatibilidade pelo menos com o nível de hardware INFO_SUPPORTED_HARDWARE_LEVEL_LEGACY, que tem recursos praticamente iguais aos da Camera API obsoleta.
  • Dispositivos que oferecem compatibilidade com nível de hardware INFO_SUPPORTED_HARDWARE_LEVEL_FULL são capazes de controlar manualmente a captura e o pós-processamento, além da captura de imagens de alta resolução em altas taxas de quadros.

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

Reprodução de áudio

Esse versão inclui as seguintes mudanças a AudioTrack:

  • Agora, o seu aplicativo pode oferecer dados de áudio no formato de ponto flutuante (ENCODING_PCM_FLOAT). Isso possibilita maior intervalo dinâmico, precisão mais consistente e maior amplitude. 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, algumas partes do pipeline interno ainda não são pontos flutuantes).
  • Agora o seu aplicativo pode fornecer dados de áudio como um ByteBuffer no mesmo formato oferecido por MediaCodec.
  • A opção WRITE_NON_BLOCKING pode simplificar o armazenamento em buffer e o multiencadeamento para alguns aplicativos.

Controle de reprodução de mídia

Use as novas APIs de notificação e mídia para garantir que a interface de usuário do sistema conheça a mídia reproduzida e possa obter e exibir a capa do álbum. Controlar a reprodução de mídia em uma IU e um serviço agora está mais fácil, com as novas classes MediaSession e MediaController.

A nova classe MediaSession substitui a classe RemoteControlClient obsoleta e fornece um único conjunto de métodos de retorno de chamada para lidar com controles de transporte e botões de mídia. Se seu aplicativo fornece reprodução de mídia e é executado na plataforma Android TV ou Wear, use a classe MediaSession para lidar com controles de transporte usando os mesmos métodos de retorno de chamada.

Agora será possível criar o seu próprio aplicativo controlador de mídia com a nova classe MediaController. Essa classe oferece uma forma com encadeamento segura para monitorar e controlar a reprodução de mídia do processo da IU do seu aplicativo. Ao criar um controlador, especifique um objeto MediaSession.Token para que seu aplicativo possa interagir com a dada MediaSession. Usando os métodos MediaController.TransportControls, você pode enviar comandos, como play(), stop(), skipToNext() e setRating() para controlar reproduções de mídia nessa sessão. Com o controlador, também é possível registrar um objeto MediaController.Callback para escutar metadados e alterações de estado na sessão.

Além disso, é possível criar notificações ricas que permitem o controle da reprodução vinculado a uma sessão de mídia com a nova classe Notification.MediaStyle.

Pesquisa de mídia

O Android 5.0 introduziu o recurso que permitiu que aplicativos pesquisassem na biblioteca de conteúdo de mídia de outro aplicativo usando a nova android.media.browse API. Para expor o conteúdo de mídia no seu aplicativo, estenda a classe MediaBrowserService. Sua implementação de MediaBrowserService deve fornecer acesso a um MediaSession.Token para que os aplicativos possam reproduzir conteúdo de mídia fornecido pelo seu serviço.

Para interagir com um serviço de pesquisa de mídia, use a classe MediaBrowser. Especifique o nome do componente para uma MediaSession ao criar uma instância de MediaBrowser. Ao usar essa instância de navegador, o seu aplicativo pode se conectar ao serviço associado e obter um objeto MediaSession.Token para reproduzir o conteúdo exposto por meio desse serviço.

Armazenamento

Seleção de diretório

O Android 5.0 estende a Storage Access Framework para permitir que usuários selecionem uma subárvore de diretórios inteira, oferecendo 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 exibirá todas as instâncias de DocumentsProvider compatíveis com 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. Depois, você pode usar buildChildDocumentsUriUsingTree() e buildDocumentUriUsingTree() junto com query() para explorar a subárvore.

O novo método createDocument() permite criar novos documentos ou pastas em qualquer lugar na subárvore. Para gerenciar documentos existentes, use renameDocument() e deleteDocument(). Verifique COLUMN_FLAGS para conferir a compatibilidade do provedor com essas chamadas antes de emiti-las.

Se você estiver implementando um DocumentsProvider e quiser oferecer compatibilidade com seleção de subárvore, implemente isChildDocument() e inclua FLAG_SUPPORTS_IS_CHILD nos seus COLUMN_FLAGS.

O Android 5.0 também apresenta novas pastas específicas do pacote em armazenamento compartilhado, onde o aplicativo pode colocar arquivos de mídia para inclusão na MediaStore. O novo getExternalMediaDirs() retorna os caminhos para essas pastas em todos os dispositivos de armazenamento compartilhado. Da mesma forma que getExternalFilesDir(), nenhuma permissão adicional é necessária para que o aplicativo acesse os caminhos retornados. A plataforma procura periodicamente novas mídias nessas pastas, mas também é possível usar MediaScannerConnection para verificar explicitamente se há conteúdo novo.

Redes sem fio e conectividade

Diversas conexões de rede

O Android 5.0 oferece novas APIs para várias redes, que permitem que o aplicativo procure redes disponíveis dinamicamente com recursos específicos e estabeleça uma conexão com elas. Esse recurso é útil quando o aplicativo precisa de uma rede especializada, como uma rede SUPL, MMS ou cobrada por operadora, ou se você deseja enviar dados usando um tipo especial de protocolo de transporte.

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

  1. Crie um ConnectivityManager.
  2. Use a classe NetworkRequest.Builder para criar um objeto NetworkRequest e especificar os recursos de rede e tipo de transporte em que seu aplicativo está interessado.
  3. Para procurar redes adequadas, chame requestNetwork() ou registerNetworkCallback() e passe o objeto NetworkRequest e uma implementação de ConnectivityManager.NetworkCallback. Use o método requestNetwork() se quiser alternar para uma rede adequada depois de detectá-la. Para receber somente notificações para redes encontradas sem alternar ativamente, use o método registerNetworkCallback().

Quando o sistema detecta uma rede adequada, ele se conecta a ela e invoca o retorno de chamada onAvailable(). O objeto Network do retorno de chamada pode ser usado para se obter informações adicionais sobre a rede ou direcionar o tráfego para usar a rede selecionada.

Bluetooth Low Energy

O Android 4.3 lançou compatibilidade com a plataforma Bluetooth Low Energy (Bluetooth LE) na função central. No Android 5.0, um dispositivo Android agora pode agir como um dispositivo periférico Bluetooth LE. Esse recurso pode ser usado pelos aplicativos para indicar sua presença a dispositivos próximos. Por exemplo, é possível criar aplicativos que permitam que um dispositivo funcione como um pedômetro ou monitor de integridade e comunique os dados para outro dispositivo Bluetooth LE.

As novas android.bluetooth.le APIs permitem que os aplicativos transmitam anúncios, procurem respostas e estabeleçam conexões com dispositivos Bluetooth LE próximos. Para usar os novos recursos de anúncio e análise, adicione a permissão BLUETOOTH_ADMIN ao manifesto. Quando os usuários atualizam ou baixam o aplicativo na Play Store, são solicitados a conceder a seguinte permissão a ele: "Informações de conexão Bluetooth: Permite que o aplicativo controle o Bluetooth, incluindo a transmissão ou a obtenção de informações de dispositivos Bluetooth próximos."

Para ativar o anúncio do Bluetooth LE para que outros dispositivos possam descobrir o seu aplicativo, chame startAdvertising() e passe uma implementação da classe AdvertiseCallback. O objeto do retorno de chamada recebe um relatório do sucesso ou do fracasso da operação de anúncio.

O Android 5.0 introduz a classe ScanFilter para que o aplicativo procure apenas tipos de dispositivo específicos de seu interesse. Para começar a procurar dispositivos Bluetooth LE, chame startScan() e passe uma lista de filtros. Na chamada do método, é preciso fornecer uma implementação do ScanCallback para informar quando um anúncio Bluetooth LE for encontrado.

Melhorias à NFC

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

  • O Android Beam está disponível agora no menu share.
  • Chamando invokeBeam(), o aplicativo pode invocar o Android Beam no dispositivo do usuário para compartilhar dados. Isso evita a necessidade de o usuário tocar manualmente no dispositivo e em outro dispositivo com recurso de NFC para concluir a transferência de dados.
  • Você pode usar o novo método createTextRecord() para criar um registro de NDEF que contenha dados de texto UTF-8.
  • Se estiver desenvolvendo um aplicativo de pagamentos, agora você tem a capacidade de registrar um ID do aplicativo para a NFC (AID) dinamicamente chamando registerAidsForService(). Você ainda pode usar setPreferredService() para definir o serviço de emulação de cartão de sua preferência, que deve ser usado quando uma atividade específica estiver em primeiro plano.

Projeto Volta

Além dos novos recursos, o Android 5.0 enfatiza melhorias na carga da bateria. Use as novas APIs e ferramentas para compreender e otimizar o consumo de energia do aplicativo.

Agendamento de trabalhos

O Android 5.0 oferece uma nova API JobScheduler, que permite otimizar a carga da bateria definindo tarefas que o sistema deve executar de forma assíncrona em um momento futuro 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 aplicativo tem tarefas que você prefere executar quando a unidade estiver conectada.
  • O aplicativo tem uma tarefa que exige acesso a rede ou uma conexão Wi-Fi.
  • O aplicativo tem diversas tarefas que você deseja executar em lote ou com um agendamento regular.

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

Use a classe JobInfo.Builder para definir como as tarefas agendadas devem ser executadas. A execução da tarefa pode ser agendada 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 códigos como este para executar a tarefa em uma rede ilimitada:

JobInfo uploadTask = new JobInfo.Builder(mJobId,
                                         mServiceComponent /* JobService component */)
        .setRequiredNetworkCapabilities(JobInfo.NetworkType.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 2 minutos e a bateria estiver em nível íntegro), o sistema executará todas as tarefas agendadas prontas para execução, mesmo se o prazo não tiver expirado.

Para ver um exemplo de como usar a JobScheduler API, 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 de bateria de um dispositivo, organizados por ID de usuário exclusivo (UID). 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 aplicativo

Use a opção --help para saber mais sobre as diversas opções de personalização do resultado. Por exemplo, para imprimir as estatísticas de uso de um determinado pacote de aplicativos desde a última carga do dispositivo, execute o comando:

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

A ferramenta Battery Historian pode ser usada na saída do comando dumpsys para gerar uma visualização em HTML dos eventos relacionados a energia dos registros. Essas informações facilitam a compreensão e o diagnóstico de problemas relacionados à bateria.

Android no local de trabalho e na educação

Provisionamento gerenciado

O Android 5.0 oferece um novo recurso para a execução de aplicativos em um ambiente empresarial. Um administrador de dispositivo pode iniciar um processo de provisionamento gerenciado para adicionar um perfil gerenciado separado, mas copresente, a um dispositivo se o usuário tiver uma conta pessoal. Os aplicativos associados a perfis gerenciados aparecem ao lado dos aplicativos na Tela de início, nas telas recentes e nas notificações do usuário.

Para iniciar o processo de provisionamento gerenciado, envie ACTION_PROVISION_MANAGED_PROFILE em uma Intent. Se a chamada for bem-sucedida, o sistema acionará o retorno de chamada onProfileProvisioningComplete(). Em seguida, você pode chamar setProfileEnabled() para ativar esse perfil gerenciado.

Por padrão, somente um subgrupo de aplicativos são habilitados no perfil gerenciado. É possível instalar aplicativos adicionais no perfil gerenciado chamando enableSystemApp().

Se estiver desenvolvendo um aplicativo de Tela de início, você poderá usar a nova classe LauncherApps para obter uma lista de atividades inicializáveis para o usuário atual e eventuais perfis gerenciados associados. A tela de início pode destacar visualmente os aplicativos gerenciados adicionando um emblema de trabalho ao desenhável do ícone. Para recuperar o ícone com emblema, chame getUserBadgedIcon().

Para ver como usar o novo recurso, consulte o exemplo de implementação de BasicManagedProfile nesta versão.

Proprietário de dispositivo

O Android 5.0 introduz a capacidade de implementar um aplicativo 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 gerais no dispositivo. O aplicativo proprietário do dispositivo pode usar os métodos da classe DevicePolicyManager para assumir controle detalhado da configuração, da segurança e dos aplicativos em dispositivos gerenciados. Um dispositivo só pode ter um proprietário de dispositivo ativo por vez.

Para implementar e ativar um proprietário de dispositivo, é preciso executar uma transferência de dados de NFC de um aplicativo de programação para o dispositivo enquanto o mesmo estiver no estado "sem provisionamento". Essa transferência de dados envia as mesmas informações que a intent de provisionamento descrita em Provisionamento gerenciado.

Fixação de tela

O Android 5.0 apresenta uma nova Screen Pinning API que permite impedir temporariamente que os usuários abandonem a tarefa ou sejam interrompidos por notificações. Isso pode ser usado, por exemplo, se você estiver desenvolvendo um aplicativo educacional para apoiar avaliações de alto risco no Android ou um aplicativo público ou de finalidade única. Após o aplicativo ativar a fixação de tela, os usuários não poderão ver as notificações, acessar outros aplicativos nem voltar à tela inicial enquanto o aplicativo não sair do modo.

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

  • Manualmente: Os usuários podem ativar a fixação de tela em Settings > Security > Screen Pinning e selecionar as tarefas que desejam fixar tocando no ícone de fixação verde na tela Recentes.
  • Programaticamente: Para ativar a fixação de tela programaticamente, chame startLockTask() no seu aplicativo. Se o aplicativo solicitante não for um proprietário do dispositivo, o usuário receberá uma solicitação de confirmação. Um aplicativo proprietário de dispositivo pode chamar o método setLockTaskPackages() para permitir que aplicativos possam ser 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 ficará vazia e as notificações do usuário e informações de status serão ocultadas.
  • Os botões Home e Recent Apps serão ocultados.
  • Outros aplicativos não poderão iniciar novas atividades.
  • O aplicativo atual poderá 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 em seu aplicativo até que o aplicativo chame stopLockTask().
  • Se a fixação de tela for a atividade executada por aplicativo diferente do "proprietário do dispositivo" ou pelo usuário diretamente, o usuário poderá sair mantendo pressionados os botões Back e Recent.

Estrutura de impressão

Renderização de PDF como bitmap

Agora, você pode renderizar páginas de documentos em PDF em imagens bitmap para impressão usando a nova classe PdfRenderer. É preciso especificar um ParcelFileDescriptor pesquisável (ou seja, conteúdo que possa ser acessado de forma aleatória) no qual o sistema grave o conteúdo imprimível. Seu aplicativo pode obter uma página para renderizar com openPage() e chamar render() para transformar a PdfRenderer.Page aberta em um bitmap. Além disso, é possível definir parâmetros adicionais caso você queira apenas converter uma parte do documento em uma imagem bitmap (por exemplo, implementar a renderização de bloco para aumentar o zoom do documento).

Para obter um exemplo de como usar as novas APIs, veja PdfRendererBasic.

Sistema

Estatísticas de uso do aplicativo

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

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

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

Para cada aplicativo, o sistema registra os seguintes dados:

  • A última vez em que o aplicativo foi usado
  • O tempo total em que o aplicativo esteve em primeiro plano por esse período (por dia, semana, mês ou ano)
  • Captura de marcação de data e hora quando um componente (identificado por um pacote e nome de atividade) é movido para primeiro ou segundo plano dentro de um dia
  • Captura de marcação de data e hora quando a configuração de um dispositivo é alterada (como quando a orientação do dispositivo muda devido à rotação)

Teste e acessibilidade

Melhorias de teste e acessibilidade

O Android 5.0 adicionou a seguinte compatibilidade com testes e acessibilidade:

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

IME

Troca mais fácil entre idiomas de entrada

A partir do Android 5.0, os usuários podem alternar mais facilmente entre todos os editores de método de entrada (IME) compatíveis com a plataforma. A execução da ação de troca designada (normalmente com o toque em um ícone de globo no teclado virtual) percorre todos os IMEs. Essa mudança de comportamento foi implementada pelo método shouldOfferSwitchingToNextInputMethod().

Além disso, a estrutura de trabalho agora verifica se o IME seguinte contém um mecanismo de troca (e, portanto, se o IME é compatível com troca para o IME seguinte). Um IME com um mecanismo de troca não percorrerá um IME que não tenha esse mecanismo. Essa mudança de comportamento foi implementada pelo método switchToNextInputMethod().

Para ver um exemplo de como usar as APIs de troca de IME atualizadas, dê uma olhada no exemplo de implementação do teclado virtual nesta versão. Para saber mais sobre como implementar a alternância entre IMEs, consulte Criação de um método de entrada.

Declarações do manifesto

Recursos necessários declaráveis

Os valores a seguir agora são compatibilizados no elemento <uses-feature>, de forma que é possível garantir que o aplicativo seja instalado somente em dispositivos que ofereçam os recursos necessários.

Permissões do usuário

A seguinte permissão agora é compatibilizada no elemento <uses-permission>, para declarar as permissões necessárias para que o aplicativo acesse determinadas APIs.

  • BIND_DREAM_SERVICE: Ao trabalhar com API de nível 21 e posteriores, essa permissão é exigida por um serviço Daydream para garantir que somente o sistema possa se vincular a ele.