Маркер Google Maps API v2 по умолчанию не выровнен с нарисованным вручную маркером в LocationCallback () - PullRequest
0 голосов
/ 04 июля 2018

Последние пару недель я искал в Интернете об этом, и, похоже, я не задаю правильные вопросы, поэтому выкладываю один здесь. Заранее спасибо за любую информацию.

Использование 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" />

Пример изображения:

пример изображения карты Google

...