enter image description here

Так выглядит база данных Realtime в моей Firebase при отправке в нее текущего местоположения пользователя без использования уникального идентификатора.

Однако при использовании push () в коде он продолжает генерировать новые идентификаторы при каждом обновлении местоположения.

Можно ли постоянно обновлять местоположение пользователя без создания нового уникального идентификатора или полностью удалять обновление местоположения?

Вот моя активность по отправке местоположения в базу данных.

private GoogleMap mMap;
private GoogleApiClient mGoogleApiClient;
private Location mLocation;
private LocationManager mLocationManager;
private LocationRequest mLocationRequest;
private com.google.android.gms.location.LocationListener listener;
private long UPDATE_INTERVAL = 2000;
private long FASTEST_INTERVAL = 2000;
private LocationManager locationManager;
private LatLng latLng;
private boolean isPermission;


@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_maps);

    if(requestSinglePermission()){

        // Obtain the SupportMapFragment and get notified when the map is ready to be used.
        SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager()
                .findFragmentById(R.id.map);
        mapFragment.getMapAsync(this);

        mGoogleApiClient = new GoogleApiClient.Builder(this)
                .addConnectionCallbacks(this)
                .addOnConnectionFailedListener(this)
                .addApi(LocationServices.API)
                .build();

        mLocationManager = (LocationManager) this.getSystemService(Context.LOCATION_SERVICE);

        checkLocation();




    }



}

private boolean checkLocation() {

    if(!isLocationEnabled()){
        showAlert();
    }
    return isLocationEnabled();

}

private void showAlert() {
    final AlertDialog.Builder dialog = new AlertDialog.Builder(this);
    dialog.setTitle("Enable Location")
            .setMessage("Your Locations Settings is set to 'Off'.\nPlease Enable Location to " +
                    "use this app")
            .setPositiveButton("Location Settings", new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface paramDialogInterface, int paramInt) {

                    Intent myIntent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS);
                    startActivity(myIntent);
                }
            })
            .setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface paramDialogInterface, int paramInt) {

                }
            });
    dialog.show();
}

private boolean isLocationEnabled() {

    locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
    return locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER) ||
            locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER);
}

private boolean requestSinglePermission() {

    Dexter.withActivity(this)
            .withPermission(Manifest.permission.ACCESS_FINE_LOCATION)
            .withListener(new PermissionListener() {
                @Override
                public void onPermissionGranted(PermissionGrantedResponse response) {
                    isPermission = true;
                }

                @Override
                public void onPermissionDenied(PermissionDeniedResponse response) {
                    // check for permanent denial of permission
                    if (response.isPermanentlyDenied()) {
                        isPermission = false;
                    }
                }

                @Override
                public void onPermissionRationaleShouldBeShown(com.karumi.dexter.listener.PermissionRequest permission, PermissionToken token) {

                }


            }).check();

    return isPermission;
}


/**
 * Manipulates the map once available.
 * This callback is triggered when the map is ready to be used.
 * This is where we can add markers or lines, add listeners or move the camera. In this case,
 * we just add a marker near Sydney, Australia.
 * If Google Play services is not installed on the device, the user will be prompted to install
 * it inside the SupportMapFragment. This method will only be triggered once the user has
 * installed Google Play services and returned to the app.
 */
@Override
public void onMapReady(GoogleMap googleMap) {
    mMap = googleMap;

    if(latLng!=null){

        mMap.addMarker(new MarkerOptions().position(latLng).title("Marker in Current Location"));
        mMap.moveCamera(CameraUpdateFactory.newLatLngZoom(latLng,14F));

    }
}

@Override
public void onConnected(@Nullable Bundle bundle) {

    if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION)
            != PackageManager.PERMISSION_GRANTED &&
            ActivityCompat.checkSelfPermission(this,
                    Manifest.permission.ACCESS_COARSE_LOCATION) !=
                    PackageManager.PERMISSION_GRANTED) {
        return;
    }
    startLocationUpdates();
    mLocation = LocationServices.FusedLocationApi.getLastLocation(mGoogleApiClient);

    if (mLocation == null) {
        startLocationUpdates();
    }
    else {
        Toast.makeText(this, "Location not Detected", Toast.LENGTH_SHORT).show();
    }
}

