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.

Comece a desenvolver

Para começar a criar apps para o Android 6.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 6.0 e das imagens do sistema.

Atualização do nível da API

Para otimizar melhor seu app para dispositivos com 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 as APIs do Android e, ao mesmo tempo, oferecer suporte a versões mais antigas, adicionando condições ao código que verifiquem o nível da API do sistema antes de executar APIs que não têm 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?.

Autenticação com impressão digital

Esta versão oferece novas APIs para autenticar os usuários usando digitalizações de impressão digital em dispositivos com suporte. Use essas APIs com o sistema Android Keystore.

Para autenticar os usuários usando a leitura de impressão digital, receba uma instância da nova classe FingerprintManager e chame o método authenticate(). O app precisa ser executado em um dispositivo compatível com sensor de impressão digital. É necessário implementar a interface do usuário para o fluxo de autenticação por impressão digital no app e usar o ícone de impressão digital padrão 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 autenticação por impressão digital, observe que cada app precisa autenticar a impressão digital do usuário de maneira independente.

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

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

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

Se estiver testando esse recurso, siga estes passos:

  1. Instale o Android SDK Tools Revision 24.3, caso ainda não tenha instalado.
  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 emular eventos de toque de impressão digital com o comando a seguir. Use o mesmo comando para emular os 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>.

credencial de confirmação

O aplicativo pode autenticar os usuários com base no quão recentemente o dispositivo foi desbloqueado pela última vez. Esse recurso libera o usuário de ter que lembrar de outras senhas específicas do app e evita a necessidade de implementar sua própria interface do usuário de autenticação. O 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 o tempo limite em que a mesma chave pode ser reutilizada depois que um usuário for autenticado com sucesso, chame o novo método setUserAuthenticationValidityDurationSeconds() ao configurar um KeyGenerator ou KeyPairGenerator.

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

Vinculação de app

Esta versão aprimora o sistema de intent do Android fornecendo vínculo mais poderoso com o aplicativo. Este recurso permite que você associe um aplicativo a um domínio web próprio. Com base nessa associação, a plataforma pode determinar o app padrão a ser usado para processar um link da Web específico e ignorar a solicitação aos usuários para selecionar um app. Para saber como implementar esse recurso, consulte Como processar links do app.

Backup automático para aplicativos

O sistema agora realiza backup automático completo e restauração de dados para aplicativos. Para ativar esse comportamento, o app precisa ser direcionado ao Android 6.0 (nível 23 da API). Não é necessário adicionar outros códigos. Se os usuários excluírem as contas Google, os dados de backup também serão excluídos. Para saber como esse recurso funciona e como configurar o backup no sistema de arquivos, consulte Configurar Backup automático para apps.

Compartilhamento direto

Parte inferior de um dispositivo móvel exibindo a funcionalidade de compartilhamento direto

Esta versão fornece APIs para tornar o compartilhamento intuitivo e rápido para os usuários. Agora você pode definir metas de compartilhamento direto que iniciam uma atividade específica no seu app. Esses destinos de compartilhamento direto são expostos aos usuários por meio do menu Compartilhar. Esse recurso permite que os usuários compartilhem conteúdo com os destinos, como contatos, dentro de outros apps. Por exemplo, o alvo de compartilhamento direto pode iniciar uma atividade em outro app de rede social, o que permite que o usuário compartilhe conteúdo diretamente com um amigo ou comunidade específica nesse app.

Para ativar os destinos de compartilhamento direto, defina uma classe que estenda a classe ChooserTargetService. Declare o 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 abaixo 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ê quiser 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 fornece uma nova API de interação por voz que, junto com Ações por voz, permite criar experiências de conversa por voz nos seus apps. Chame o método isVoiceInteraction() para determinar se uma ação por voz acionou a atividade. Nesse caso, seu app pode usar a classe VoiceInteractor para solicitar 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 um comando de voz do usuário. No entanto, uma atividade de interação por voz também pode começar sem a 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 a partir de uma consulta por voz do usuário ou de outro app de interação por voz, chame o método isVoiceInteractionRoot(). Se outro app tiver iniciado sua atividade, o método retornará false. Seu app pode pedir que o usuário confirme se pretendia essa ação.

