# #java #android #firebase-realtime-database #location #geofire
Вопрос:
Я пытаюсь использовать Geoquery, чтобы найти других ближайших пользователей в моем радиусе. В моем приложении у меня есть кнопка, которая при нажатии вызывает функцию с именем findClosestCars, которая использует geoQuery для ближайших пользователей в моем радиусе. Для того, чтобы использовать Geoquery, мне нужно захватить свою широту и долготу. Для этого я сохраняю широту и долготу в переменных двойного типа с именами широта и долгота. Широта и долгота захватываются объектом местоположения с именем currentlocation,например, широта=currentLocation.getLatitude (), долгота=currentLocation.getLongitude(). Вместо использования fusedlocation я пытаюсь получить текущее местоположение для заполнения текущего местоположения объекта. Ниже приведен мой код для findClosestCars
private void findClosestCars() {
latitude=currentLocation.getLatitude();
longitude=currentLocation.getLongitude();
databaseReference = FirebaseDatabase.getInstance().getReference("Lenders");
GeoFire geoFire = new GeoFire(databaseReference);
GeoQuery geoQuery = geoFire.queryAtLocation(new GeoLocation(latitude, longitude), radius);
geoQuery.removeAllListeners();
geoQuery.addGeoQueryEventListener(new GeoQueryEventListener() {
@Override
public void onKeyEntered(String key, GeoLocation location) {
if (!driverFound) {
driverFound = true;
driverFoundID = key;
closestLender = FirebaseDatabase.getInstance().getReference("Users").child("Lenders").child(driverFoundID);
;
showPictureAndPrice();
}
radius ;
}
@Override
public void onKeyExited(String key) {
}
@Override
public void onKeyMoved(String key, GeoLocation location) {
}
@Override
public void onGeoQueryReady() {
if (!driverFound) {
radius ;
}
}
@Override
public void onGeoQueryError(DatabaseError error) {
}
});
}
Ниже приведен код, чтобы захватить текущее местоположение и поместить его в переменную currentLocation
@Override
public void onLocationChanged(@NonNull Location location) {
currentLocation=location;
}
protected synchronized void builGoogleApiClient() {
mGoogleApiClient = new GoogleApiClient.Builder(this)
.addConnectionCallbacks(this)
.addOnConnectionFailedListener(this)
.addApi(LocationServices.API)
.build();
mGoogleApiClient.connect();
}
@Override
public void onConnected(@Nullable Bundle bundle) {
mLocationRequest = new LocationRequest();
mLocationRequest.setInterval(1000);
mLocationRequest.setFastestInterval(1000);
mLocationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED amp;amp; ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
// TODO: Consider calling
// ActivityCompat#requestPermissions
// here to request the missing permissions, and then overriding
// public void onRequestPermissionsResult(int requestCode, String[] permissions,
// int[] grantResults)
// to handle the case where the user grants the permission. See the documentation
// for ActivityCompat#requestPermissions for more details.
return;
}
LocationServices.FusedLocationApi.requestLocationUpdates(mGoogleApiClient, mLocationRequest, (com.google.android.gms.location.LocationListener) this);
}
Комментарии:
1. Как этот вопрос связан с Firebase?
Ответ №1:
Вы проверяете разрешения, но не запрашиваете их, если у вас их еще нет. Тебе нужно это сделать.