Sensores do celular direto no navegador
Eu sempre tive dois apps no celular que quase nunca abro. Um é um letreiro de LED, que eu uso para pedir música em show. O outro é um nível de bolha, para quando vou pendurar um quadro ou quero ver se o chão está torto. Os dois ficam lá, ocupando espaço, esperando o próximo show ou o próximo quadro.
Aí veio a pergunta: dá para fazer isso numa página? O letreiro, sim, é só desenhar. Mas o nível precisa saber como o celular está inclinado, e isso é coisa de sensor. Fui ver o que o navegador alcança, e é bem mais do que eu imaginava.
O que o Chrome lê do celular
No Chrome do Android, uma página pode usar:
- Movimento: acelerômetro, giroscópio e bússola, que juntos dizem para onde o celular aponta e como ele está inclinado.
- Localização pelo GPS, câmera e microfone, cada um com a pergunta de permissão que todo mundo conhece.
- Realidade aumentada, com o ARCore: a página enxerga o chão e as paredes e dá para medir distâncias, como uma trena.
- Bluetooth, USB e NFC, para conversar com outros aparelhos.
- Vibração, bateria, tipo de rede, e dois que eu usei: manter a tela acesa e travar a orientação da tela.
Ficam de fora o barômetro, o sensor de proximidade, o contador de passos e os batimentos. A digital só aparece no login com passkey, e a página nunca vê a digital em si. No iPhone a lista é bem menor: movimento, localização, câmera e microfone. E o movimento só depois de um toque num botão que pede permissão.
O nível
O evento deviceorientation entrega a inclinação em graus, várias vezes por segundo:
addEventListener('deviceorientation', (event) => {
console.log(event.beta, event.gamma); // topo para cima e direita para baixo, em graus
});
Com esses dois ângulos dá para calcular para onde fica o “para cima” nos eixos do celular. Se ele aponta para fora da tela, o celular está deitado, e o nível mostra uma bolha redonda com os dois eixos. Se aponta para um dos lados, o celular está em pé na borda, e a bolha vira um tubo, como num nível de pedreiro. O desenho gira junto, para ficar de pé para quem segura.
A parte que eu mais gostei é a calibração. Todo sensor sai de fábrica com um errinho de alguns décimos de grau. Para descobrir quanto, você mede, gira o celular 180° no mesmo lugar e mede de novo. A inclinação da mesa troca de sinal quando você gira, e o erro do sensor não. Então o erro é a média das duas leituras, e ele é descontado de todas as medições seguintes. É o mesmo truque de um nível de verdade.
Por que o navegador arredonda as leituras
Esse errinho de fábrica tem um problema: ele é diferente em cada aparelho, e não muda. Em 2019, pesquisadores de Cambridge mostraram no SensorID que menos de um segundo de leituras basta para descobrir a calibração de um celular, e que ela funciona como uma impressão digital: identifica o aparelho de um site para outro, sem cookie nenhum, e continua igual até depois de restaurar o celular de fábrica.
Por isso a especificação manda arredondar a orientação em 0,1° e a aceleração em 0,1 m/s². Nos meus testes, o Chrome já arredonda a aceleração: mandei 9,81 e a página recebeu 9,80. Perto do nível, 0,1 m/s² vira degraus de quase 0,6°, o que é grosseiro demais para pendurar um quadro. A orientação em décimos de grau não tem esse problema, então o nível usa ela, e a aceleração fica de reserva.
O letreiro
O letreiro escreve a mensagem com a fonte dos títulos do site e corta as letras em 16 linhas de pontos. Cada ponto acende quando a letra cobre mais da metade dele. Com 46%, a borda do “O” acendia um ponto solto do lado, e eu tive que subir para metade.
Na tela cheia, o Chrome do Android deixa travar a tela deitada, e a página pede para a tela não apagar. No iPhone não existe tela cheia para página, então o letreiro cobre a página e aparece girado.
E tem uma coisa que app nenhum precisa e uma página precisa: funcionar sem internet, porque sinal em show cheio é uma loteria. Um service worker guarda a página e os arquivos dela no celular na primeira visita. Depois disso, o letreiro abre até no modo avião.
Sem app e sem anúncio
As duas ferramentas estão em Ferramentas, junto com as outras. Nenhuma das duas manda nada para lugar nenhum: as páginas nem têm permissão de abrir conexões, então o que você escreve no letreiro e o que o nível mede ficam no seu celular.
Se você usa iPhone, me conta se funcionou aí.