OnLocationChange отправить координаты в Firebase

I am making a Capstone Project i badly needed help got stuck on this for a few days now, i want to send an location updates to Firebase when the user Clicks on a button. Обновления отправляются каждые 3 секунды при изменении местоположения . Но проблема в том, что он отправляет координаты только после нажатия кнопки, а не постоянно отправляет обновления при изменении местоположения. Вот мой код

Start = (Button) findViewById(R.id.btnLoc);
Stop = (Button) findViewById(R.id.btnStopSend);

    mRef = new Firebase ("FIREBASE URL");

    Start.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {

        listener = new LocationListener() {
            @Override
            public void onLocationChanged(Location location) {

                Firebase busCoords = mRef.child("Location");
                busCoords.setValue(location.getLatitude()+ ",   "+location.getLongitude());
            }

            @Override
            public void onStatusChanged(String s, int i, Bundle bundle) {
            }

            @Override
            public void onProviderEnabled(String s) {
            }

            @Override
            public void onProviderDisabled(String s) {
            }
        };

            locationManager = (LocationManager) getApplicationContext().getSystemService(Context.LOCATION_SERVICE);

            //noinspection MissingPermission
            locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER,3000,1000,listener);
        }
    });

    Stop.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            if(locationManager != null){
                //noinspection MissingPermission
                locationManager.removeUpdates(listener);
            }

        }
    });

}

2 ответа

  1. Используйте Geofire Api от firebase для получения обновлений местоположения. В вашем onLocationChanged()методе вы должны делать это так.

     @Override
    public void onLocationChanged(Location location) {
        geoFire.setLocation("location", new GeoLocation(location.getLatitude(), location.getLongitude()), new GeoFire.CompletionListener() {
            @Override
            public void onComplete(String key, DatabaseError error) {
                if (error != null) {
                    Toast.makeText(MapsActivity.this, "There was an error saving the location to GeoFire: " + error, Toast.LENGTH_LONG).show();
                } else {
                    Toast.makeText(MapsActivity.this, "Location saved on server successfully!", Toast.LENGTH_LONG).show();
    
                }
            }
        });
    }
    

    Этот метод даст вам Латлонг каждый раз, когда он меняется.

  2. Есть две вещи, которые я вижу, что происходит:

    1) записывается только последнее записанное местоположение. Где вы имеете:

    Firebase busCoords = mRef.child("Location");
    busCoords.setValue(location.getLatitude()+ ",   "+location.getLongitude());
    

    Вы должны положить:

    Firebase busCoords = mRef.child("Location");
    busCoords.push().setValue(location.getLatitude()+ ",   "+location.getLongitude());
    

    Это приведет к перемещению каждого нового местоположения в качестве элемента списка в базу данных Firebase.

    2) возможно, что расстояние между координатами также слишком велико:

    locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER,3000,1000,listener);
    

    Это предполагает расстояние по крайней мере 1000 метров, прежде чем он записывает другое местоположение. Вы можете рассмотреть вопрос об изменении этого на 2 или 3 метра в настоящее время во время тестирования.

    Помогает ли это?