WebView not asking geolocation

I'm using WebView to load site with geolocation request. I add permissions in manifest, request access from user, enable javascript.

Methods "onGeolocationPermissionsShowPrompt" and "onPermissionRequest" from WebChromeClient not calling in Android Marshmallow while in KitKat it's all working perfect.

I also add log to check how it's working.

public void onGeolocationPermissionsShowPrompt(final String origin, final GeolocationPermissions.Callback callback) {
    Log.e("Test", "Geolocation " + origin);
    callback.invoke(origin, true, false);
}

public void onPermissionRequest(PermissionRequest request) {
    Log.e("Test", "Request permission");
    super.onPermissionRequest(request);
}

This is webView settings

webView.getSettings().setJavaScriptEnabled(true);
webView.getSettings().setAllowContentAccess(true);
webView.getSettings().setAllowFileAccess(true);
webView.getSettings().setGeolocationEnabled(true);
webView.getSettings().setJavaScriptCanOpenWindowsAutomatically(false);
webView.getSettings().setSupportMultipleWindows(false);
webView.getSettings().setSupportZoom(false);

And manifest permissions

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="com.vogella.android.locationapi.maps.permission.MAPS_RECEIVE" />
<uses-permission android:name="com.vogella.android.locationapi.maps.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_GPS" />
<uses-permission android:name="android.permission.ACCESS_ASSISTED_GPS" />

Thanks for your answers.

Upvotes: 2

Views: 1234

Answers (1)

shahidfoy
shahidfoy

Reputation: 2301

I believe you need to request location permissions before you can get the geolocation.

here is what i used

    private static final String[] INITIAL_PERMS={
        android.Manifest.permission.ACCESS_FINE_LOCATION,
        android.Manifest.permission.ACCESS_COARSE_LOCATION
};
private static final int INITIAL_REQUEST=1337;

create method for each permission

    @RequiresApi(api = Build.VERSION_CODES.M)
    private boolean canAccessFineLocation() {
       return(hasPermission(Manifest.permission.ACCESS_FINE_LOCATION));
    }

    @RequiresApi(api = Build.VERSION_CODES.M)
    private boolean canAccessCoarseLocation() {
      return(hasPermission(Manifest.permission.ACCESS_COARSE_LOCATION));
    }

    @RequiresApi(api = Build.VERSION_CODES.M)
    private boolean hasPermission(String perm) {
      return(PackageManager.PERMISSION_GRANTED ==checkSelfPermission(perm));
    }

in the onCreate make sure to add this

    if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.M){
       if(!canAccessCoarseLocation() || !canAccessFineLocation()){
        requestPermissions(INITIAL_PERMS, INITIAL_REQUEST);
       }
    }

also make sure you have this code in the chrome client

       webView.setWebChromeClient(new android.webkit.WebChromeClient() {

        // geolocation
        @Override
        public void onGeolocationPermissionsShowPrompt(String origin, android.webkit.GeolocationPermissions.Callback callback) {
            callback.invoke(origin, true, false);

        }

Upvotes: 2

Related Questions