APIs do Android 5.0

Nível da API: 21

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

Se você tiver um aplicativo publicado, consulte a documentação Comportamento do Android 5.0 Mudanças que você precisa considerar no app. Essas mudanças de comportamento pode afetar seu aplicativo em dispositivos Android 5.0, mesmo que você não esteja usando novas APIs ou segmentação de novas funcionalidades.

Para uma análise mais detalhada dos novos recursos da plataforma, em vez consulte Android Lollipop destaques.

Começar 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 fazer o download da plataforma SDK do Android 5.0 e das imagens do sistema.

Atualização do nível da API

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

Você pode usar as APIs do Android 5.0 e, ao mesmo tempo, oferecer compatibilidade com versões adicionando condições ao seu 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 Suporte Diferentes Versões de Plataforma.

Para mais informações sobre como os níveis de API funcionam, leia O que é a API Nível?

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 informações completas.

Interface do usuário

Compatibilidade com Material Design

O Android 5.0 adiciona suporte ao novo Material Design do Android estilo. É possível criar apps com o Material Design que sejam visualmente dinâmicos e tenham transições de elemento de IU que pareçam 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 aplicativo, consulte Material Design.

Documentos e atividades simultâneos na tela Recentes

Em versões anteriores, a tela Recentes só podia mostrar uma tarefa para cada app com o qual o usuário interagiu mais recentemente. Agora seu app pode abrir mais tarefas, conforme necessário, para atividades simultâneas 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 apps. Exemplos de tarefas simultâneas podem incluir abas abertas em um app de navegador da Web, documentos em um app de produtividade, partidas simultâneas em um jogo ou bate-papos em um app de mensagens. O app pode gerenciar as tarefas pela classe ActivityManager.AppTask.

Inserir uma quebra lógica para que o sistema trate sua atividade como uma nova atividade. tarefa, use FLAG_ACTIVITY_NEW_DOCUMENT quando iniciando 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 app que podem aparecer nessa tela. Para fazer isso, defina o atributo <application> como 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 android:persistableMode (link em inglês) . Também é possível alterar propriedades visuais de uma atividade na tela Recentes, como a cor, o marcador e o ícone da atividade chamando 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 bugs. A string padrão de agente do usuário para um WebView em execução 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 app conceda a permissão WebView acessar recursos protegidos, como a câmera e o microfone, por meio de APIs da Web como getUserMedia(). Seu app precisa ter as permissões permissões 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, esta versão traz suporte para o WebAudio e WebGL e WebRTC, um padrão aberto. 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 app com as novas APIs android.media.projection. 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 app capture o conteúdo da tela principal (o padrão exibir) em um objeto Surface, que o app pode para enviar pela rede. A API só permite capturar conteúdo não seguro da tela, não o áudio do sistema. Para iniciar a captura de tela, primeiro o app precisa solicitar a permissão do usuário iniciando uma caixa de diálogo de captura de tela usando um Intent recebido pelo createScreenCaptureIntent() .

Para conferir um exemplo de como usar as novas APIs, consulte a 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 desejam permitir que conteúdo de notificações sigilosas seja mostrado em uma tela de bloqueio segura.

Seu app pode controlar o nível de detalhes visíveis quando as notificações são exibidos 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 do conteúdo completo da notificação.
  • VISIBILITY_PUBLIC: Mostra o conteúdo completo da notificação.
  • VISIBILITY_SECRET: não exibe nada, excluindo até mesmo o ícone da notificação.

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

Metadados de notificação

O Android 5.0 usa metadados associados às notificações do seu aplicativo para classificar as notificações de forma mais inteligente. Para definir os metadados, chame o método métodos abaixo no Notification.Builder quando você construa a notificação:

  • setCategory(): informa ao sistema como processar as notificações do app quando o dispositivo está no modo prioridade (por exemplo, se uma notificação representar um chamada recebida, mensagem instantânea ou alarme).
  • setPriority(): Marca a notificação como mais ou menos importante que as notificações normais. Notificações com o campo de prioridade 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 app 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 suporte nativo para 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 tem GLES31: Ao usar o OpenGL ES 3.1, declare isso no arquivo de manifesto com a tag <uses-feature> e o atributo android:glEsVersion. 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 do OpenGL ES.

Pacote de extensões para Android

