GoogleMaps API v2 setMyLocationEnabled 与 LocationManager 不同
GoogleMaps API v2 setMyLocationEnabled is different from LocationManager
我可能有一个简单的问题,但我不知道哪里出了问题。
当我使用地图上的按钮设置我的位置时,该位置将近 100 个准确。
当我使用位置管理器获取我的位置时,我得到了大约 10-20 米的错误位置。
代码如下:
@Override
public void onMapReady(final GoogleMap googleMap) {
if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
return;
}
mGoogleMap = googleMap;
mGoogleMap.setMyLocationEnabled(true);
Button setLoc = (Button) findViewById(R.id.setLoc);
assert setLoc != null;
setLoc.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (ActivityCompat.checkSelfPermission(MainActivity.this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(MainActivity.this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
return;
}
mGoogleMap.clear();
LocationManager locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
Criteria criteria = new Criteria();
Location location = locationManager.getLastKnownLocation(locationManager.getBestProvider(criteria, false));
latLng = new LatLng(location.getLatitude(), location.getLongitude());
Toast.makeText(MainActivity.this, String.valueOf(latLng), Toast.LENGTH_LONG).show();
//zoom to current position:
mGoogleMap.moveCamera(CameraUpdateFactory.newLatLng(latLng));
mGoogleMap.animateCamera(CameraUpdateFactory.zoomTo(17));
mGoogleMap.addMarker(new MarkerOptions().position(latLng).title("Your location").anchor(0.0f, 1.0f));
}
});
}
我做错了什么?蓝点和我的标记不在同一个地方,蓝点有更好的精度,正如我上面所说的。
谢谢!
小更新
当我 运行 模拟器上的代码时,它几乎是相同的位置......嗯,在真实设备上它是不同的。可能是什么问题?
我认为这可能取决于设备。您需要将优先级更改为 PRIORITY_HIGH_ACCURACY
。在请求位置更新之前,您的应用程序必须连接到位置服务并发出位置请求。位置请求到位后,您可以通过调用 Google API 客户端提供的 requestLocationUpdates()
do this in the onConnected()
回调来开始定期更新,客户端准备就绪时调用。
使用 LocationListener 回调更新位置。调用 requestLocationUpdates()
,将您的 GoogleApiClient 实例、LocationRequest 对象和 LocationListener 传递给它。定义一个 startLocationUpdates()
方法,从 onConnected()
回调中调用。
@Override
public void onConnected(Bundle connectionHint) {
...
if (mRequestingLocationUpdates) {
startLocationUpdates();
}
}
protected void startLocationUpdates() {
LocationServices.FusedLocationApi.requestLocationUpdates(
mGoogleApiClient, mLocationRequest, this);
}
我可能有一个简单的问题,但我不知道哪里出了问题。
当我使用地图上的按钮设置我的位置时,该位置将近 100 个准确。
当我使用位置管理器获取我的位置时,我得到了大约 10-20 米的错误位置。
代码如下:
@Override
public void onMapReady(final GoogleMap googleMap) {
if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
return;
}
mGoogleMap = googleMap;
mGoogleMap.setMyLocationEnabled(true);
Button setLoc = (Button) findViewById(R.id.setLoc);
assert setLoc != null;
setLoc.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (ActivityCompat.checkSelfPermission(MainActivity.this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(MainActivity.this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
return;
}
mGoogleMap.clear();
LocationManager locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
Criteria criteria = new Criteria();
Location location = locationManager.getLastKnownLocation(locationManager.getBestProvider(criteria, false));
latLng = new LatLng(location.getLatitude(), location.getLongitude());
Toast.makeText(MainActivity.this, String.valueOf(latLng), Toast.LENGTH_LONG).show();
//zoom to current position:
mGoogleMap.moveCamera(CameraUpdateFactory.newLatLng(latLng));
mGoogleMap.animateCamera(CameraUpdateFactory.zoomTo(17));
mGoogleMap.addMarker(new MarkerOptions().position(latLng).title("Your location").anchor(0.0f, 1.0f));
}
});
}
我做错了什么?蓝点和我的标记不在同一个地方,蓝点有更好的精度,正如我上面所说的。 谢谢!
小更新 当我 运行 模拟器上的代码时,它几乎是相同的位置......嗯,在真实设备上它是不同的。可能是什么问题?
我认为这可能取决于设备。您需要将优先级更改为 PRIORITY_HIGH_ACCURACY
。在请求位置更新之前,您的应用程序必须连接到位置服务并发出位置请求。位置请求到位后,您可以通过调用 Google API 客户端提供的 requestLocationUpdates()
do this in the onConnected()
回调来开始定期更新,客户端准备就绪时调用。
使用 LocationListener 回调更新位置。调用 requestLocationUpdates()
,将您的 GoogleApiClient 实例、LocationRequest 对象和 LocationListener 传递给它。定义一个 startLocationUpdates()
方法,从 onConnected()
回调中调用。
@Override
public void onConnected(Bundle connectionHint) {
...
if (mRequestingLocationUpdates) {
startLocationUpdates();
}
}
protected void startLocationUpdates() {
LocationServices.FusedLocationApi.requestLocationUpdates(
mGoogleApiClient, mLocationRequest, this);
}