Para saber mais sobre a implementação de ações por voz, consulte o site para desenvolvedores.

Assist API

Essa versão oferece uma nova maneira de os usuários se envolverem com os aplicativos 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 invocar o assistente dentro de qualquer app, mantendo o botão Home pressionado.

O app pode optar por não compartilhar o contexto atual com o Google Assistente definindo a flag FLAG_SECURE. Além do conjunto padrão de informações que a plataforma transmite ao Assistente, o app pode compartilhar outras informações usando a nova classe AssistContent.

Para fornecer contexto adicional do aplicativo ao assistente, siga estes passos:

  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áveis

Com ela, 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 se comportar como um armazenamento interno. Esse recurso permite que os usuários movam apps e dados particulares desses apps entre dispositivos de armazenamento. Ao mover apps, o sistema respeita a preferência android:installLocation no manifesto.

Caso seu app acesse as APIs ou os campos abaixo, os caminhos de arquivo retornados por eles vão mudar dinamicamente quando o app for movido entre os dispositivos de armazenamento interno e externo. Ao compilar caminhos de arquivo, recomendamos que essas APIs sempre sejam chamadas dinamicamente. Não use caminhos de arquivo criptografados nem persista em caminhos de arquivo totalmente qualificados que foram compilados anteriormente.

Para depurar esse recurso, ative a adoção de uma unidade USB que esteja conectada a um dispositivo Android por 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:

Compatibilidade com Bluetooth Stylus

Esta versão oferece compatibilidade melhorada com entradas do usuário usando um Bluetooth Stylus. Os usuários podem parear e conectar uma stylus Bluetooth compatível com o smartphone ou tablet. Durante a conexão, as informações de posição da tela sensível ao toque são fundidas com as informações de botão e pressão da stylus para oferecer uma maior amplitude de expressão do que a tela touchscreen sozinha. Seu app pode detectar pressionamentos de botão da stylus e realizar ações secundárias registrando objetos View.OnContextClickListener e GestureDetector.OnContextClickListener na atividade.

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

Análise aprimorada de Bluetooth Low Energy

Se o app fizer buscas por Bluetooth de baixa energia, use o novo método setCallbackType() para especificar que você quer que o sistema notifique callbacks quando encontrar ou vir pela primeira vez um pacote de publicidade correspondente ao conjunto ScanFilter. Essa abordagem para a leitura é mais eficiente em termos de energia do que a fornecida na versão anterior da plataforma.

Compatibilidade com Hotspot 2.0 versão 1

Esta versão adiciona compatibilidade com Hotspot 2.0 versão 1 para os dispositivos Nexus 6 e Nexus 9. Para provisionar credenciais de ponto de acesso 2.0 no seu app, use os novos métodos da classe WifiEnterpriseConfig, como setPlmn() e setRealm(). No objeto WifiConfiguration, defina os campos FQDN e providerFriendlyName. O novo método isPasspointNetwork() indica se uma rede detectada representa um ponto de acesso de ponto de acesso 2.0.

Modo de exibição em 4K

A plataforma agora permite que os apps solicitem o upgrade da resolução da tela para a renderização 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 menor e for redimensionada para uma resolução física maior, a resolução física que o método getPhysicalWidth() retorna pode ser diferente da resolução lógica informada por getSize().

É possível solicitar que o sistema mude a resolução física no app durante a execução, definindo a propriedade preferredDisplayModeId da janela do app. Esse recurso é útil se você quiser alternar para a resolução de exibição em 4K. No modo de exibição em 4K, a interface continua sendo renderizada na resolução original (como 1080p) e é dimensionada para 4K, mas os objetos SurfaceView podem mostrar o conteúdo na resolução nativa.