Além do OpenGL ES 3.1, esta versão fornece um pacote de extensão com Interfaces Java e suporte nativo para funcionalidade gráfica avançada. Essas extensões são tratadas como um único pacote pelo Android. Se o ANDROID_extension_pack_es31a extensão está presente, seu app pode presumir que todas as extensões do pacote estão presentes e ativar a linguagem de sombreamento recursos com uma única instrução #extension.

O pacote de extensão oferece:

  • Suporte garantido ao sombreador de fragmentos 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, é possível declarar que o app precisa ser instalado apenas em dispositivos compatíveis com o pacote de extensão. 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 API android.hardware.camera2 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 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 tire fotos individuais ou várias em sequência.

Para receber notificações quando novas imagens forem capturadas, implemente a Ouvinte CameraCaptureSession.CaptureCallback e defini-la na solicitação de captura. Agora, quando o sistema completar a imagem capturar solicitação, seu CameraCaptureSession.CaptureCallback listener recebe uma chamada onCaptureCompleted(), fornecendo os metadados de captura de imagem em um CaptureResult

Com a classe CameraCharacteristics, detectam quais recursos da câmera estão 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 suporte ao INFO_SUPPORTED_HARDWARE_LEVEL_LEGACY nível de hardware, que tem recursos aproximadamente equivalente ao de Camera descontinuado API.
  • Os dispositivos com suporte ao nível de hardware INFO_SUPPORTED_HARDWARE_LEVEL_FULL podem realizar ações controle de captura e pós-processamento e captura de imagens de alta resolução com frame rates altos.

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

Reprodução de áudio

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

  • Agora, o app pode oferecer dados de áudio no formato de ponto flutuante (ENCODING_PCM_FLOAT). Isso permite maior alcance 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 ponto flutuante).
  • Agora o seu app 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 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 conheça a mídia reproduzida e possa extrair e mostrar a capa do álbum. Controlar a reprodução de mídia em uma interface e um serviço agora está mais fácil com as novas classes MediaSession e MediaController.

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

Agora será possível criar o seu próprio aplicativo de controle 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 app. Ao criar um controlador, especifique um objeto MediaSession.Token para que o app possa interagir com o MediaSession fornecido. Ao usar os métodos MediaController.TransportControls, é possível enviar comandos como play(), stop(), skipToNext(), e setRating() para controlar a reprodução de mídia na sessão. Com o controlador, também é possível registrar um objeto MediaController.Callback para escutar metadados e mudanças de estado na sessão.

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

Pesquisa de mídia

O Android 5.0 introduz a possibilidade de os aplicativos navegarem pelo conteúdo de mídia biblioteca de outro aplicativo, por meio da nova android.media.Browse (link em inglês) API. Para expor o conteúdo de mídia no seu app, estenda a classe MediaBrowserService. Sua implementação de MediaBrowserService precisa fornecer acesso a um MediaSession.Token para que os apps possam reproduzir o conteúdo de mídia fornecido pelo seu serviço.

Para interagir com um serviço de navegador de mídia, use a classe MediaBrowser. Especifique o nome do componente para um MediaSession ao criar uma instância de MediaBrowser. Com essa instância do navegador, o app pode se conectar ao serviço associado e receber uma Objeto MediaSession.Token para abrir conteúdo exposto por meio desse serviço.

Armazenamento

Seleção de diretório

O Android 5.0 estende a 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 mostra todas as instâncias de DocumentsProvider que oferecem suporte à seleção de subárvores, permitindo que o usuário navegue e selecione um diretório. O URI retornado representa acesso à subárvore selecionada. Você pode usar buildChildDocumentsUriUsingTree() e buildDocumentUriUsingTree() junto com query() para explorar a subárvore.

O novo método createDocument() permite criar novos documentos ou diretórios em qualquer lugar na subárvore. Para gerenciar documentos existentes, use renameDocument() e deleteDocument(). Verifique COLUMN_FLAGS para verificar o suporte do provedor a 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 em armazenamento compartilhado, no qual o app pode colocar arquivos de mídia para inclusão 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 extra é necessária para que o app acesse 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á conteúdo novo.

Redes sem fio e Conectividade

Diversas conexões de rede

