Embedded Google Map can't get current location in WebView

我们两清 提交于 2019-12-18 05:01:32

问题


I followed this tutorial: http://android-er.blogspot.com/2013/03/embed-google-map-in-webview.html

I'm trying to just use the Google Map in the WebView, but it can't get my current location. I've enabled JavaScript on the WebView. What else do I have to enable?

Does anyone know why that might be? Shouldn't it prompt me to use my current location?

Note that I am not interested in using a MapView as an alternative whatsoever. I'm trying to find out what I need to set on the WebView or maybe on the device's location services?


回答1:


You should permit the web view to access your location by overriding the method onGeolocationPermissionsShowPrompt like this:

webView.setWebChromeClient(new WebChromeClient(){

        @Override
        public void onGeolocationPermissionsShowPrompt(String origin, GeolocationPermissions.Callback callback) {
            callback.invoke(origin, true, false);
        }
    });



回答2:


On API 5.x and below, you will need

<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />

in your AndroidManifest.xml.

But to allow permissions for geolocation on API 6.0+, you have to request the permission at runtime.

To do this, use

private String mGeolocationOrigin;
private GeolocationPermissions.Callback mGeolocationCallback;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    // other setup

    myWebView.setWebChromeClient(new MyWebChromeClient());
}

private WebChromeClient mWebChromeClient = new WebChromeClient() {
    @Override
    public void onGeolocationPermissionsShowPrompt(String origin,
                                                   GeolocationPermissions.Callback callback) {
        // Geolocation permissions coming from this app's Manifest will only be valid for devices with API_VERSION < 23.
        // On API 23 and above, we must check for permission, and possibly ask for it.
        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) {
            // 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 {
                // ask the user for permissions
                ActivityCompat.requestPermissions(MainActivity.this, new String[] {permission}, RP_ACCESS_LOCATION);
                mGeolocationOrigin = origin;
                mGeolocationCallback = callback;
            }
        }
    }
}

and receive the result:

@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) {
                mGeolocationCallback.invoke(mGeolocationOrigin, allow, false);
            }
            break;
    }
}

in your activity.




回答3:


You can try GreenDroid with Google Maps.

Checkt it out: https://github.com/cyrilmottier/GreenDroid




回答4:


You'd have to enable android.permission.ACCESS_FINE_LOCATION and android.permission.INTERNET,

Create a LocationManager instance and LocationListener instance

LocationManager locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
LocationListener locationListener = new MyLocationListener();  
locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 5000, 10, locationListener);

and add onLocationChanged(Location loc) method that inside of it have your loc generate the longitude and latitude (String long = loc.getLongitude(); String lat = loc.getLatitude();)

and now use long, lat to generate your mapPath string and continue to generate the WebView

You can use this for ref: http://www.rdcworld-android.blogspot.in/2012/01/get-current-location-coordinates-city.html



来源:https://stackoverflow.com/questions/16486037/embedded-google-map-cant-get-current-location-in-webview

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!