Por que a permissão não vem sozinha
Um navegador pede câmera, microfone e localização ao usuário quando a página chamagetUserMedia ou
navigator.geolocation. Uma WebView embutida no seu app não pede: por padrão, ela nega em silêncio,
mesmo a página declarando a permissão corretamente — o que o Web SDK já faz no iframe que ele cria
(allow="camera; microphone; geolocation; fullscreen", ver
segurança). Sem o passo nativo abaixo, a captura e a
coleta de localização falham sem nenhum erro que a sua página consiga tratar.
iOS — WKWebView
Declare os três textos de uso noInfo.plist e implemente o delegado que autoriza câmera e
microfone:
Info.plist
requestMediaCapturePermissionFor existe a partir do iOS 15 e cobre câmera e microfone. Sem o
delegado, a WKWebView recusa a concessão por padrão, mesmo com as chaves do Info.plist
presentes. getUserMedia em si só funciona em WKWebView de app de terceiro a partir do iOS 14.3;
abaixo disso a API não existe na página.
Android — WebView
Declare as permissões noAndroidManifest.xml, peça a permissão em tempo de execução ao usuário
(Android 6.0+ exige isso independentemente da WebView) e conceda no WebChromeClient. Câmera e
microfone passam por onPermissionRequest; geolocalização é um método separado,
onGeolocationPermissionsShowPrompt, e precisa da própria configuração ligada no WebSettings:
AndroidManifest.xml
setGeolocationEnabled(true),
onGeolocationPermissionsShowPrompt nunca dispara.
Framework híbrido (React Native, Flutter e afins)
O mecanismo por baixo é o mesmo dos dois itens acima — o wrapper só decide como ele expõe isso. Confira na documentação da versão do wrapper que você usa como conceder a permissão de mídia da WebView nos dois sistemas; nem toda versão cobre iOS e Android da mesma forma. No iOS,getUserMedia não funciona quando a página é servida por um esquema de URL customizado em
vez de https:// ou http://localhost — é limitação da própria WKWebView, não do wrapper.
Confirme qual esquema a versão do seu wrapper usa antes de depurar a permissão.
O que acontece se eu não implementar o passo nativo
O que acontece se eu não implementar o passo nativo
A falha muda por plataforma e por capacidade, e vale saber qual é qual antes de abrir um chamado:
- Android, câmera sem
onPermissionRequest: erro imediato (NotAllowedError) — o default doWebChromeClienté negar. - Android, geolocalização sem
onGeolocationPermissionsShowPrompt: nenhum erro. O callback nunca é chamado, e a chamada trava até otimeoutque a página passar — ou para sempre, se ela não passar nenhum. - iOS, câmera sem o delegado: a
WKWebViewmostra o prompt do próprio sistema e funciona sem código nenhum, contanto que a chave doInfo.plistesteja presente. - iOS, geolocalização sem a chave do
Info.plist: o mesmo travamento silencioso do Android, por um motivo diferente (veja o aviso acima).
Iframe próprio
Se a página que a WebView abre não carrega o Web SDK, veja o que muda no tratamento de eventos.