Получение текущего местоположения в приложении на основе карты - PullRequest
0 голосов
/ 18 декабря 2018

Я пытаюсь найти текущее местоположение пользователя в приложении на основе карты, но у меня возникают проблемы с синхронизацией данных.Код приведен ниже, но в основном я пытаюсь запустить функцию, которая (а) проверяет правильность разрешений и (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 !
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...