O Android 6.0 (M) oferece novos recursos para usuários e desenvolvedores de apps. Este documento fornece uma introdução às APIs mais importantes.
Começar a desenvolver
Para começar a desenvolver aplicativos para o Android 6.0, você precisa primeiro obter o Android SDK. Em seguida, use o SDK Manager para fazer o download da plataforma SDK do Android 6.0 e das imagens do sistema.
Atualização do nível da API
Para otimizar o app para dispositivos que usam o Android,
defina a targetSdkVersion
como
"23"
, instale o app em uma imagem do sistema
do Android, teste e publique o app atualizado com
essa mudança.
Você pode usar as APIs do Android e ainda oferecer suporte a versões
antigas adicionando ao código condições que verifiquem o nível da API do sistema
antes de executar APIs sem suporte ao minSdkVersion
.
Para saber mais sobre manutenção de retrocompatibilidade, 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 com impressão digital
Esta versão oferece novas APIs para autenticar usuários usando a verificação de impressões digitais em dispositivos com suporte. Use essas APIs com o sistema Android Keystore.
Para autenticar usuários com 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 um sensor de impressão digital. Implemente a interface do usuário para o fluxo de autenticação
de impressão digital no seu app e use 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 estiver desenvolvendo diversos apps que usam autenticação por impressão digital, observe que cada app precisa
autenticar a impressão digital do usuário de forma independente.
Para usar esse recurso no app, adicione primeiro a
permissão USE_FINGERPRINT
no manifesto.
<uses-permission android:name="android.permission.USE_FINGERPRINT" />
Para conferir a implementação do app da autenticação biométrica, consulte o exemplo de autenticação biométrica. Para conferir uma demonstração do uso dessas APIs de autenticação junto com outras APIs do Android, assista ao vídeo APIs de impressão digital e pagamento.
Se estiver testando esse recurso, siga estes passos:
- Instale o Android SDK Tools Revision 24.3, caso ainda não tenha instalado.
- Registre uma nova impressão digital no emulador acessando Settings > Security > Fingerprint e siga as instruções de registro.
- Use um emulador para emular eventos de toque de impressão digital com o
comando abaixo. Use o mesmo comando para emular os eventos de toque de impressão digital na tela de bloqueio ou
no app.
adb -e emu finger touch <finger_id>
No Windows, talvez seja necessário executar
telnet 127.0.0.1 <emulator-id>
seguido definger 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 do usuário para a autenticação. O app precisa usar esse recurso em conjunto com uma implementação de chave pública ou secreta para a autenticação do usuário.
Para definir o tempo limite em que a mesma chave pode ser reutilizada após a autenticação de um usuário, chame o novo método setUserAuthenticationValidityDurationSeconds()
ao configurar um KeyGenerator
ou KeyPairGenerator
.
Evite mostrar excessivamente a caixa de diálogo de reautenticação. Seus 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 não precisar solicitar que os usuários selecionem um app. Para saber como implementar esse recurso, consulte 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 nenhum código extra. 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 o backup automático para apps.
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 iniciam uma atividade específica no app. Esses alvos de compartilhamento direto são expostos aos usuários pelo menu Compartilhar. Esse recurso permite que os usuários compartilhem conteúdo com os alvos, como contatos, em outros apps. 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 nesse aplicativo.
Para ativar os alvos de compartilhamento direto, é necessário definir 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 a
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 de voz,
permite criar experiências de conversa nos apps. Chame o
método isVoiceInteraction()
para determinar se uma ação de voz acionou
sua atividade. Caso tenha sido iniciada, o app 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. No entanto, uma atividade de interação por voz
também pode começar sem a intervenção do usuário. Por exemplo, outro app iniciado por uma interação
de voz também pode enviar uma intent para iniciar uma interação de voz. Para determinar se a atividade
foi iniciada por uma consulta de voz do usuário ou por outro aplicativo de interação por voz, chame o
método isVoiceInteractionRoot()
. Se outro app tiver iniciado sua
atividade, o método retornará false
. Em seguida, o app pode solicitar que o usuário confirme se
ele quis realizar essa ação.
Para saber 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 precisa ativar o assistente para usar o contexto atual. Quando ativado, o usuário pode invocar o Assistente em qualquer app mantendo o botão Home pressionado.
O app pode optar por não compartilhar o contexto atual com o assistente definindo a
flag FLAG_SECURE
. Além do
conjunto padrão de informações que a plataforma transmite ao assistente, seu app pode compartilhar
outras informações usando a nova classe AssistContent
.
Para fornecer contexto adicional do aplicativo ao assistente, siga estes passos:
- Implemente a interface
Application.OnProvideAssistDataListener
. - Registre esse listener usando
registerOnProvideAssistDataListener()
. - Para fornecer informações contextuais específicas da atividade, substitua o retorno de chamada
onProvideAssistData()
e, opcionalmente, o novo retorno de chamadaonProvideAssistContent()
.
Dispositivos de armazenamento adotáveis
Com essa versão, os usuários podem adotar dispositivos de armazenamento externo, como cartões SD. A adoção de um
dispositivo de armazenamento externo criptografa e formata o dispositivo para que ele se comporte como um armazenamento interno. Esse
recurso permite que os usuários movam apps e dados privados desses apps 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 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.
- métodos
Context
: - Campos
ApplicationInfo
:
Para depurar esse recurso, você pode ativar a adoção de um drive USB conectado 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:
- Novo nível de filtro
INTERRUPTION_FILTER_ALARMS
que corresponde ao novo modo Não perturbe, somente alarmes. - Novo valor da categoria
CATEGORY_REMINDER
, usado para distinguir lembretes agendados pelo usuário de outros eventos (CATEGORY_EVENT
) e alarmes (CATEGORY_ALARM
). - Nova classe
Icon
que pode ser anexada às notificações pelos métodossetSmallIcon()
esetLargeIcon()
. Da mesma forma, o métodoaddAction()
agora aceita um objetoIcon
em vez de um ID de recurso de desenhável. - Novo método
getActiveNotifications()
que permite que os apps descubram quais das notificações ainda estão ativas.
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 touch são fundidas com as informações de pressão e botão da stylus para
fornecer um intervalo maior de expressão do que a tela touchscreen sozinha. O app pode detectar
o pressionamento de botão da stylus e realizar ações secundárias, registrando
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:
- Se o usuário tocar no Stylus com um botão na tela do app, o
método
getTooltype()
vai retornarTOOL_TYPE_STYLUS
. - Para apps com Android 6.0 (nível 23 da API), o
método
getButtonState()
retornaBUTTON_STYLUS_PRIMARY
quando o usuário pressiona o botão principal da stylus. Se a stylus tiver um segundo botão, o mesmo método retornaráBUTTON_STYLUS_SECONDARY
quando o usuário o pressionar. Se o usuário pressionar os dois botões simultaneamente, o método retornará os dois valores com OR juntos (BUTTON_STYLUS_PRIMARY
|BUTTON_STYLUS_SECONDARY
). -
Para apps com uma versão de plataforma inferior, o
método
getButtonState()
retornaBUTTON_SECONDARY
(para o pressionar do botão principal do Stylus),BUTTON_TERTIARY
(para o pressionar do botão secundário do Stylus) ou ambos.
Análise aprimorada de Bluetooth Low Energy
Se o app realizar buscas por Bluetooth de baixa energia, use o novo método
setCallbackType()
para especificar que você quer que o sistema notifique os callbacks quando encontrar pela primeira vez ou vir
depois de muito tempo um pacote de anúncios correspondente ao conjunto ScanFilter
. Essa
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 do Hotspot 2.0 no 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 em 4K
A plataforma agora permite que apps solicitem o upgrade da resolução para 4K
em hardware compatível. Para consultar a resolução física atual, use as novas
APIs Display.Mode
. Se a interface 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 pode ser diferente da resolução
lógica informada por getSize()
.
É possível solicitar que o sistema altere a resolução física no aplicativo à medida que ele é executado configurando
a propriedade preferredDisplayModeId
da janela
do app. Esse recurso é útil se você quiser alternar para a resolução de exibição em 4K. Enquanto estiver no modo de exibição
4K, a interface do usuário 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 Android 6.0 (nível da API 23). 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 appcompatibilidade 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
eAudioTrack.Builder
para criar objetos de reprodução e captura de áudio digital, 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 é especialmente útil se o app
permite que os usuários iniciem uma pesquisa de 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, recupere o objetoInputDevice
desse callback e chame o novo métodohasMicrophone()
. - Novo método
getDevices()
, que permite extrair uma lista de todos os dispositivos de áudio conectados no momento ao sistema. Você também pode registrar um objetoAudioDeviceCallback
caso o sistema precise notificar o 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 transmissões de áudio e vídeo de forma sincronizada. 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, é necessário processar esse evento e garantir que uma sessão recuperada não seja usada. - 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, como se fosse movido para o estado terminal. - Nova interface
getMaxSupportedInstances()
para receber uma dica do número máximo de instâncias de codec simultâneas com suporte. - Novo método
setPlaybackParams()
para definir a taxa de reprodução de mídia para movimento lento ou rápido. 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 da unidade de flash sem abrir o dispositivo de câmera. O app
não tem propriedade exclusiva sobre a unidade de flash nem do dispositivo de câmera. O modo lanterna é desativado
e fica indisponível sempre que o dispositivo de câmera estiver indisponível ou quando outros recursos
da câmera que mantêm a lanterna ativa ficarem indisponíveis. Outros apps também podem chamar
setTorchMode()
para desativar o modo de tocha. Quando o último app que ativou o modo de lanterna for fechado, o modo
será desativado.
Você pode 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 tocha 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 privado. Para saber se esses recursos de reprocessamento estão disponíveis,
chame getCameraCharacteristics()
e verifique a
chave REPROCESS_MAX_CAPTURE_STALL
. Se um
dispositivo oferece suporte ao reprocessamento, é possível 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 de buffer de entrada à entrada de
reprocessamento da câmera. Para obter um buffer vazio, siga este modelo de programação:
- Chame o método
dequeueInputImage()
. - Preencha os dados no buffer de entrada.
- Envie o buffer à câmera chamando o
método
queueInputImage()
.
Se você estiver usando um objeto ImageWriter
com uma imagem PRIVATE
, o 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
transmissões de imagem de formato PRIVATE
. Esse suporte permite que o app
mantenha uma fila de imagem circular de imagens de saída ImageReader
, selecione uma ou
mais imagens e as envie para o ImageWriter
para o 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 o gerenciamento de
dispositivos de uso único empresariais (COSU):
- Desativar ou reativar a proteção de bloqueio com o
método
setKeyguardDisabled()
. - Desativar ou reativar a barra de status (incluindo configurações rápidas, notificações e o
gesto de arrastar para cima que inicia o Google Now) com o
método
setStatusBarDisabled()
. - Desativar ou reativar a inicialização segura com a constante
UserManager
DISALLOW_SAFE_BOOT
. - Evitar que a tela desligue quando conectada com a
constante
STAY_ON_WHILE_PLUGGED_IN
.
- Desativar ou reativar a proteção de bloqueio com o
método
- Instalação e desinstalação silenciosa de aplicativos pelo proprietário do dispositivo: um proprietário do dispositivo agora pode instalar e desinstalar aplicativos silenciosamente usando as APIs
PackageInstaller
, independentemente do Google Play for Work. Agora é possível provisionar dispositivos por meio de um proprietário do dispositivo que recupera e instala apps sem a interação do usuário. Esse recurso é útil para ativar a provisão de um toque de dispositivos públicos ou outros sem a ativação da conta Google. - Acesso silencioso a certificados corporativos : quando um app 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étodoonChoosePrivateKeyAlias()
para fornecer o alias silenciosamente ao aplicativo solicitante. Esse recurso permite que você forneça 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 pode aceitar automaticamente uma 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 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 aplicativo controlador da política do dispositivo definiu uma política de atualização do sistema e, portanto, comporta-se de acordo com a definição. -
Instalação de certificado delegada:um proprietário de perfil ou dispositivo agora pode conceder a um app de terceiros a capacidade de chamar estas APIs de gerenciamento de certificados
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 Configurações > Uso de dados usando os novos
métodos
NetworkStatsManager
. Os proprietários de perfil recebem automaticamente a permissão para consultar os dados no 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 execução de todos os aplicativos que usam
setPermissionPolicy()
, seja para pedir que o usuário conceda a permissão ou concedê-la ou negá-la automaticamente 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 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 de VPN 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 o proprietário do dispositivo, as notificações são específicas para determinar se a VPN é configurada para todo o dispositivo.
- Notificação de status do trabalho:um ícone de pasta na barra de status agora aparece sempre que um app do perfil gerenciado tiver 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á dentro do perfil de trabalho.