APIs do Android 6.0

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

Começar a desenvolver

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

Atualizar o nível desejado da API

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

Você pode usar APIs do Android 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 indisponíveis para seu minSdkVersion. Para saber mais sobre como manter a compatibilidade com versões anteriores, leia Suporte a diferentes versões de plataforma.

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

Autenticação por impressão digital

Esta versão oferece novas APIs para autenticar usuários usando as leituras de impressão digital em dispositivos compatíveis. Use essas APIs em conjunto com o sistema Android Keystore.

Para autenticar usuários por leitura de impressão digital, receba uma instância da nova classe FingerprintManager e chame o método authenticate(). O app precisa estar sendo executado em um dispositivo compatível com um sensor de impressão digital. Você precisa implementar a interface do usuário para o fluxo de autenticação por impressão digital no seu app e usar o ícone padrão de impressão digital do Android na interface. O ícone de impressão digital do Android (c_fp_40px.png) está incluído no exemplo de autenticação biométrica. Se você estiver desenvolvendo vários apps que usam a autenticação por impressão digital, cada um deles precisará autenticar a impressão digital do usuário de forma independente.

Para usar esse recurso no app, primeiro adicione a permissão USE_FINGERPRINT no manifesto.

<uses-permission
        android:name="android.permission.USE_FINGERPRINT" />
Celular mostrando a funcionalidade de autenticação por impressão digital

Para conferir uma implementação de autenticação por impressão digital em um app, consulte o exemplo de autenticação biométrica. Para uma demonstração de como usar essas APIs de autenticação junto com outras APIs do Android, assista ao vídeo APIs de impressão digital e pagamento.

Se você estiver testando esse recurso, siga estas etapas:

  1. Instale as Ferramentas do SDK do Android revisão 24.3, se ainda não tiver feito isso.
  2. Registre uma nova impressão digital no emulador acessando Configurações > Segurança > Impressão digital e siga as instruções de registro.
  3. Use um emulador para simular eventos de toque de impressão digital com o comando a seguir. Use o mesmo comando para emular eventos de toque de impressão digital na tela de bloqueio ou no seu app.
    adb -e emu finger touch <finger_id>
    

    No Windows, talvez seja necessário executar telnet 127.0.0.1 <emulator-id> seguido por finger touch <finger_id>.

Confirmação de credencial

O app pode autenticar usuários com base na última vez que eles desbloquearam o dispositivo. Esse recurso evita que os usuários precisem se lembrar de senhas específicas de apps e que você precise implementar sua própria interface de usuário de autenticação. Seu app precisa usar esse recurso em conjunto com uma implementação de chave pública ou secreta para autenticação do usuário.

Para definir a duração do tempo limite em que a mesma chave pode ser reutilizada depois que um usuário é autenticado com sucesso, chame o novo método setUserAuthenticationValidityDurationSeconds() ao configurar um KeyGenerator ou KeyPairGenerator.

Evite mostrar a caixa de diálogo de reautenticação em excesso. Seus apps precisam tentar usar o objeto criptográfico primeiro e, se o tempo limite expirar, use o método createConfirmDeviceCredentialIntent() para reautenticar o usuário no app.

Vinculação de apps

Esta versão melhora o sistema de intents do Android ao oferecer vinculação de apps mais eficiente. Com esse recurso, é possível associar um app a um domínio da Web que você possui. Com base nessa associação, a plataforma pode determinar o app padrão a ser usado para processar um determinado link da Web e evitar que os usuários selecionem um app. Para saber como implementar esse recurso, consulte Como processar links de apps.

Backup automático de apps

O sistema agora faz backup e restauração automáticos de dados completos para apps. Seu app precisa ser destinado ao Android 6.0 (nível 23 da API) para ativar esse comportamento. Não é necessário adicionar nenhum código extra. Se os usuários excluírem as Contas do Google, os dados de backup também serão excluídos. Para saber como esse recurso funciona e como configurar o que fazer backup no sistema de arquivos, consulte Configurar o backup automático para apps.

Compartilhamento direto

Parte de baixo de um dispositivo móvel mostrando a funcionalidade de Compartilhamento Direto