O Android 5.0 fornece novas APIs de várias redes que permitem que seu aplicativo procurar dinamicamente redes disponíveis com recursos específicos; e para estabelecer uma conexão com eles. Essa funcionalidade é útil quando seu app requer uma rede especializada, como uma rede supl, MMS ou de faturamento via operadora, ou se você quer enviar dados usando um tipo específico de protocolo de transporte.

Para selecionar e conectar dinamicamente a uma rede no app, 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 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 requestNetwork(), se você quiser mudar ativamente para uma rede adequada assim que ela for detectada; para receber notificações apenas para redes verificadas sem alternar ativamente, use o registerNetworkCallback().

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

Bluetooth de baixa energia

O Android 4.3 introduziu suporte à plataforma para Bluetooth de baixa energia (Bluetooth LE) na função central. No Android 5.0, um dispositivo Android agora pode atuar como um dispositivo periférico Bluetooth LE. Os apps podem usar esse recurso para que os dispositivos próximos saibam da presença deles. Por exemplo, você pode criar apps que permitem que um dispositivo funcione como um pedômetro ou monitor de saúde e se comunique com outro dispositivo Bluetooth LE.

As novas APIs android.bluetooth.le permitem que seus apps transmitam anúncios, procurar respostas e criar conexões com Bluetooth LE. Para usar os novos recursos de publicidade e verificação, adicione o BLUETOOTH_ADMIN no manifesto. Quando os usuários atualizam ou fazem o download do app na Play Store, 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 a coleta de informações de dispositivos Bluetooth próximos".

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

O Android 5.0 introduz a classe ScanFilter para que que seu app possa verificar apenas tipos específicos de dispositivos nos quais está interessado. Para começar a procurar Bluetooth Dispositivos LE. Ligue para startScan() e transmitir uma lista de filtros. Na chamada do método, é preciso fornecer uma implementação de ScanCallback para informar quando um anúncio Bluetooth LE for encontrado.

Melhorias à NFC

O Android 5.0 agrega essas melhorias para permitir uma maior capacidade de armazenamento uso flexível da NFC:

  • O Android Beam está disponível no menu de compartilhamento.
  • O app pode invocar o Android Beam no dispositivo do usuário para compartilhar dados chamando invokeBeam(). Isso evita a necessidade de o usuário tocar manualmente o dispositivo em outro Dispositivo compatível com NFC para concluir a transferência de dados.
  • Você pode usar o novo método createTextRecord() para criar um registro NDEF que contenha dados de texto UTF-8.
  • Se estiver desenvolvendo um aplicativo de pagamento, agora você pode registrar dinamicamente um ID de aplicativo NFC (AID) chamando registerAidsForService(): Também é possível usar setPreferredService() para definir o serviço de emulação de cartão preferencial que precisa ser usada 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 a capacidade do seu app e consumo.

Agendamento de trabalhos

O Android 5.0 oferece uma nova API JobScheduler que permite otimizar a vida útil da bateria definindo tarefas para execução pelo sistema 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 app tem tarefas que você prefere executar 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 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 configurar como o a tarefa agendada deve ser executada. 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:

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, estiver conectado há mais tempo mais de dois minutos e a bateria estiver em nível íntegro), o sistema executará qualquer job programado que esteja pronto para ser executado, mesmo que a o prazo não expirou.

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

Ferramentas de desenvolvedor para uso da bateria

