I am saving the coordinates of the post posted by the users. I'm generating a push id and then using it to save both the data of the post and the geofire coordinates.
I want to show only those posts which are within 0.5 kms radius of them. I am using GeoFire
library for the same but I'm unable to achieve the task.
Here's how I'm generating the push id:
itemID = databaseReferenceRequests.push().getKey();
Here's how I'm using it to save geofire coordinates as well as the data of the posts:
geoFire.setLocation(itemID,
new GeoLocation(Double.parseDouble(currentLat.getText().toString()),
Double.parseDouble(currentLng.getText().toString())));
databaseReferenceRequests.child(itemID).setValue(hRequest);
It is getting saved like this:
The problem is that when I'm trying to fetch only those posts which are within 0.5 kms of my reach, it is not happening and all the posts whether near or far are getting retrieved.
Here's how I'm retrieving it:
public void retrieveHelpRequests() {
geoQuery = geoFire.queryAtLocation(new GeoLocation(currentLatDouble, currentLngDouble), 0.5);
geoQuery.addGeoQueryEventListener(new GeoQueryEventListener() {
@Override
public void onKeyEntered(String key, GeoLocation location) {
databaseReference.child("help-requests").addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
Map<String, String> newRequest = (Map<String, String>) dataSnapshot.getValue();
imageUID = newRequest.get("imageUIDh");
homelessDescription = newRequest.get("homelessDescription");
currentLat = newRequest.get("currentLat");
currentLng = newRequest.get("currentLng");
postedBy = newRequest.get("postedBy");
postedAtTime = newRequest.get("postedAtTime");
postedOnDate = newRequest.get("postedOnDate");
utcFormatDateTime = newRequest.get("utcFormatDateTime");
String timeStr = utcFormatDateTime;
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
df.setTimeZone(TimeZone.getTimeZone("UTC"));
Date date = null;
try {
// error on line below
date = df.parse(timeStr);
} catch (ParseException e) {
e.printStackTrace();
}
df.setTimeZone(TimeZone.getDefault());
final String persisted = df.format(date);
// Parse string from DB - UTC timezone
Date parsed = null;
try {
parsed = df.parse(persisted);
} catch (ParseException e) {
e.printStackTrace();
}
// Now convert to whatever timezone for display purposes
final SimpleDateFormat displayFormat = new SimpleDateFormat("h:mm a");
displayFormat.setTimeZone(TimeZone.getDefault());
formattedTime = displayFormat.format(parsed);
prepareDataForRequests();
}
@Override
public void onCancelled(DatabaseError databaseError) {
Snackbar snackbar = Snackbar
.make(coordinatorLayout, databaseError.getMessage(), Snackbar.LENGTH_LONG);
snackbar.setDuration(Snackbar.LENGTH_SHORT);
snackbar.show();
// helpRequestsLoadingDialog.dismiss();
progressBarLoadingRequests.setVisibility(View.INVISIBLE);
}
});
databaseReference.child("help-requests").addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(final DataSnapshot dataSnapshot) {
// adView.loadAd(request);
card_ads2.setVisibility(View.VISIBLE);
adView2.loadAd(request2);
if (snackbar != null) {
snackbar.dismiss();
}
progressBarLoadingRequests.setVisibility(View.INVISIBLE);
if (fastItemAdapter.getAdapterItemCount() == 0) {
emptyRVtext.setVisibility(View.VISIBLE);
emptyRVtexthh.setVisibility(View.VISIBLE);
card_ads2.setVisibility(View.INVISIBLE);
} else {
emptyRVtext.setVisibility(View.INVISIBLE);
emptyRVtexthh.setVisibility(View.INVISIBLE);
}
// progressBarLoadingRequests.setVisibility(View.INVISIBLE);
}
@Override
public void onCancelled(DatabaseError databaseError) {
Snackbar snackbar = Snackbar
.make(coordinatorLayout, databaseError.getMessage(), Snackbar.LENGTH_LONG);
snackbar.setDuration(Snackbar.LENGTH_SHORT);
snackbar.show();
// hRequestsLoadingDialog.dismiss();
progressBarLoadingRequests.setVisibility(View.INVISIBLE);
}
});
}
@Override
public void onKeyExited(String key) {
}
@Override
public void onKeyMoved(String key, GeoLocation location) {
}
@Override
public void onGeoQueryReady() {
}
@Override
public void onGeoQueryError(DatabaseError error) {
Toast.makeText(getBaseContext(), "Error retriving geoquery", Toast.LENGTH_SHORT).show();
}
});
}
Here's the error:
java.lang.NullPointerException: Attempt to invoke virtual method 'int java.lang.String.length()' on a null object reference
Please let me know how to retrieve only those posts which are within 0.5 kms of the user?
There is a way to find matches in Geo Query in Java also.. The code is very much similar to UI. Please look in the below link for working code snippet. https://youtu.be/M9d526OyG54 Searching for Driver:: 15th tutorial in Series.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With