Essa versão oferece APIs para tornar o compartilhamento intuitivo e rápido para os usuários. Agora você pode definir destinos de compartilhamento direto que iniciam uma atividade específica no seu app. Esses destinos de compartilhamento direto são expostos aos usuários pelo menu Compartilhar. Com esse recurso, os usuários podem compartilhar conteúdo com destinos, como contatos, em outros apps. Por exemplo, o destino de compartilhamento direto pode iniciar uma atividade em outro app de rede social, permitindo que o usuário compartilhe conteúdo diretamente com um amigo ou comunidade específica nesse app.

Para ativar destinos de compartilhamento direto, defina uma classe que estenda a classe ChooserTargetService. Declare seu serviço no manifesto. Nessa declaração, especifique a permissão BIND_CHOOSER_TARGET_SERVICE e um filtro de intent usando a ação SERVICE_INTERFACE.

O exemplo a seguir mostra como declarar o ChooserTargetService no manifesto.

<service android:name=".ChooserTargetService"
        android:label="@string/service_name"
        android:permission="android.permission.BIND_CHOOSER_TARGET_SERVICE">
    <intent-filter>
        <action android:name="android.service.chooser.ChooserTargetService" />
    </intent-filter>
</service>

Para cada atividade que você quer expor ao ChooserTargetService, adicione um elemento <meta-data> com o nome "android.service.chooser.chooser_target_service" no manifesto do app.

<activity android:name=".MyShareActivity”
        android:label="@string/share_activity_label">
    <intent-filter>
        <action android:name="android.intent.action.SEND" />
    </intent-filter>
<meta-data
        android:name="android.service.chooser.chooser_target_service"
        android:value=".ChooserTargetService" />
</activity>

Interações por voz

Esta versão oferece uma nova API de interação por voz que, junto com as ações de voz, permite criar experiências de voz conversacionais nos seus apps. Chame o método isVoiceInteraction() para determinar se uma ação de voz acionou sua atividade. Nesse caso, o app pode usar a classe VoiceInteractor para pedir uma confirmação por voz do usuário, selecionar em uma lista de opções e muito mais.

A maioria das interações por voz tem origem em uma ação de voz do usuário. No entanto, uma atividade de interação por voz também pode começar sem entrada do usuário. Por exemplo, outro app iniciado por uma interação por voz também pode enviar uma intent para iniciar uma interação por voz. Para determinar se a atividade foi iniciada por uma consulta de voz do usuário ou por outro app de interação por voz, chame o método isVoiceInteractionRoot(). Se outro app tiver iniciado sua atividade, o método vai retornar false. Em seguida, o app pode pedir que o usuário confirme se era essa a ação desejada.

Para saber mais sobre como implementar comandos de voz, consulte o site para desenvolvedores de comandos de voz.

API Assist

Esta versão oferece uma nova maneira de os usuários interagirem com seus apps usando um assistente. Para usar esse recurso, o usuário precisa permitir que o assistente use o contexto atual. Depois de ativado, o usuário pode chamar o Google Assistente em qualquer app tocando e mantendo pressionado o botão Home.

Seu app pode optar por não compartilhar o contexto atual com o assistente definindo a flag FLAG_SECURE. Além do repositório curricular de informações que a plataforma transmite ao assistente, seu app pode compartilhar mais dados usando a nova classe AssistContent.

Para fornecer ao assistente mais contexto do seu app, siga estas etapas:

  1. Implemente a interface Application.OnProvideAssistDataListener.
  2. Registre esse listener usando registerOnProvideAssistDataListener().
  3. Para fornecer informações contextuais específicas da atividade, substitua o callback onProvideAssistData() e, opcionalmente, o novo callback onProvideAssistContent().

Dispositivos de armazenamento adotável

Com essa versão, os usuários podem adotar dispositivos de armazenamento externo, como cartões SD. Adotar um dispositivo de armazenamento externo criptografa e formata o dispositivo para funcionar como armazenamento interno. Com esse recurso, os usuários podem mover apps e dados particulares deles entre dispositivos de armazenamento. Ao mover apps, o sistema respeita a preferência android:installLocation no manifesto.

