Two layers have to agree before a feature works
When your website asks for the camera, a browser shows a permission prompt and gets on with it. Inside an app there are two layers: the web page asks the WebView, and the WebView has to be allowed by Android. The app must declare the permission in its manifest, request it from the user at runtime on Android 6 and later, and then grant the page's request in the WebView's permission callback. Miss any one and the feature silently does nothing — no error, no prompt, just a button that does not work.
This generator produces all three layers from a list of checkboxes: what your site needs on the left, what the app must do on the right.
Device features
- Location —
navigator.geolocation. Store locators, delivery addresses, maps. Needs the fine or coarse location permission plus the geolocation callback. - Camera —
getUserMedia, QR scanning, photo capture. The camera permission plus the media-capture grant. - Microphone — audio recording and voice input.
- File upload —
<input type="file">. A WebView ignores the tap unless the app provides a file chooser; this is the most common "does nothing" report. - Downloads — saving files from a page needs a download listener; the WebView does not do it by itself.
- Push notifications — a messaging SDK and, on Android 13+, the notification permission.
WebView behaviour
JavaScript and DOM storage are off by default in a raw WebView, which is why a naive wrapper shows a modern site as broken; almost every site needs both. Pinch zoom is usually off for app-like sites and on for documents. Open external links in the browser keeps links to other domains from trapping users inside your app. Content bundled in the app switches on the file-access settings a bundled HTML or ZIP app needs. Pull to refresh adds the gesture users expect from feeds.
When you make your app with the builder, all of this is configured for you — you tick the same permissions on the build screen and the shell handles the callbacks. This tool is for seeing what that involves, or for wiring a WebView in a project of your own. How a URL app treats links, logins and permissions →