Free tool

WebView Permissions Generator

Select what your pages call. Get back the manifest permissions, the WebSettings block and the runtime-permission callbacks — the two halves that both have to be present before a feature works.

Which features do your pages use?

Declare only what the site calls: every extra permission is another prompt to decline and another line to justify in the Data Safety form.

Device features

WebView behaviour

Two gates, and most people open one

A web page asking for the camera inside an Android app must pass two separate checks:

  1. The OS permission — CAMERA declared in the manifest and granted by the user at runtime. Without it the app has no camera at all.
  2. The WebView permission — even with OS permission, the WebView asks your code through onPermissionRequest whether this page may use it. The default answer is no.

Skip the second and the symptom is baffling: permission granted, getUserMedia() called, nothing happens — no prompt, no dialog, a rejected promise. It is the most common WebView support question, and why the generated code always includes the client alongside the manifest lines.

Request the minimum

Each declared permission appears on your listing, in the install flow and in the Data Safety form, and location in particular invites extra review. A permission you declare and never use makes the listing scarier for nothing. Declare what the pages actually call.

Web APIManifest permissionWebView hook
navigator.geolocationACCESS_FINE_LOCATIONonGeolocationPermissionsShowPrompt
getUserMedia({video})CAMERAonPermissionRequest
getUserMedia({audio})RECORD_AUDIOonPermissionRequest
<input type="file">none on modern AndroidonShowFileChooser
Downloadsnone on Android 10+setDownloadListener
NotificationsPOST_NOTIFICATIONS (13+)a messaging SDK

Settings that shape how the site feels

File upload needs real code

An <input type="file"> in a bare WebView is inert — tapping it does nothing because the WebView has no picker. You implement onShowFileChooser, launch the intent and pass the chosen URIs back. Forgetting to call the callback when the picker is cancelled leaves the input dead until the page reloads: the WebView is still waiting for an answer.

Cleartext traffic

Plain http:// is blocked since Android 9 unless you opt in. Leave the block on and fix the site instead. The one legitimate exception is bundled content served from http://localhost inside the app, which is why the offline option adjusts that setting.

Frequently asked questions

The camera does nothing in my WebView — why?

Almost always because only the OS permission was handled. The WebView also asks your code via onPermissionRequest, and the default denies. The generated client grants it for the features you ticked.

Do downloads need storage permission?

Not on Android 10 and later — the download manager writes to shared storage without it. You still need a DownloadListener, which the generator includes.

Why is the file input dead when tapped?

A WebView has no built-in file picker. onShowFileChooser must launch one and return the result — including on cancel, or the input stays dead.

Should JavaScript and DOM storage be on?

Yes for almost every site. Both default to off in a raw WebView and their absence breaks most modern pages silently.

Does the builder configure all of this?

Yes — the permissions step of the HTML to App builder sets the manifest entries and the WebView callbacks for you. This generator is for hand-built projects.

Related tools

Ready to turn your site into an app?

Upload an HTML file or a ZIP, set your icon and name, and download a signed Android app. No Android Studio, no command line.

Open the builder