Save the date! Android Dev Summit is coming to Sunnyvale, CA on Oct 23-24, 2019.

Android 6.0 APIs

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

Comece a desenvolver

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

Atualização do nível da API

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

Você pode usar as Android APIs enquanto ainda oferece compatibilidade com versões antigas adicionando condições ao código que identifiquem o nível da API do sistema antes de executar APIs incompatí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?

Autenticação com impressão digital

Esta versão oferece novas APIs para autenticação de usuários usando a digitalização de impressões digitais em dispositivos compatíveis. Use essas APIs junto com o sistema Keystore do Android.

Para autenticar os usuários por meio da digitalização de impressão digital, adquira uma instância da nova classe FingerprintManager e chame o método authenticate(). O aplicativo deve ser executado em um dispositivo compatível com sensor de impressão digital. Implemente a interface do usuário para o fluxo de autenticação por impressão digital no aplicativo e use o ícone de impressão digital padrão do Android na IU. O ícone de impressão digital do Android (c_fp_40px.png) está incluído no Exemplo de caixa de diálogo de impressão digital. Se estiver desenvolvendo diversos aplicativos que usam autenticação por impressão digital, observe que será necessário que cada um deles autentique a impressão digital do usuário de forma independente.

Para usar este recurso no aplicativo, adicione primeiro a permissão USE_FINGERPRINT no manifesto.

<uses-permission
        android:name="android.permission.USE_FINGERPRINT" />

Para ver a implementação do aplicativo da autenticação de impressão digital, consulte o exemplo de caixa de diálogo de impressão digital. Para ver uma demonstração do uso dessas Authentication APIs junto com outras Android APIs, assista ao vídeo Fingerprint e Payment APIs.

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 Settings > Security > Fingerprint e, em seguida, siga as instruções de registro.
  3. Use um emulador para emular os eventos de toque de impressão digital com o seguinte comando. Use o mesmo comando para emular os eventos de toque de impressão digital na tela de bloqueio ou no aplicativo.
    adb -e emu finger touch <finger_id>
    

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

Confirmação de credencial

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 senhas específicas de aplicativo adicionais e evita a necessidade de implementar a própria interface de usuário para a autenticação. O aplicativo deve usar este recurso junto com uma implementação de chave secreta ou pública para a autenticação do usuário.

Para definir um tempo limite para usar a mesma chave novamente após o usuário autenticar-se com sucesso, chame o novo método setUserAuthenticationValidityDurationSeconds() quando definir um KeyGenerator ou KeyPairGenerator.

Evite exibir a caixa de diálogo de nova autenticação excessivamente — os aplicativos devem tentar usar o objeto criptográfico primeiro e, se o tempo limite expirar, usar o método createConfirmDeviceCredentialIntent() para autenticar novamente o usuário dentro do aplicativo.

Para ver uma implementação deste recurso em um aplicativo, consulte o exemplo de confirmação de credencial.

Vinculação de aplicativo

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 aplicativo padrão a ser usado para lidar com um determinado link da web e ignorar a solicitação aos usuários para selecionar um aplicativo. Para aprender a implementar esse recurso, consulte Gerenciamento de links do aplicativo

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 aplicativo precisa ser direcionado ao Android 6.0 (API de nível 23). Não é necessário código adicional. Se os usuários excluírem as contas Google, os dados de backup também serão excluídos. Para saber como o recurso funciona e como configurar o backup no sistema de arquivos, consulte Configuração de backup automático para aplicativos.

Compartilhamento direto

Esta versão fornece APIs para tornar o compartilhamento intuitivo e rápido para os usuários. Agora, você pode definir alvos de compartilhamento direto que executam uma atividade específica no seu aplicativo. Esses alvos de compartilhamento direto são expostos aos usuários pelo menu Share. Esse recurso permite que os usuários compartilhem conteúdo com os alvos, como contatos, dentro de outros aplicativos. Por exemplo: o alvo de compartilhamento direto pode iniciar uma atividade em outro aplicativo de rede social, o que permite que o usuário compartilhe o conteúdo diretamente com um amigo ou comunidade específica neste aplicativo.