private void startLocationUpdates() {

    mLocationRequest = LocationRequest.create()
            .setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY)
            .setInterval(UPDATE_INTERVAL);


    if (ActivityCompat.checkSelfPermission(this,
            Manifest.permission.ACCESS_FINE_LOCATION) !=
            PackageManager.PERMISSION_GRANTED &&
            ActivityCompat.checkSelfPermission(this,
                    Manifest.permission.ACCESS_COARSE_LOCATION) !=
                    PackageManager.PERMISSION_GRANTED) {
        return;
    }

    LocationServices.FusedLocationApi.requestLocationUpdates(mGoogleApiClient,
            mLocationRequest, this);

}

@Override
public void onConnectionSuspended(int i) {

}

@Override
public void onConnectionFailed(@NonNull ConnectionResult connectionResult) {

}

@Override
public void onLocationChanged(Location location) {

    String msg = "Updated Location: " +
            Double.toString(location.getLatitude()) + "," +
            Double.toString(location.getLongitude());
    Toast.makeText(this, msg, Toast.LENGTH_SHORT).show();


    LocationSend send = new LocationSend(
            location.getLongitude(),
            location.getLatitude()
    );
    DatabaseReference reference = FirebaseDatabase.getInstance().getReference("Users");
    reference.getKey();
    reference.child("User Location").setValue(send).addOnCompleteListener(new OnCompleteListener<Void>() {
        @Override
        public void onComplete(@NonNull Task<Void> task) {

            if(task.isSuccessful()){
                Toast.makeText(MapsActivity.this, "Location Saved", Toast.LENGTH_SHORT).show();

            }
            else{
                Toast.makeText(MapsActivity.this, "Location Not Saved", Toast.LENGTH_SHORT).show();
            }
        }
    });




    latLng = new LatLng(location.getLatitude(), location.getLongitude());

    SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager()
            .findFragmentById(R.id.map);
    mapFragment.getMapAsync(this);

}



@Override
protected void onStart() {
    super.onStart();

    if(mGoogleApiClient !=null){
        mGoogleApiClient.connect();
    }

}

@Override
protected void onStop() {
    super.onStop();


    if(mGoogleApiClient.isConnected()){
        mGoogleApiClient.disconnect();
    }

}

}

0
Rafael Campos 9 Окт 2021 в 16:15

2 ответа

Лучший ответ

Наиболее подходящим решением было бы реализовать аутентификацию Firebase и использовать сохранение широты и долготы следующим образом:

Firebase-root
  |
  --- users
       |
       --- $uid
             |
             --- location
                   |
                   --- latitude: 37.421795
                   |
                   --- longitude: -122.13792

Таким образом, вы всегда будете обновлять одно и то же местоположение. Вот необходимая ссылка:

String uid = FirebaseAuth.getInstance().getCurrentUser().getUid();
DatabaseReference db = FirebaseDatabase.getInstance().getReference();
DatabaseReference locationRef = db.child("users").child(uid).child("location");
1
Alex Mamo 9 Окт 2021 в 13:55

Если вы не хотите создавать новые идентификаторы, тогда firebase будет заменять ваши старые значения широты и долготы каждый раз новыми значениями, если они отличаются от существующих значений.

Когда вызывается функция push (), создается новый идентификатор. Если вы не хотите создавать новый идентификатор, вы можете использовать временную метку, чтобы определить, когда ваши широта и долгота обновляются с помощью метода System.currentTimeMilliS ().

Код будет как

LocationSend send = new LocationSend(
            location.getLongitude(),
            location.getLatitude(),
            System.currentTimeMillis()
    );
0
Suyog 9 Окт 2021 в 14:52