ColorStateLists com tema

Os atributos de tema agora têm suporte em ColorStateList para dispositivos com o 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 para o 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 captura de áudio digital e objetos de reprodução, respectivamente, e configurar a fonte de áudio e as propriedades do coletor para substituir os padrões do sistema.
  • Ganchos de API para a associação de dispositivos de entrada e áudio. Isso é particularmente útil se o app permitir que os usuários iniciem uma pesquisa por voz em um controle de jogo ou 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, extraia o objeto InputDevice desse callback e, em seguida, chame o novo método hasMicrophone().
  • Novo método getDevices(), que permite extrair uma lista de todos os dispositivos de áudio conectados ao sistema no momento. 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

Esta versão adiciona 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 sem bloqueio e retornados por um callback. Eles também suportam a taxa de reprodução 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 usa 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, porque foi movido para o estado terminal.
  • Nova interface getMaxSupportedInstances() para receber uma dica do número máximo de instâncias de codec simultâneas compatíveis.
  • Novo método setPlaybackParams() para definir a taxa de reprodução de mídia para movimento rápido ou lento. Ele também prolonga 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:

Flashlight API

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

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

Reprocessing API

A API Camera2 foi estendida para oferecer suporte a YUV e reprocessamento de imagem de formato opaco particular. Para determinar se esses recursos de reprocessamento estão disponíveis, chame getCameraCharacteristics() e procure a chave REPROCESS_MAX_CAPTURE_STALL. Se um dispositivo oferecer suporte ao reprocessamento, você poderá criar uma sessão de captura de câmera reprocessável chamando createReprocessableCaptureSession() e criando 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 obter 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 à 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 nenhuma cópia do buffer.

A classe ImageReader agora oferece suporte a fluxos de imagem no formato PRIVATE. Essa compatibilidade permite que o app mantenha uma fila circular de imagens de saída ImageReader, selecione uma ou mais imagens e as envie ao ImageWriter para reprocessamento da câmera.

Recursos do Android for Work

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

  • Controles avançados para dispositivos corporativos de uso único:o proprietário do dispositivo agora 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:um proprietário do dispositivo agora pode instalar e desinstalar aplicativos silenciosamente usando as APIs PackageInstaller, independente do Google Play for Work. Agora é possível provisionar dispositivos por meio de um proprietário 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 sem ativar uma Conta do Google.
  • Acesso silencioso ao certificado empresarial : quando um app chama choosePrivateKeyAlias(), antes de o usuário ser solicitado a selecionar um certificado, o perfil ou o proprietário do dispositivo agora pode chamar o método onChoosePrivateKeyAlias() para fornecer o alias silenciosamente ao aplicativo solicitante. Esse recurso permite que você conceda acesso de apps gerenciados a certificados sem a 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(), o proprietário do dispositivo agora pode aceitar automaticamente uma atualização do sistema, 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 uma janela de tempo diária em que uma atualização precisa ser realizada, por exemplo, durante os horários 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ítica do dispositivo definiu uma política de atualização do sistema e se comporta de acordo.
  • Instalação de certificado delegada:um proprietário de perfil ou dispositivo agora pode conceder a um app de terceiros a capacidade de chamar essas APIs de gerenciamento de certificados do DevicePolicyManager:
  • Dispositivo móvel exibindo o recurso de notificação de status profissional no Android for Work
  • Rastreamento de uso de dados. Um proprietário de perfil ou dispositivo agora pode consultar as estatísticas de uso de dados visíveis em Settings > Data usando os novos métodos NetworkStatsManager. Os proprietários de perfis 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 tempo de execução:

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

  • VPN nas 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 sobre como essa VPN é configurada. Para o proprietário do perfil, as notificações são específicas para determinar 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 determinar se a VPN está configurada para todo o dispositivo.
  • Notificação de status de trabalho:um ícone de pasta da barra de status agora 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, um aviso será exibido notificando o usuário de que ele está no perfil de trabalho.