Para ativar os alvos de compartilhamento direto, deve-se definir uma classe que estenda a classe ChooserTargetService. Declare o serviço no manifesto. Dentro dessa 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 se deve 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 a ChooserTargetService, adicione um elemento <meta-data> com o nome "android.service.chooser.chooser_target_service" no manifesto do aplicativo.

<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

Essa versão fornece uma nova API de interação por voz que, junto com Ações de voz, permite criar experiências de conversa dentro dos aplicativos. Chame o método isVoiceInteraction() para determinar se um comando de voz acionou a atividade. Caso tenha sido iniciada, o aplicativo pode usar a classe VoiceInteractor para solicitar uma confirmação de voz do usuário, selecionar a partir de 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. Uma atividade de interação por voz ainda pode, contudo, começar sem nenhuma ação do usuário. Por exemplo, outro aplicativo inicializado por uma interação por voz pode enviar uma intent de inicializar uma interação por voz. Para determinar se sua atividade foi inicializada por uma consulta de voz do usuário ou por outro aplicativo de interação por voz, chame o método isVoiceInteractionRoot(). Se outro aplicativo inicializou sua atividade, o método retorna false. Em seguida, o aplicativo deve solicitar a confirmação do usuário de que ele quis realizar essa ação.

Para aprender mais sobre a implementação de ações de voz, consulte o Site do desenvolvedor de ações de voz.

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 deve permitir que o assistente use o contexto atual. Quando ativado, o usuário pode invocar um assistente dentro de qualquer aplicativo mantendo o botão Home pressionado.

O aplicativo pode optar por não compartilhar o contexto atual com o assistente configurando o sinalizador FLAG_SECURE. Além do conjunto padrão de informações que a plataforma passa ao assistente, o aplicativo pode compartilhar informações adicionais usando a nova classe AssistContent.

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

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

Dispositivos de armazenamento adotáveis

Nessa 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 agir como um armazenamento interno. Este recurso permite que os usuários movimentem aplicativos e dados privados desses aplicativos entre os dispositivos de armazenamento. Ao movimentar aplicativos, o sistema respeita a preferência de android:installLocation do manifesto.

Se o aplicativo acessar as seguintes APIs ou campos, saiba que os caminhos de arquivo retornados serão alterados dinamicamente quando o aplicativo for movimentado entre os dispositivos de armazenamento externo e interno. 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, você pode ativar a adoção de um dispositivo USB que esteja conectado a um dispositivo Android por meio de 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 um Bluetooth Stylus compatível com o celular ou tablet. Quando conectado, 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 do Stylus para fornecer uma maior amplitude de expressão do que a tela sensível ao toque individualmente. Seu aplicativo pode detectar pressionamentos de botão do stylus e realizar ações secundárias registrando os objetos View.OnContextClickListener e GestureDetector.OnContextClickListener na atividade.

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

Análise aprimorada de Bluetooth Low Energy

Se seu aplicativo realiza análise de Bluetooth Low Energy, use o novo método setCallbackType() para especificar que você quer que o sistema notifique retornos de chamada assim que encontrar, ou vir depois de um longo tempo, um pacote de anúncios correspondente ao conjunto ScanFilter. Esta abordagem de digitalização é mais eficiente 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 fornecer as credenciais de Hotspot 2.0 no aplicativo, 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 em 4K

A plataforma agora permite que aplicativos solicitem que a resolução seja aumentada para 4K, renderizando em hardware compatível. Para consultar a resolução física atual, use as novas APIs Display.Mode. Se a IU for apresentada em uma resolução lógica menor e for dimensionada para uma resolução física maior, saiba que a resolução física que o método getPhysicalWidth() retorna poderá ser diferente da resolução física informada por getSize().

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

ColorStateLists com tema