Se o app acessar as seguintes APIs ou campos, saiba que os caminhos de arquivo retornados vão mudar dinamicamente quando o app for movido entre dispositivos de armazenamento interno e externo. Ao criar caminhos de arquivo, é altamente recomendável sempre chamar essas APIs de forma dinâmica. Não use caminhos de arquivo fixados no código nem persista caminhos de arquivo totalmente qualificados criados anteriormente.

Para depurar esse recurso, ative a adoção de um pen drive conectado a um dispositivo Android com um cabo USB On-The-Go (OTG) executando este comando:

$ adb shell sm set-force-adoptable true

Notificações

Esta versão adiciona as seguintes mudanças de API para notificações:

Suporte a stylus Bluetooth

Esta versão oferece suporte aprimorado para entrada do usuário usando uma caneta Bluetooth. Os usuários podem parear e conectar uma stylus Bluetooth compatível com o smartphone ou tablet. Enquanto estiver conectado, as informações de posição da tela sensível ao toque serão combinadas com as informações de pressão e botão da stylus para oferecer uma maior variedade de expressões do que apenas com a tela sensível ao toque. Seu app pode detectar toques no botão da stylus e realizar ações secundárias registrando objetos View.OnContextClickListener e GestureDetector.OnContextClickListener na sua atividade.

Use os métodos e as constantes MotionEvent para detectar interações com o botão da stylus:

Melhoria na busca por Bluetooth de baixa energia

Se o app fizer verificações de Bluetooth de baixa energia (BLE), use o novo método setCallbackType() para especificar que você quer que o sistema notifique os callbacks quando encontrar pela primeira vez ou depois de muito tempo um pacote de anúncio correspondente ao ScanFilter definido. Essa abordagem de verificação é mais eficiente em termos de energia do que a fornecida na versão anterior da plataforma.

Suporte ao Hotspot 2.0 versão 1

Esta versão adiciona suporte à especificação Hotspot 2.0 Release 1 nos dispositivos Nexus 6 e Nexus 9. Para provisionar credenciais do Hotspot 2.0 no seu app, use os novos métodos da classe WifiEnterpriseConfig, como setPlmn() e setRealm(). No objeto WifiConfiguration, é possível definir os campos FQDN e providerFriendlyName. O novo método isPasspointNetwork() indica se uma rede detectada representa um ponto de acesso Hotspot 2.0.

Modo de exibição 4K

Agora, a plataforma permite que os apps solicitem o upgrade da resolução da tela para renderização em 4K em hardware compatível. Para consultar a resolução física atual, use as novas APIs Display.Mode. Se a interface for renderizada em uma resolução lógica mais baixa e ampliada para uma resolução física maior, o método getPhysicalWidth() poderá retornar uma resolução física diferente da resolução lógica informada por getSize().

Você pode pedir ao sistema para mudar a resolução física no seu app enquanto ele é executado definindo a propriedade preferredDisplayModeId da janela do app. Esse recurso é útil se você quiser mudar para a resolução de tela 4K. No modo de exibição em 4K, a interface continua sendo renderizada na resolução original (como 1080p) e é ampliada para 4K, mas os objetos SurfaceView podem mostrar conteúdo na resolução nativa.

Themeable ColorStateLists

Os atributos de tema agora são compatíveis com ColorStateList para dispositivos com Android 6.0 (nível 23 da API). Os métodos Resources.getColorStateList() e Resources.getColor() foram descontinuados. Se você estiver chamando essas APIs, chame os novos métodos Context.getColorStateList() ou Context.getColor(). Esses métodos também estão disponíveis na biblioteca appcompat v4 via ContextCompat.

Recursos de áudio

