2017-02-03 2 views
1

Ich mache eine App für Mitfahrgelegenheiten und benutze Firebase und Geofire. Wenn ich den Knopf "Finde Sameway Rides" drücke, werden mir Nutzer angezeigt, die sich in einem Umkreis von 700m in meiner Nähe befinden. Wenn jedoch kein Benutzer vorhanden ist, wird ein anderer Marker (grüner Marker) an meinem Standort zurückgegeben (pinker Marker). Ich weiß nicht, was mit meinem Code nicht stimmt. Ich habe viel versucht, aber das Problem bleibt gleich. Ich habe den Firebase-Support sogar um Hilfe gebeten, aber sie konnten ihn nicht beheben. Also bitte hilf mir.GeoFire, das einen anderen Marker auf den Quellort legt, wenn kein Benutzer in der Nähe gefunden wird

Var. was Sie brauchen

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); 

hier nun wissen, was

// 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. 
} 

Hier meine Datenbank ist Firebase database for my project Und ein Screenshot des Problems für Geofire Screenshot showing the problem

Regeln onbutton klicken geschieht

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

Welche der Methoden ausgelöst wird, sollte nicht sein? Wenn es "onKeyEntered" ist, sollten Sie sehen können, welcher Schlüssel falsch ausgelöst wird. –

+0

Wenn jemand in der Nähe ist, zeigt er mir diesen Benutzerstandort mit einem grünen Marker richtig an. An diesem Punkt funktioniert KeyEntered und onDataChange einwandfrei. Und onKeyEntered, onDataChange ist dafür verantwortlich, in meinem Fall die nahen Marker zu zeigen meine geofire Regeln? Sir bitte ich möchte, dass dieses Problem weggeht. – Shubhendra

+0

Sie müssen den Code in einem Debugger ausführen und sehen, welcher Schlüssel "onKeyEntered" auslöst. Sobald Sie wissen, * was * Schlüssel auslöst, können Sie hoffentlich herausfinden, * warum * es auslöst. –

Antwort

1
es ist nicht die perfekte Lösung

Okay, so habe ich herausgefunden, wie das Problem

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(); 

     } 

und es wie magic.Maybe gearbeitet zu lösen, aber es dient dem Zweck.

Verwandte Themen