Os atributos de tema agora são compatibilizados em ColorStateList para dispositivos com Android 6.0 (nível da API 23). Os métodos Resources.getColorStateList() e Resources.getColor() ficaram obsoletos. Caso esteja chamando essas APIs, chame os novos métodos Context.getColorStateList() ou Context.getColor(). Esses métodos também podem ser acessados na biblioteca v4 appcompat via ContextCompat.

Recursos de áudio

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

  • Compatibilidade com protocolo MIDI, com as novas android.media.midi APIs. Use essas APIs para enviar e receber eventos de MIDI.
  • Use as novas classes AudioRecord.Builder e AudioTrack.Builder para criar captura de áudio digital e objetos de reprodução, respectivamente, e configure 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 é especialmente útil se seu aplicativo permite que os usuários iniciem uma busca por voz em um controle de jogo ou controle remoto conectado à Android TV. O sistema invoca o novo retorno de chamada onSearchRequested() quando o usuário inicia a busca. Para determinar se o dispositivo de entrada do usuário tem um microfone integrado, recupere o objeto InputDevice desse retorno de chamada e, em seguida, chame o novo método hasMicrophone().
  • O novo método getDevices(), que permite recuperar uma lista de todos os dispositivos de áudio atualmente conectados ao sistema. Você também pode registrar um objeto AudioDeviceCallback caso o aplicativo precise ser notificado 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:

  • A nova classe MediaSync que ajuda os aplicativos a renderizar transmissões de vídeo e áudio de forma sincronizada. Os buffers de áudio são enviados sem bloqueio e retornados por um retorno de chamada. Eles também suportam a taxa de reprodução dinâmica.
  • O novo evento EVENT_SESSION_RECLAIMED, que indica que uma sessão aberta pelo aplicativo foi recuperada pelo gerenciador de recursos. Se o aplicativo usa sessões de DRM, deve-se lidar com esse evento e garantir que uma sessão recuperada não seja usada.
  • O novo código de erro ERROR_RECLAIMED, que indica que o gerenciador de recursos recuperou o recurso de mídia usado pelo codec. Com esta exceção, o codec deve ser liberado, como se fosse movido para o estado terminal.
  • A nova interface getMaxSupportedInstances(), para obter uma dica do número máximo suportado de instâncias de codec simultâneas.
  • O novo método setPlaybackParams(), para definir a taxa de reprodução de mídia para reprodução em movimento lento ou acelerado. Ele também estica ou acelera a reprodução de áudio automaticamente junto com o vídeo.

Recursos de câmera

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

Flashlight API

Se um dispositivo de câmera tiver uma unidade de luz, é possível chamar o método setTorchMode() para ligar ou desligar o modo de tocha da unidade de luz sem abrir o dispositivo da câmera. O aplicativo não tem propriedade exclusiva sobre a unidade de luz ou do dispositivo de câmera. O modo de flash é desativado e torna-se indisponível sempre que o dispositivo de câmera estiver indisponível ou quando outros recursos de câmera que mantêm a tocha ativa ficarem indisponíveis. Outros aplicativos também podem chamar setTorchMode() para desativar o modo de tocha. Quando o aplicativo que ativou o modo de tocha for fechado, o modo é desativado.

É possível registrar um retorno de chamada para ser notificado sobre o estado da tocha chamando o método registerTorchCallback(). Na primeira vez em que o retorno de chamada for registrado, ele será imediatamente chamado com o estado do modo de tocha de todos os dispositivos de câmera com uma unidade de luz conhecidos. Se o modo de tocha for ativado ou desativado, o método onTorchModeChanged() será invocado.

Reprocessing API

A Camera2 API foi estendida para oferecer compatibilidade com YUV e reprocessamento privado de imagem de formato opaco. Para saber se esses recursos de reprocessamento estão disponíveis, chame getCameraCharacteristics() e procure a chave REPROCESS_MAX_CAPTURE_STALL. Se um dispositivo é compatível com reprocessamento, você pode criar uma sessão de captura reprocessável com a câmera chamando createReprocessableCaptureSession(), além de criar solicitações para 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().

