【问题标题】:Embedded Google Map can't get current location in WebView嵌入式谷歌地图无法在 WebView 中获取当前位置
【发布时间】:2013-05-05 08:39:57
【问题描述】:

我遵循了这个教程:http://android-er.blogspot.com/2013/03/embed-google-map-in-webview.html

我正在尝试仅在 WebView 中使用 Google 地图,但它无法获取我当前的位置。我在 WebView 上启用了 JavaScript。我还需要启用什么?

有人知道为什么会这样吗?它不应该提示我使用我当前的位置吗?

请注意,我对使用 MapView 作为替代方案不感兴趣。我试图找出我需要在 WebView 或设备的位置服务上设置什么?

【问题讨论】:

  • 认真的吗?没有其他人遇到过这个问题??
  • 嗨,Darren,我遇到了同样的问题,@Kumait 的解决方案已解决。您应该尝试相同的解决方案,如果可行,请接受它作为答案。

标签: google-maps google-places-api android-maps android-4.0-ice-cream-sandwich google-places


【解决方案1】:

您应该允许 web 视图通过覆盖方法 onGeolocationPermissionsShowPrompt 来访问您的位置,如下所示:

webView.setWebChromeClient(new WebChromeClient(){

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

【讨论】:

    【解决方案2】:

    在 API 5.x 及更低版本上,您将需要

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

    在你的AndroidManifest.xml

    但要允许 API 6.0+ 上的地理定位权限,您必须request the permission at runtime

    为此,请使用

    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;
                }
            }
        }
    }
    

    并接收结果:

    @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;
        }
    }
    

    在你的活动中。

    【讨论】:

      【解决方案3】:

      您可以通过 Google 地图试用 GreenDroid。

      检查一下:https://github.com/cyrilmottier/GreenDroid

      【讨论】:

        【解决方案4】:

        您必须启用android.permission.ACCESS_FINE_LOCATIONandroid.permission.INTERNET

        创建LocationManager 实例和LocationListener 实例

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

        并添加onLocationChanged(Location loc) 方法,在其中有你的loc 生成经度和纬度(String long = loc.getLongitude(); String lat = loc.getLatitude();

        现在使用long, lat 生成您的mapPath 字符串并继续生成WebView

        您可以将其用于参考:http://www.rdcworld-android.blogspot.in/2012/01/get-current-location-coordinates-city.html

        【讨论】:

        • 我认为我没有说清楚,但我提供的链接预计可以开箱即用。对于我的具体问题,我正在创建一个使用 JavaScript Google Maps API 的移动网站,因此我无法控制原生 WebView。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-11-26
        • 2021-09-11
        • 2016-01-31
        • 2014-02-19
        相关资源
        最近更新 更多