简体   繁体   English

为什么Google地图无法缩放我提供的纬度/经度?

[英]Why is google maps not zooming on the Lat/Long I provide?

I have implemented the Google Maps API v2 in my Android app. 我已经在Android应用中实现了Google Maps API v2。 I add a marker and zoom to level 14 when I open the activity containing the map fragment. 打开包含地图片段的活动时,我添加了一个标记并将其缩放到14级。

Here is how I add/update the marker: 这是我添加/更新标记的方法:

private void updateMarker() {
    if(marker != null){
        marker.remove();
    }
    LatLng latlng = new LatLng(Double.parseDouble(latitude), Double.parseDouble(longitude));
    marker = mMap.addMarker(new MarkerOptions().position(latlng).title(username));
    marker.setIcon((BitmapDescriptorFactory.fromResource(R.drawable.marker)));
    mMap.moveCamera(CameraUpdateFactory.newLatLng(latlng));
    mMap.animateCamera(CameraUpdateFactory.zoomTo(zoom), 2000, null);
}

It works correctly in debug via Android Studio, using a Nexus 5 with the latest Android installed. 使用装有最新Android的Nexus 5,它可以通过Android Studio在调试中正常运行。 The problem is when I run a release build. 问题是当我运行发行版时。 The marker is added in the correct place, the zoom animation works correctly, zooming to the correct level. 将标记添加到正确的位置,缩放动画正确运行,缩放到正确的级别。 But it doesn't move to the marker I added. 但这不会移动到我添加的标记上。

Use this 用这个

mMap.moveCamera(CameraUpdateFactory.newLatLngZoom(latlng, zoom));

Or 要么

 mMap.animateCamera(CameraUpdateFactory.newLatLngZoom(latlng, zoom), 2000, null);

Don't call both method right after each other. 不要立即调用这两个方法。

you should pass the result value of CameraUpdateFactory.newLatLngZoom(latlng, zoom) to animateCamera which returns a CameraUpdate that moves the center of the screen to a latitude and longitude specified by a LatLng object, and moves to the given zoom level. 您应该将CameraUpdateFactory.newLatLngZoom(latlng, zoom)的结果值传递给animateCamera ,该CameraUpdate返回的CameraUpdate会将屏幕的中心移至LatLng对象指定的经度和纬度,并移至给定的缩放级别。 You can read more about it here 您可以在这里了解更多信息

Implement GoogleApiClient.ConnectionCallbacks and override onConnected method as follows: 实现GoogleApiClient.ConnectionCallbacks并重写onConnected方法,如下所示:

@Override
public void onConnected(Bundle bundle) {
    Toast.makeText(this, "onConnected", Toast.LENGTH_SHORT).show();
    if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
        // TODO: Consider calling
        //    ActivityCompat#requestPermissions
        // here to request the missing permissions, and then overriding
        //   public void onRequestPermissionsResult(int requestCode, String[] permissions,
        //                                          int[] grantResults)
        // to handle the case where the user grants the permission. See the documentation
        // for ActivityCompat#requestPermissions for more details.
        return;
    }
    mGMLastKnownLocation = LocationServices.FusedLocationApi.getLastLocation(mGMGoogleApiClient);

    try {
        // Get LocationManager object from System Service LOCATION_SERVICE
        locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);

        // getting GPS status
        isGPSEnabled = locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER);

        // getting network status
        isNetworkEnabled = locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER);

        if (isGPSEnabled)  
        {
            Criteria criteria = new Criteria();
            String provider = locationManager.getBestProvider(criteria, true);
            //You can still do this if you like, you might get lucky
            mGMLastKnownLocation = locationManager.getLastKnownLocation(provider);

            if (mGMLastKnownLocation != null) {
                //place marker at current position
                mMap.clear();

                // Get latitude of the current location
                double latitude = mGMLastKnownLocation.getLatitude();

                // Get longitude of the current location
                double longitude = mGMLastKnownLocation.getLongitude();

                // Create a LatLng object for the current location
                latLng = new LatLng(latitude, longitude);

                // Show the current location in Google Map
                mMap.moveCamera(CameraUpdateFactory.newLatLng(latLng));

                // Zoom in the Google Map
                mMap.animateCamera(CameraUpdateFactory.zoomTo(7));

                MarkerOptions markerOptions = new MarkerOptions();
                markerOptions.position(new LatLng(latitude, longitude)).title("You are here!").snippet("Consider yourself located").icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_ORANGE));
                mCurrLocation = mMap.addMarker(markerOptions);

            } else {
                mGMLocationRequest = new LocationRequest();
                mGMLocationRequest.setInterval(5000); //5 seconds
                mGMLocationRequest.setFastestInterval(3000); //3 seconds
                mGMLocationRequest.setPriority(LocationRequest.PRIORITY_BALANCED_POWER_ACCURACY);
                LocationServices.FusedLocationApi.requestLocationUpdates(mGMGoogleApiClient, mGMLocationRequest, this);
            }

        } else {
            //prompt user to enable location

            if (!locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER)) {
                Intent i = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS);
                startActivity(i);
            }
        }
    } catch (Exception e) {
        Log.e("Error : Location", "Impossible to connect to LocationManager", e);
    }

}

Also, implement LocationListener and override the onLocationChanged method as follows: 另外,实现LocationListener并重写onLocationChanged方法,如下所示:

    @Override
    public void onLocationChanged(Location location) {

    //remove previous current location marker and add new one at current position
    if (mCurrLocation != null) {
        mCurrLocation.remove();
    }

    double latitude = location.getLatitude();
    double longitude = location.getLongitude();
    latLng = new LatLng(latitude, longitude);
    mMap.moveCamera(CameraUpdateFactory.newLatLng(latLng));
    mMap.animateCamera(CameraUpdateFactory.zoomTo(14));
    MarkerOptions markerOptions = new MarkerOptions();
    markerOptions.position(new LatLng(latitude, longitude)).title("Position").snippet("I am here").icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_ORANGE));
    mCurrLocation = mMap.addMarker(markerOptions);
    Toast.makeText(this, "Location Changed", Toast.LENGTH_SHORT).show();

    //If you only need one location, unregister the listener
    LocationServices.FusedLocationApi.removeLocationUpdates(mGMGoogleApiClient, this);


}

I hope it helps!! 希望对您有所帮助!!

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM