A emulação de cartão pelo host funciona com a tela desligada?
Depende da versão do Android e de um ajuste do aparelho. Até o Android 9 nada responde com a tela desligada. A partir do Android 12 um serviço consegue pôr requireDeviceScreenOn em falso. E enquanto o Secure NFC estiver ligado, a partir do Android 10, todo emulador de cartão fica indisponível com a tela desligada.
Versão por versão
O guia da emulação de cartão do Android responde a isso por versão, e as respostas diferem o bastante para uma única frase estar errada em algum lugar.
No Android 9 e anteriores, o controlador e o processador de aplicações ficam desligados quando a tela está desligada, então serviço algum responde; a partir da tela de bloqueio eles respondem, a menos que o serviço peça um desbloqueio. A partir do Android 10, o ajuste Secure NFC muda a pergunta: enquanto ele está ligado, todo emulador de cartão, no host ou fora dele, fica indisponível com a tela desligada, e um serviço no host não consegue funcionar a partir da tela de bloqueio, tenha declarado o que tiver; enquanto ele está desligado, as aplicações fora do host continuam disponíveis com a tela desligada. isSecureNfcSupported informa se o aparelho tem o ajuste em absoluto.
A partir do Android 12, um aplicativo que mira essa versão ou posterior consegue pôr requireDeviceScreenOn em falso e responder com a tela desligada. A partir do Android 15, um aplicativo de carteira padrão que liga o modo de observação passa por cima tanto do desbloqueio quanto do comportamento da tela desligada, porque é ele que decide quando uma transação pode seguir.
As duas declarações
As duas vivem no XML que registra os identificadores, na tag host-apdu-service. requireDeviceUnlock tem falso por padrão, o que quer dizer que o serviço é invocado mesmo num celular bloqueado. Posto em verdadeiro, um toque que resolve para o serviço faz o Android pedir ao usuário que desbloqueie, e depois que toque de novo, já que o celular teve de ser mexido para ser desbloqueado.
requireDeviceScreenOn é o mais recente, e falso é o que deixa um pagamento responder com a tela desligada a partir do Android 12. Nenhum dos dois atributos vale para um serviço fora do host: o processador do host não entra nessa troca, então ele não consegue segurar o elemento seguro.
O que o modo de observação mudou
O modo de observação, a partir do Android 15, deixa o aparelho olhar os ciclos de sondagem sem permitir uma transação. Um serviço o liga com setObserveModeEnabled(true), e a pilha passa então a observar em vez de fazer transação, que é como uma carteira consegue esperar o usuário antes de responder qualquer coisa.
O que o serviço observa é filtrado. Os filtros registrados para um serviço casam um quadro de sondagem exatamente ou por padrão, e os quadros que casam chegam a processPollingFrames(), onde o aplicativo consegue preparar ou autenticar o usuário; os quadros de um leitor que sonda com quadros da norma vão para o serviço preferido em primeiro plano, ou para quem detém o papel de carteira. Um quadro carrega também uma medida da intensidade do campo específica do fabricante, lida com getVendorSpecificGain.
Sair do modo de observação é o sinal de que o aplicativo está pronto: setObserveModeEnabled(false), ou autoTransact num filtro para que um quadro que casa faça isso. Um serviço consegue pedir para começar no modo de observação sempre que for o serviço de pagamento preferido, por shouldDefaultToObserveMode no manifesto ou por setShouldDefaultToObserveModeForService.
Projetar para um celular bloqueado
Teste os estados em vez das versões. Tela ligada e desbloqueada, tela ligada e bloqueada, tela desligada, cada um com o Secure NFC ligado e desligado, é uma matriz curta que responde o que um usuário vai encontrar, e o celular no bolso é o estado que a maioria das demonstrações pula. A página da tela desligada cobre o mesmo limite do lado do usuário.
Depois decida com que cara fica a falha. Um serviço que não consegue responder enquanto bloqueado deixa o usuário diante de um leitor que não diz nada, então o aplicativo tem de explicar o estado em algum lugar onde o usuário vá olhar, o que o pedido de desbloqueio do guia faz apenas quando o serviço pediu o desbloqueio.
E se um leitor puder ser mudado, mude-o junto com o celular: o guia incentiva trabalhar com os fabricantes de leitores para que os ciclos de sondagem deles carreguem um padrão identificável, que é o que deixa um serviço reconhecer o terminal dele antes de decidir fazer a transação.
Perguntas frequentes
Um cartão emulado consegue responder com a tela desligada?
A partir do Android 12, se o serviço puser requireDeviceScreenOn em falso e o Secure NFC estiver desligado. Até o Android 9 o controlador fica desligado junto com a tela.
O que o Secure NFC muda?
Enquanto ele está ligado, todo emulador de cartão fica indisponível com a tela desligada, e um serviço no host não consegue funcionar a partir da tela de bloqueio, tenha declarado o que tiver.
O que requireDeviceUnlock faz?
Posto em verdadeiro, um toque pede ao usuário que desbloqueie e depois que toque de novo. O padrão é falso, então o serviço responde num celular bloqueado.
Esses ajustes valem para um elemento seguro?
Não. Nenhum dos dois atributos vale para um serviço fora do host, já que o processador do host não faz parte dessa troca.