Я пытаюсь найти текущее местоположение пользователя в приложении на основе карты, но у меня возникают проблемы с синхронизацией данных.Код приведен ниже, но в основном я пытаюсь запустить функцию, которая (а) проверяет правильность разрешений и (b) предоставляет текущее положение GPS или сети, а затем (с) прослушиваетизменения в положении.
Ключом к коду является мой атрибут «Расположение»;если оно пустое, отобразите карту с центром по умолчанию в LatLong, в противном случае покажите текущую позицию на карте.
Что она делает так: когда я запускаю ее в первый раз, она запрашивает разрешения,но затем показывает LatLong по умолчанию в качестве цели.Если я закрою приложение и перезапущу его, приложение будет работать, как и ожидалось, с центром на текущем пользователе LatLong.
Я не знаю, почему оно не показывает текущих пользователей LatLong с первой попытки,Я установил точки останова, и код работает, как и ожидалось, с указанием текущего местоположения.Но если вы запускаете его в режиме выпуска или без каких-либо точек останова, по умолчанию используется исходное представление.
Эта ссылка ( Как отложить вызов onMapready в приложении на основе карты Google ) предлагает поставитьаналогичный вызов для получения координат в OnCreate перед getMapAsync, но это не работает.
Мой код приведен ниже, если кто-то может помочь!
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
mLocationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
setContentView(R.layout.activity_excursions);
// Obtain the SupportMapFragment and get notified when the map is ready to be used.
SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager()
.findFragmentById(R.id.map);
getCurrentLocation();
mapFragment.getMapAsync(this);
}
private void getCurrentLocation()
{
boolean bFineOK = false;
boolean bCoarseOK = false;
if(ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED)
bFineOK = true;
if(ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) == PackageManager.PERMISSION_GRANTED)
bCoarseOK = true;
if (!bFineOK || !bCoarseOK )
{
ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.ACCESS_COARSE_LOCATION}, PERMISSION_ALL);
//return;
}
else
{
// Everything OK, proceed as normal
}
boolean isGPSEnabled = mLocationManager.isProviderEnabled(LocationManager.GPS_PROVIDER);
boolean isNetworkEnabled = mLocationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER);
if (!(isGPSEnabled || isNetworkEnabled))
{
}
else {
if (isNetworkEnabled)
{
if( bCoarseOK && bFineOK )
{
mLocationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER,
LOCATION_UPDATE_MIN_TIME, LOCATION_UPDATE_MIN_DISTANCE, mLocationListener);
mLocation = mLocationManager.getLastKnownLocation(LocationManager.NETWORK_PROVIDER);
}
else
{
bTrack = false;
bInUK = false;
mLocation = null;
}
}
if (isGPSEnabled)
{
if( bCoarseOK && bFineOK )
{
mLocationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER,
LOCATION_UPDATE_MIN_TIME, LOCATION_UPDATE_MIN_DISTANCE, mLocationListener);
Location nullTest = mLocationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER);
if (nullTest != null) mLocation = nullTest;
// Sometimes mLocation is null, even though GPS is enabled - in this case,
// use Network as a fall back option
}
else {
mLocation = null; // no Location provided
}
}
}
}
public void onMapReady(GoogleMap googleMap)
{
mMap = googleMap;
mMap.setOnMarkerClickListener(this);
mMap.setMapType(GoogleMap.MAP_TYPE_HYBRID);
mMap.getUiSettings().setZoomControlsEnabled(true);
// if mLocation == null, use default location and show on map
// otherwise show currentLocation on map
// use mLocation here, but it is null !
}