O novo comando dumpsys batterystats gera informações dados estatísticos sobre o uso da bateria de um dispositivo, organizados por ID de usuário único (UID, 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 na personalização da saída. Por exemplo, para imprimir o uso da bateria estatísticas de um determinado pacote de aplicativos desde que o dispositivo foi carregado pela última vez, execute este comando:

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

É possível usar a ferramenta Battery Historian 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 apps em um ambiente empresarial. Um administrador do 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 apps associados a perfis gerenciados aparecem ao lado dos apps não gerenciados na Tela de início, na tela de notificações e na tela de apps recentes do usuário.

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

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

Se você estiver desenvolvendo um app de Tela de início, use a nova classe LauncherApps para conferir uma lista de atividades inicializáveis para o usuário atual e quaisquer perfis gerenciados associados. O acesso rápido pode tornar os apps gerenciados visualmente em destaque, anexando um crachá de trabalho ao ícone drawable. Para recuperar o ícone com selo, chame getUserBadgedIcon():

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

Proprietário de dispositivo

O Android 5.0 apresenta a capacidade de implementar um app proprietário do dispositivo. Um proprietário do dispositivo é um tipo especializado de administrador do 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 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 do dispositivo, você precisa realizar uma transferência de dados NFC de um aplicativo de programação para o dispositivo enquanto o dispositivo está na estado. 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 API de fixação de tela que permite temporariamente impedir que os usuários saiam da 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 público ou de quiosque. Depois que o app ativar a fixação de tela, os usuários não poderão ver 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 no Configurações > Segurança > Fixação de tela e selecione as tarefas fixe tocando no ícone verde de alfinete na tela "Recentes".
  • Programaticamente: para ativar a fixação de tela programaticamente, chame startLockTask() no seu app. Se o app solicitante não for um proprietário do dispositivo, o usuário será solicitado a confirmar. Um app proprietário do dispositivo pode chamar o setLockTaskPackages() para permitir que apps 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 está em branco e as notificações do usuário e informações de status são escondidos.
  • Os botões Home e Recent Apps serão ocultados.
  • Outros aplicativos não poderão iniciar novas atividades.
  • O app 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 no app até que ele chame stopLockTask().
  • Se a fixação de tela for a atividade executada por outro aplicativo do dono 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. O app pode receber uma página para renderização com openPage() e, em seguida, chamar render() para transformar a PdfRenderer.Page aberta em um bitmap. Você também é possível definir parâmetros adicionais se você quiser apenas converter uma parte do documento em uma imagem de bitmap (por exemplo, para implementar renderização de blocos para aumentar o zoom no documento).

Para conferir 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 getRecentTasks() descontinuado. Para usar essa API, primeiro declare a permissão "android.permission.PACKAGE_USAGE_STATS" no manifesto. O usuário também precisa habilitar 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 o 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: 2 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 (por dia, semana, mês ou ano)
  • Captura de carimbo de data/hora quando um componente (identificado por um pacote e pelo nome da atividade) movidos para o primeiro ou segundo plano durante um dia
  • Captura de carimbo de data e hora quando a configuração de um dispositivo é alterada (como quando a orientação do dispositivo muda devido à rotação)

Testes e Acessibilidade

Melhorias de teste e acessibilidade

O Android 5.0 adicionou o seguinte suporte para teste e acessibilidade:

  • O novo getWindowAnimationFrameStats() e getWindowContentFrameStats() capturam estatísticas de frames para animações de janela e conteúdo. Esses métodos permitem gravar testes de instrumentação para avaliar se um app está renderizando quadros com frequência de atualização suficiente para oferecer uma experiência contínua ao usuário.
  • A nova executeShellCommand() permite que você execute comandos de shell no seu teste de instrumentação. O A execução do comando é semelhante à execução do adb shell em um host conectados 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 extrair informações detalhadas sobre as propriedades das janelas na tela com as quais os usuários com problemas visuais podem interagir. Para recuperar 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ções encontradas anteriormente em AccessibilityNodeInfo.
  • O Android 5.0 oferece controle mais detalhado sobre a síntese de texto em fala do app. A nova classe Voice permite que o app use perfis de voz associados a localidades, classificação de qualidade e latência específicas, 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) com suporte da plataforma. A execução das a ação de alternância (normalmente tocando em um ícone de globo no teclado de software) funciona por todos esses IMEs. Essa mudança de comportamento é implementada pela shouldOfferSwitchingToNextInputMethod() .

Além disso, a estrutura de trabalho agora verifica se o IME seguinte inclui um mecanismo de troca (e, portanto, se o IME oferece suporte para a mudança 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 é implementada pelo método switchToNextInputMethod().

Para ver um exemplo de como usar as APIs de mudança de IME atualizadas, consulte o atualizado de exemplo de implementação de 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 suportados no <uses-feature> para garantir que seu aplicativo seja instalado somente em dispositivos que fornecem os recursos de que seu app precisa.

Permissões do usuário

A seguinte permissão agora tem suporte no <uses-permission> para declarar as permissões necessárias para o aplicativo acessar determinadas APIs.

  • BIND_DREAM_SERVICE: ao segmentar a API nível 21 ou superior, essa permissão é exigida por um serviço Daydream, para garantir que somente o sistema possa se vincular a ela.