Caso esteja usando um objeto ImageWriter junto com uma imagem PRIVATE, o aplicativo não poderá acessar os dados da imagem diretamente. Em vez disso, passe a imagem PRIVATE diretamente ao ImageWriter chamando o método queueInputImage() sem nenhuma cópia do buffer.

A classe ImageReader agora é compatível com as transmissões de imagem de formato PRIVATE. Essa compatibilidade permite que o aplicativo mantenha uma fila circular de imagens de saída ImageReader, selecione uma ou mais imagens e envie-as para o ImageWriter para reprocessamento da câmera.

Recursos do Android for Work

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

  • Controles aprimorados para dispositivos de uso único empresariais: O Proprietário do dispositivo pode controlar as seguintes configurações para aprimorar os dispositivos de uso único empresariais (COSU):
  • Instalação e desinstalação silenciosa de aplicativos pelo proprietário do dispositivo: O proprietário do dispositivo agora pode instalar e desinstalar aplicativos silenciosamente usando as PackageInstaller APIs, de forma independente do Google Play for Work. É possível fornecer dispositivos por meio de um proprietário do dispositivo que recupere e instale aplicativos sem a interação de usuário. Este recurso é útil para ativar a provisão com um toque de dispositivos públicos ou outros sem a ativação da conta Google.
  • Acesso silencioso ao certificado empresarial: Quando um aplicativo chama choosePrivateKeyAlias(), antes de o usuário receber a solicitação para selecionar um certificado, o proprietário de dispositivo ou perfil pode chamar o método onChoosePrivateKeyAlias() para fornecer o alias silenciosamente ao aplicativo solicitante. Este recurso permite que você forneça aos aplicativos gerenciados acesso a certificados sem interação de usuário.
  • Aceitação automática de atualizações do sistema. Ao configurar a política de atualização do sistema com setSystemUpdatePolicy(), o proprietário do dispositivo pode aceitar automaticamente a atualização do sistema, no caso de um dispositivo público, ou adiar a atualização e evitar 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 deve ser realizada. Por exemplo: nos momentos em que um dispositivo público não estiver em uso. Quando uma atualização do sistema está disponível, o sistema verifica se o aplicativo controlador da política do dispositivo definiu uma política de atualização do sistema e comporta-se de acordo com a definição.
  • Instalação de certificado delegado: Agora, um proprietário de dispositivo ou perfil pode fornecer a aplicativos de terceiros a habilidade de chamar essas APIs de gerenciamento de certificado do DevicePolicyManager:
  • Rastreamento de uso de dados. Um proprietário de dispositivo ou perfil agora pode consultar as estatísticas de uso de dados disponíveis em Settings > Data usage usando os novos métodos NetworkStatsManager. Os proprietários de perfil recebem automaticamente a permissão para consultar os dados do perfil que gerenciam, enquanto que os proprietários de dispositivo têm acesso aos dados de uso do usuário principal gerenciado.
  • Gerenciamento de permissões em 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 tempo de execução de todos os aplicativos usando setPermissionPolicy() para solicitar ao usuário a concessão da permissão ou conceder ou nevar automaticamente a permissão de forma silenciosa. Se a política mencionada for definida, o usuário não poderá modificar a seleção feita pelo proprietário de perfil ou dispositivo dentro da tela de permissões do aplicativo em Settings.

  • VPN em configurações: Os aplicativos de VPN agora podem ser acessados em Settings > More > VPN. Além disso, as notificações que acompanham o uso de VPN são específicas sobre como essa VPN é configurada. Para o proprietário de perfil, as notificações são específicas para determinar se a VPN é configurada para um perfil gerenciado, um perfil pessoal ou ambos. Para o proprietário de dispositivo, as notificações são específicas para determinar se a VPN é configurada para todo o dispositivo.
  • Notificação de estado de trabalho: Um ícone de pasta na barra de status agora aparece sempre que um aplicativo do perfil gerenciado tiver uma atividade em primeiro plano. Além disso, se o usuário for desbloqueado diretamente para a atividade de um aplicativo do perfil gerenciado, um aviso é exibido notificando ao usuário que ele está dentro do perfil de trabalho.