Ваш код почти верен: для получения текущего местоположения необходимо настроить WebChromeClient
с onGeolocationPermissionsShowPrompt()
. Но onGeolocationPermissionsShowPrompt()
должно быть более сложным, чтобы разрешить разрешения для геолокации в API 6.0+: он должен запрашивать разрешение во время выполнения, а хост Activity должен обрабатывать ответ в onRequestPermissionsResult()
, как описано в this ответ EricRobertBrewer :
Для вашего исходного кода это может быть что-то вроде:
// Geolocation permission request code
private static final int RP_ACCESS_LOCATION = 1001;
// global variables for the origin for permission and interface used by the your application to set the Geolocation permission state for an origin
private String mGeolocationOrigin;
private GeolocationPermissions.Callback mGeolocationCallback;
public class GeoWebChromeClient extends WebChromeClient {
@Override
public void onGeolocationPermissionsShowPrompt(String origin, GeolocationPermissions.Callback callback) {
final String permission = Manifest.permission.ACCESS_FINE_LOCATION;
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M ||
ContextCompat.checkSelfPermission(MainActivity.this, permission) == PackageManager.PERMISSION_GRANTED) {
// that is you already implement, but it works only
// we're on SDK < 23 OR user has ALREADY granted permission
callback.invoke(origin, true, false);
} else {
if (ActivityCompat.shouldShowRequestPermissionRationale(MainActivity.this, permission)) {
// user has denied this permission before and selected [/] DON'T ASK ME AGAIN
// TODO Best Practice: show an AlertDialog explaining why the user could allow this permission, then ask again
} else {
// store
mGeolocationOrigin = origin;
mGeolocationCallback = callback;
// ask the user for permissions
ActivityCompat.requestPermissions(MainActivity.this, new String[] {permission}, RP_ACCESS_LOCATION);
}
}
}
}
и onRequestPermissionsResult()
в этом случае могут быть такими:
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
switch (requestCode) {
case RP_ACCESS_LOCATION:
boolean allow = false;
if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
// user has allowed these permissions
allow = true;
}
if (mGeolocationCallback != null) {
// use stored callback and origin for allowing Geolocation permission for WebView
mGeolocationCallback.invoke(mGeolocationOrigin, allow, false);
}
break;
}
}
Также ваше приложение должно было объявить android.permission.ACCESS_FINE_LOCATION
разрешение, объявленное AndroidManifest.xml
:
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />