androidwebviewgpswebchromeclient

Android WebChromeClient WebView onGeolocationPermissionsShowPrompt never fired


I have a webpage with a WatchPosition call which works fine in regular browsers. However, the dialog for requesting GPS Permission never shows when the webpage is loaded from a WebView with WebChromeClient and onGeolocationPermissionsShowPrompt is never called.

public class GeoWebChromeClient extends WebChromeClient {
     public void onGeolocationPermissionsShowPrompt(String origin, android.webkit.GeolocationPermissions.Callback callback) {
         Log.d("geolocation permission", "permission >>>"+origin);
         callback.invoke(origin, true, false);
     }
}

 public class GeoWebViewClient extends WebViewClient {

    @Override
    public void onReceivedSslError (WebView view, SslErrorHandler handler, SslError error) {
        handler.proceed();
    }

    public boolean shouldOverrideUrlLoading(WebView view, String url) {
        // When user clicks a hyperlink, load in the existing WebView
        view.loadUrl(url);
        return true;
    }
}

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    WebView Browser = (WebView) findViewById(R.id.Browser);

    WebSettings webSettings = Browser.getSettings();

    webSettings.setJavaScriptEnabled(true);
    webSettings.setJavaScriptCanOpenWindowsAutomatically(true);
    webSettings.setAppCacheEnabled(true);
    webSettings.setDomStorageEnabled(true);
    webSettings.setGeolocationEnabled(true);

    Browser.setWebViewClient(new GeoWebViewClient());
    Browser.setWebChromeClient(new GeoWebChromeClient());

    Browser.loadUrl("http://192.168.1.102/");


}

<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
<uses-permission android:name="android.permission.ACCESS_GPS" />
<uses-permission android:name="android.permission.ACCESS_ASSISTED_GPS" />
<uses-permission android:name="android.permission.ACCESS_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />

Solution

  • onGeolocationShowPrompt doesn't actually show a prompt itself, it is just a method that gets called when the page requests your Geolocation. You'll need to create your own prompt for the user like shown below (placed inside the onGeolocatioonShowPrompt method):

    final boolean remember = true;
    AlertDialog.Builder builder = new AlertDialog.Builder(this);
    builder.setTitle("Locations");
    builder.setMessage(origin + " Would like to use your Current Location").setCancelable(true).setPositiveButton("Allow",
                                new DialogInterface.OnClickListener() {
                                    @Override
                                    public void onClick(DialogInterface dialog,
                                            int id) {
                                        // origin, allow, remember
                                        callback.invoke(origin, true, remember);
                                    }
                                })
                        .setNegativeButton("Don't Allow",
                                new DialogInterface.OnClickListener() {
                                    @Override
                                    public void onClick(DialogInterface dialog,
                                            int id) {
                                        // origin, allow, remember
                                        callback.invoke(origin, false, remember);
                                    }
                                });
    AlertDialog alert = builder.create();
    alert.show();