2017-02-03 7 views
1

Я делаю приложение для Android и использую firebase и geofire. Когда я нажимаю кнопку «Find Sameway Rides», она показывает мне пользователей, которые находятся в радиусе 700 м рядом со мной. Но когда нет пользователя, он возвращает еще один маркер (зеленый маркер) в моем местоположении (розовый маркер). Я не знаю, что не так с моим кодом. Я много пробовал, но проблема остается прежней. Я даже попросил поддержку Firebase для помощи, но они не смогли ее исправить. Так что, пожалуйста, помогите.GeoFire помещает другой маркер в исходное местоположение, если поблизости нет пользователя

Var. которые вы должны знать

private DatabaseReference mDatabase; 
//for geofire 
private DatabaseReference geoDatabase; 
public GeoFire geoFire; 
public GeoQuery geoQuery; 

    // [START initialize_database_ref] 
    mDatabase = FirebaseDatabase.getInstance().getReference(); 
    // [END initialize_database_ref] 
    geoDatabase = mDatabase.child("/Ridedata/Geodatafrom/"); 
    geoFire = new GeoFire(geoDatabase); 

Теперь вот что происходит onbutton нажмите

// post data to server and show nearby rides 
public void nowFindRide(View view) throws JSONException { 
    //Sending user info to database... 
    final String from = eetsource.getText().toString(); 
    final String to = eetdestination.getText().toString(); 
    final String when = leavetext.getText().toString(); 
    final String name = user_name.getText().toString(); 
    final String email = user_email.getText().toString(); 
    final String picture = profile_pic_url.getString("url"); 
    userAuth = FirebaseAuth.getInstance(); 
    authCurrentUser = userAuth.getCurrentUser(); 
    final String uKey = authCurrentUser.getUid(); 
    double fromLat = currentLatLng.latitude; 
    double fromLong = currentLatLng.longitude; 
    if (fromLat == 0.0 && fromLong == 0.0) { 
     fromLat = sourcelat; 
     fromLong = sourcelong; 
    } else { 
     fromLat = currentLatLng.latitude; 
     fromLong = currentLatLng.longitude; 
    } 
    final long uid = Id; 

    // post data to server. 
    final String uniqueKey = mDatabase.child("Ridedata").push().getKey(); 
    LocationData locationData = new LocationData(name, from, to, when, picture, email); 
    Map<String, Object> dataValues1 = locationData.toMap(); 
    final Map<String, Object> childUpdates = new HashMap<>(); 
    childUpdates.put("/Ridedata/" + "/Ridedetail/" + uKey, dataValues1); 
    geoFire.setLocation(uKey, new GeoLocation(fromLat, fromLong)); 
    geoQuery = geoFire.queryAtLocation(new GeoLocation(fromLat, fromLong), radius); 
    geoQuery.addGeoQueryEventListener(new GeoQueryEventListener() { 

     @Override 
     public void onKeyEntered(final String key, final GeoLocation location) { 
      geoDatabase.child("Geodatafrom").addValueEventListener(new ValueEventListener() { 
       @Override 
       public void onDataChange(DataSnapshot dataSnapshot) { 
        Log.d(TAG,"data change:"+ dataSnapshot); 
        // One nearbyUser = dataSnapshot.getValue(One.class); 
        setNearbyMarker(new LatLng(location.latitude,location.longitude)); 
       } 

       @Override 
       public void onCancelled(DatabaseError databaseError) { 
        Log.d(TAG,"the read failed: " + databaseError.getMessage()); 
       } 
      }); 
     } 

     @Override 
     public void onKeyExited(String key) { 
      Log.d(TAG,"Key %s is no longer in the search area" + key); 
     } 

     @Override 
     public void onKeyMoved(String key, GeoLocation location) { 
      Log.d(TAG,String.format("Key %s moved within the search area to [%f,%f]", 
        key, location.latitude, location.longitude)); 
     } 

     @Override 
     public void onGeoQueryReady() { 
      Log.d(TAG,"All initial data has been loaded and events have been fired!"); 
     } 

     @Override 
     public void onGeoQueryError(DatabaseError error) { 
      Log.d(TAG,"There was an error with this query: " + error); 
     } 
    }); 
    mDatabase.updateChildren(childUpdates); 

    // done flushing data into database. 
} 

Вот моя база данных Firebase database for my project И скриншот проблемы Screenshot showing the problem

правила Geofire

"Geofire": { 
    ".indexOn": "g" 
    } 
+0

Какой из методов запускается, что не должно быть? Если его 'onKeyEntered', вы сможете увидеть, какие ключевые триггеры неверно. –

+0

Когда кто-то рядом, он правильно показывает мне это местоположение пользователя с зеленым маркером. Итак, в этот момент onKeyEntered и onDataChange работают отлично. И onKeyEntered, onDataChange отвечает за отображение соседних маркеров в моем случае. По вашему мнению, есть некоторые проблемы с мои правила geofire? Сэр, пожалуйста, я хочу, чтобы эта проблема исчезла. – Shubhendra

+0

Вам нужно будет запустить код в отладчике и посмотреть, какой ключ запускает 'onKeyEntered'. После того, как вы знаете, что * вызывает триггеры, вы можете надеяться выяснить, почему это срабатывает. –

ответ

1

Хорошо, так я понял, как решить этот вопрос

geoQuery.addGeoQueryEventListener(new GeoQueryEventListener() { 

     @Override 
     public void onKeyEntered(final String key, final GeoLocation location) { 

      if (key != uKey){ 
       setNearbyMarker(new LatLng(location.latitude,location.longitude),key); 

      } 
     // markerDestination.add(key); 
     } 

     @Override 
     public void onKeyExited(String key) { 
      Log.d(TAG,"Key %s is no longer in the search area" + key); 

       Sorrydialog sorrydialog = new Sorrydialog(); 
       sorrydialog.showDialog(BliMaps.this); 
       markerDestination.remove(); 

     } 

и она работала как magic.Maybe это не идеальное решение, но она служит цели.