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" />
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:
- Instale as Ferramentas do SDK do Android revisão 24.3, se ainda não tiver feito isso.
- Registre uma nova impressão digital no emulador acessando Configurações > Segurança > Impressão digital e siga as instruções de registro.
- 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 porfinger 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
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:
- Implemente a interface
Application.OnProvideAssistDataListener. - Registre esse listener usando
registerOnProvideAssistDataListener(). - Para fornecer informações contextuais específicas da atividade, substitua o callback
onProvideAssistData()e, opcionalmente, o novo callbackonProvideAssistContent().
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.
- Métodos
Context: ApplicationInfofields:
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:
- Novo nível de filtro
INTERRUPTION_FILTER_ALARMSque corresponde ao novo modo não perturbe Somente alarmes. - Novo valor da categoria
CATEGORY_REMINDERusado para distinguir lembretes programados pelo usuário de outros eventos (CATEGORY_EVENT) e alarmes (CATEGORY_ALARM). - Nova classe
Iconque pode ser anexada às notificações pelos métodossetSmallIcon()esetLargeIcon(). Da mesma forma, o métodoaddAction()agora aceita um objetoIconem vez de um ID de recurso drawable. - Novo método
getActiveNotifications()que permite que seus apps descubram quais notificações estão ativas no momento.
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:
- Se o usuário tocar em uma stylus com um botão na tela do app, o método
getTooltype()vai retornarTOOL_TYPE_STYLUS. - Para apps destinados ao Android 6.0 (nível 23 da API), o método
getButtonState()retornaBUTTON_STYLUS_PRIMARYquando o usuário pressiona o botão principal da stylus. Se a stylus tiver um segundo botão, o mesmo método vai retornarBUTTON_STYLUS_SECONDARYquando o usuário pressionar. Se o usuário pressionar os dois botões simultaneamente, o método vai retornar os dois valores combinados com OR (BUTTON_STYLUS_PRIMARY|BUTTON_STYLUS_SECONDARY). -
Para apps destinados a uma versão anterior da plataforma, o
método
getButtonState()retornaBUTTON_SECONDARY(para pressionamento do botão principal da stylus),BUTTON_TERTIARY(para pressionamento do botão secundário da stylus) ou ambos.
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.BuildereAudioTrack.Builderpara 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 objetoInputDevicedesse callback e chame o novo métodohasMicrophone(). - Novo método
getDevices()que permite recuperar uma lista de todos os dispositivos de áudio conectados ao sistema. Você também pode registrar um objetoAudioDeviceCallbackse 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
MediaSyncque 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:
- Chame o método
dequeueInputImage(). - Preencha os dados no buffer de entrada.
- 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):
- Desative ou reative o keyguard com o
método
setKeyguardDisabled(). - Desative ou reative a barra de status (incluindo configurações rápidas, notificações e o
gesto de deslizar para cima na navegação que inicia o Google Now) com o
método
setStatusBarDisabled(). - Desative ou reative a inicialização segura com a constante
UserManagerDISALLOW_SAFE_BOOT. - Evite que a tela seja desligada enquanto estiver conectada com a constante
STAY_ON_WHILE_PLUGGED_IN.
- Desative ou reative o keyguard com o
método
- 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étodoonChoosePrivateKeyAlias()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: - 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.