Esta versão adiciona melhorias ao processamento de áudio no Android, incluindo:

  • Suporte ao protocolo MIDI com as novas APIs android.media.midi. Use essas APIs para enviar e receber eventos MIDI.
  • Novas classes AudioRecord.Builder e AudioTrack.Builder para criar objetos de captura e reprodução de áudio digital, respectivamente, e configurar propriedades de fonte e receptor de áudio para substituir os padrões do sistema.
  • Hooks de API para associar dispositivos de áudio e entrada. Isso é especialmente útil se o app permitir que os usuários iniciem uma pesquisa por voz com um controle de videogame ou um controle remoto conectado ao Android TV. O sistema invoca o novo callback onSearchRequested() quando o usuário inicia uma pesquisa. Para determinar se o dispositivo de entrada do usuário tem um microfone integrado, recupere o objeto InputDevice desse callback e chame o novo método hasMicrophone().
  • Novo método getDevices() que permite recuperar uma lista de todos os dispositivos de áudio conectados ao sistema. Você também pode registrar um objeto AudioDeviceCallback se quiser que o sistema notifique seu app quando um dispositivo de áudio for conectado ou desconectado.

Recursos de vídeo

Nesta versão, adicionamos novos recursos às APIs de processamento de vídeo, incluindo:

  • Nova classe MediaSync que ajuda os aplicativos a renderizar de forma síncrona fluxos de áudio e vídeo. Os buffers de áudio são enviados de maneira não bloqueadora e retornados por um callback. Ele também aceita velocidade do vídeo dinâmica.
  • Novo evento EVENT_SESSION_RECLAIMED, que indica que uma sessão aberta pelo app foi recuperada pelo gerenciador de recursos. Se o app usar sessões de DRM, processe esse evento e não use uma sessão recuperada.
  • Novo código de erro ERROR_RECLAIMED, que indica que o gerenciador de recursos recuperou o recurso de mídia usado pelo codec. Com essa exceção, o codec precisa ser liberado, já que passou para o estado terminal.
  • Nova interface getMaxSupportedInstances() para receber uma dica sobre o número máximo de instâncias de codec simultâneas compatíveis.
  • Novo método setPlaybackParams() para definir a velocidade de reprodução de mídia em câmera rápida ou lenta. Ele também estica ou acelera a reprodução de áudio automaticamente em conjunto com o vídeo.

Recursos da câmera

Esta versão inclui as seguintes novas APIs para acessar a lanterna da câmera e para o reprocessamento de imagens da câmera:

API Flashlight

Se um dispositivo de câmera tiver uma unidade de flash, você poderá chamar o método setTorchMode() para ativar ou desativar o modo de iluminação da unidade de flash sem abrir o dispositivo de câmera. O app não tem propriedade exclusiva da unidade de flash ou do dispositivo de câmera. O modo lanterna é desativado e fica indisponível sempre que o dispositivo de câmera fica indisponível ou quando outros recursos de câmera que mantêm a lanterna acesa ficam indisponíveis. Outros apps também podem chamar setTorchMode() para desativar o modo de lanterna. Quando o último app que ativou o modo lanterna é fechado, ele é desativado.

Você pode registrar um callback para receber notificações sobre o status do modo de iluminação chamando o método registerTorchCallback(). Na primeira vez que o callback é registrado, ele é chamado imediatamente com o status do modo de lanterna de todos os dispositivos de câmera conhecidos no momento com uma unidade de flash. Se o modo de lanterna for ativado ou desativado, o método onTorchModeChanged() será invocado.

API de reprocessamento

A API Camera2 foi estendida para oferecer suporte ao reprocessamento de imagens em formato YUV e opaco particular. Para determinar se esses recursos de reprocessamento estão disponíveis, chame getCameraCharacteristics() e verifique a chave REPROCESS_MAX_CAPTURE_STALL. Se um dispositivo for compatível com o reprocessamento, você poderá criar uma sessão de captura de câmera reprocessável chamando createReprocessableCaptureSession() e criar solicitações para o reprocessamento do buffer de entrada.

Use a classe ImageWriter para conectar o fluxo do buffer de entrada à entrada de reprocessamento da câmera. Para ter um buffer vazio, siga este modelo de programação:

  1. Chame o método dequeueInputImage().
  2. Preencha os dados no buffer de entrada.
  3. Envie o buffer para a câmera chamando o método queueInputImage().

Se você estiver usando um objeto ImageWriter com uma imagem PRIVATE, seu app não poderá acessar os dados da imagem diretamente. Em vez disso, transmita a imagem PRIVATE diretamente para o ImageWriter chamando o método queueInputImage() sem cópia de buffer.

