Reputation: 41
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
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