Android Maps V2 API屏幕中心显示当前位置

4

我正在尝试完成这个看起来很简单的任务,但似乎还没有像预期的那样正常工作。我使用下面的方法,但手机会将地图缩放到市中心,距离我的蓝色位置点大约2公里。

public void setUpMap() {
        mGoogleMap.setMyLocationEnabled(true);

        String context = Context.LOCATION_SERVICE;

        LocationManager locationManager = (LocationManager)mContext.getSystemService(context);

        Criteria criteria = new Criteria();
        String provider = locationManager.getBestProvider(criteria, true);
        Location myLocation = locationManager.getLastKnownLocation(provider);

        double latitude = myLocation.getLatitude();
        double longitude = myLocation.getLongitude();

        LatLng latLng = new LatLng(latitude, longitude);

        mGoogleMap.moveCamera(CameraUpdateFactory.newLatLngZoom(latLng, 10));


    }

我尝试设置不同的缩放值,但没有太大的变化。我不确定是否应该设置一个新的LatLngBounds,因为每个人都说这是正确的方法。看起来我没有得到我的当前位置,而是我的城市位置。


所以您想在地图上获得精确准确的位置吗? - Imtiyaz Khalani
我想在地图上随意缩放到自己的位置,但是当我设置缩放比例时,相机会移动到我所在的位置之外,这很奇怪。换句话说,我想要看到手机屏幕中央的蓝色圆点。 - Edoardo Moreni
也许第一个位置不准确,你正在使用它来居中地图,之后位置更改为更准确的位置。尝试实现OnMyLocationChangeListener并在其中跟随更改。 - Mateusz Jablonski
请检查更新的答案。 - Imtiyaz Khalani
我的代码无缘无故地开始工作了,我猜问题出在getLastKnownLocation方法上,它把我指向了今天早上的一个地方。这很奇怪,但有没有办法检查lastknownLocation是在尝试currentlocation之后调用的呢? - Edoardo Moreni
getLastKnownLocation() 有时会返回旧的缓存值,甚至是 null。为什么不尝试使用 LocationClient 呢?相比 LocationManager 的 getLastKnownLocation(),getLastLocation() 更加准确。 - canopi
2个回答

2

新回答:

mMap.setMyLocationEnabled(true);

                Location myLocation = mMap.getMyLocation();

                if (myLocation != null) {
                    mMap.animateCamera(CameraUpdateFactory.newLatLngZoom(
                            new LatLng(myLocation.getLatitude(), myLocation
                                    .getLongitude()), 14));
                }

1
我得到了相同的结果。 - Edoardo Moreni
在这种情况下,它会缩小并显示初始地图,其中非洲位于中心。:\ - Edoardo Moreni
获取您的精确位置只需要很短的时间。一旦获取到,它会显示您的位置。 - Imtiyaz Khalani
它似乎并没有移动,有没有办法像我尝试的那样使用moveCamera?我真的不明白这个,它应该非常简单。 - Edoardo Moreni

1
这有点晚了,但有两种方法可以处理。

FusedLocation API

实现FusedLocation API(请参阅使您的应用程序具有位置感知功能),使用它来设置位置请求并获取位置修复。当您在回调中获得位置对象时,请使用它来在GoogleMap对象中设置位置。

@Override
public void onLocationChanged(Location location) {
    mCurrentLocation = location;
     mMap.animateCamera(CameraUpdateFactory.newLatLngZoom(
                    new LatLng(location.getLatitude(), location.getLongitude()), 15));
}

OnMyLocationChangeListener

GoogleMap类有一个OnMyLocationChangeListener,您可以像下面这样实现它来获取单个位置更新:

mMap.setOnMyLocationChangeListener(new GoogleMap.OnMyLocationChangeListener() {
        @Override
        public void onMyLocationChange(Location location) {
            mMap.animateCamera(CameraUpdateFactory.newLatLngZoom(
                    new LatLng(location.getLatitude(), location.getLongitude()), 15));
            mMap.setOnMyLocationChangeListener(null);
        }
    });

问题在于,该接口已被标记为弃用,Google建议使用FusedLocation API。如果您确实想使用它,请注意任何未来的API更改可能会使其无法使用并破坏您的应用程序。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接