A classe ImageReader agora oferece suporte a fluxos de imagens no formato PRIVATE. Com esse suporte, seu app pode manter uma fila circular de imagens de saída ImageReader, selecionar uma ou mais imagens e enviá-las ao ImageWriter para reprocessamento da câmera.

Recursos do Android para trabalho

Esta versão inclui as seguintes novas APIs para o Android for Work:

  • Controles aprimorados para dispositivos corporativos de uso único:agora, o proprietário do dispositivo pode controlar as seguintes configurações para melhorar o gerenciamento de dispositivos corporativos de uso único (COSU):
  • Instalação e desinstalação silenciosa de apps pelo proprietário do dispositivo:agora, um proprietário do dispositivo pode instalar e desinstalar aplicativos silenciosamente usando as APIs PackageInstaller, independente do Google Play para Trabalho. Agora é possível provisionar dispositivos com um proprietário do dispositivo que busca e instala apps sem interação do usuário. Esse recurso é útil para ativar o provisionamento com um toque de quiosques ou outros dispositivos semelhantes sem ativar uma Conta do Google.
  • Acesso silencioso ao certificado empresarial : quando um app chama choosePrivateKeyAlias(), antes que o usuário seja solicitado a selecionar um certificado, o proprietário do perfil ou do dispositivo agora pode chamar o método onChoosePrivateKeyAlias() para fornecer o alias silenciosamente ao aplicativo solicitante. Esse recurso permite conceder acesso a certificados para apps gerenciados sem interação do usuário.
  • Aceitação automática de atualizações do sistema. Ao definir uma política de atualização do sistema com setSystemUpdatePolicy(), um proprietário do dispositivo pode aceitar automaticamente uma atualização do sistema, por exemplo, no caso de um dispositivo de quiosque, ou adiar a atualização e impedir que ela seja feita pelo usuário por até 30 dias. Além disso, um administrador pode definir um período diário em que uma atualização precisa ser feita, por exemplo, durante as horas em que um dispositivo de quiosque não está em uso. Quando uma atualização do sistema está disponível, o sistema verifica se o app controlador de políticas do dispositivo definiu uma política de atualização do sistema e se comporta de acordo com ela.
  • Instalação delegada de certificados:um proprietário do perfil ou do dispositivo agora pode conceder a um app de terceiros a capacidade de chamar estas APIs de gerenciamento de certificados DevicePolicyManager:
  • Celular mostrando o recurso de notificação de status de trabalho no Android for Work
  • Monitoramento do uso de dados. Um proprietário do perfil ou do dispositivo agora pode consultar as estatísticas de uso de dados visíveis em Configurações > Uso de dados usando os novos métodos NetworkStatsManager. Os proprietários de perfil recebem automaticamente permissão para consultar dados no perfil que gerenciam, enquanto os proprietários de dispositivos têm acesso aos dados de uso do usuário principal gerenciado.
  • Gerenciamento de permissões de execução:

    Um proprietário do perfil ou do dispositivo pode definir uma política de permissão para todas as solicitações de execução de todos os aplicativos usando setPermissionPolicy(), para pedir que o usuário conceda a permissão ou conceder ou negar automaticamente a permissão de forma silenciosa. Se a última política for definida, o usuário não poderá modificar a seleção feita pelo proprietário do perfil ou do dispositivo na tela de permissões do app em Configurações.

  • VPN em Configurações:os apps de VPN agora estão visíveis em Configurações > Mais > VPN. Além disso, as notificações que acompanham o uso da VPN agora são específicas de como ela está configurada. Para o proprietário do perfil, as notificações são específicas para saber se a VPN está configurada para um perfil gerenciado, um perfil pessoal ou ambos. Para um proprietário do dispositivo, as notificações são específicas para saber se a VPN está configurada para todo o dispositivo.
  • Notificação de status de trabalho:um ícone de pasta na barra de status aparece sempre que um app do perfil gerenciado tem uma atividade em primeiro plano. Além disso, se o dispositivo for desbloqueado diretamente para a atividade de um app no perfil gerenciado, uma mensagem será mostrada notificando o usuário de que ele está no perfil de trabalho.