Последние пару недель я искал в Интернете об этом, и, похоже, я не задаю правильные вопросы, поэтому выкладываю один здесь. Заранее спасибо за любую информацию.
Использование Android v7.1 и Google Maps API v2 Я хочу показать местоположение пользователя на фрагменте карты. У меня вопрос: почему маркер текущего местоположения по умолчанию (синий кружок на изображении ниже) часто не совпадает с маркером, который я вручную рисую, чтобы показать местоположение пользователя (зеленый кружок)? Код перерисовывает зеленый маркер при изменении местоположения, поэтому я пытаюсь выяснить, почему зеленый маркер перерисовывается не так часто, как маркер текущего местоположения по умолчанию.
Мне просто нужно обновить частоту / смещение, которое получает мой LocationCallback()
? В настоящее время он установлен на 500 мс с смещением 2 метра. Если это так, это окажет значительное влияние на батарею?
Я экспериментировал с использованием onLocationChanged()
вместо API слитного местоположения LocationCallback()
, но мой ручной маркер не обновляется, если у пользователя нет подключения к Интернету.
Я понимаю, что у меня что-то не так в моем коде, но я полагаю, что мое понимание недостаточно хорошее, и мне удается самому в этом разобраться. Еще раз спасибо заранее за понимание.
Соответствующий код и пример изображения:
От MainActivity:
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mapFragment = (SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.mapFragment);
mapFragment.getMapAsync(this);
mFusedLocationClient = LocationServices.getFusedLocationProviderClient(this);
mLocationCallback = new LocationCallback() {
@Override
public void onLocationResult(LocationResult locationResult) {
super.onLocationResult(locationResult);
mLastLocation = locationResult.getLastLocation();
mapManager.updateLocation(mLastLocation); //this is where the green marker is drawn
}
};
}
@Override
public void onConnectionSuspended(int i) {}
@Override
public void onConnectionFailed(@NonNull ConnectionResult connectionResult) {}
@Override
protected void onResume() {
super.onResume();
mapState = new MapState(this);
if (mapFragment == null) {
mapFragment = (SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.mapFragment);
mapFragment.getMapAsync(this);
}
}
@Override
public void onMapReady(GoogleMap googleMap) {
mapManager.mMap = googleMap;
mapManager.mMap.setOnMapLongClickListener(this);
mapState = new MapState(this);
//Initialize Google Play Services
if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
if (ContextCompat.checkSelfPermission(this,
Manifest.permission.ACCESS_FINE_LOCATION)
== PackageManager.PERMISSION_GRANTED) {
buildGoogleApiClient();
mapManager.mMap.setMyLocationEnabled(true);
}
}
else {
buildGoogleApiClient();
mapManager.mMap.setMyLocationEnabled(true);
}
CameraPosition position = mapState.getSavedCameraPosition();
if (position != null) {
CameraUpdate update = CameraUpdateFactory.newCameraPosition(position);
mapManager.mMap.setMapType(mapState.getSavedMapType());
}
}
protected synchronized void buildGoogleApiClient() {
//https://stackoverflow.com/questions/37102240/cannot-resolve-symbol-mgoogleapiclient-android-studio
mGoogleApiClient = new GoogleApiClient.Builder(this)
.addConnectionCallbacks(this)
.addOnConnectionFailedListener(this)
.addApi(LocationServices.API)
.build();
mGoogleApiClient.connect();
}
private void setupAndRequestLocationPermissions() {
mLocationRequest = new LocationRequest();
mLocationRequest.setInterval(500);
mLocationRequest.setFastestInterval(500);
mLocationRequest.setPriority(LocationRequest.PRIORITY_BALANCED_POWER_ACCURACY);
mLocationRequest.setSmallestDisplacement(2); //10 meters
if (ContextCompat.checkSelfPermission(this,
Manifest.permission.ACCESS_FINE_LOCATION)
== PackageManager.PERMISSION_GRANTED) {
mFusedLocationClient.requestLocationUpdates(mLocationRequest,
mLocationCallback,
null);
}
}
@Override
public void onConnected(@Nullable Bundle bundle) {
setupAndRequestLocationPermissions();
}
@Override
public void onLocationChanged(Location location) {
}
@Override
public void onRequestPermissionsResult(int requestCode,
String permissions[], int[] grantResults) {
switch (requestCode) {
case MY_PERMISSIONS_REQUEST_LOCATION: {
// If request is cancelled, the result arrays are empty.
if (grantResults.length > 0
&& grantResults[0] == PackageManager.PERMISSION_GRANTED) {
// Permission was granted.
if (ContextCompat.checkSelfPermission(this,
Manifest.permission.ACCESS_FINE_LOCATION)
== PackageManager.PERMISSION_GRANTED) {
if (mGoogleApiClient == null) {
buildGoogleApiClient();
}
mapManager.mMap.setMyLocationEnabled(true);
} else {
// Permission denied, Disable the functionality that depends on this permission.
Toast.makeText(this, "permission denied", Toast.LENGTH_LONG).show();
}
return;
}
}
}}
из манифеста:
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="com.google.android.providers.gsf.permission.READ_GSERVICES" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
Пример изображения: