2016-07-07 6 views
0

사용자 로그인과 등록이 Firebase 데이터베이스에 연결된 Android 앱을 만들었습니다.Android 사용자 위치를 Firebase 데이터베이스에 저장하고 Geofire를 사용하여지도에 표시하십시오.

맵에 로그인 한 사용자를 저장하고 표시하기 위해 Geofire를 사용하려고합니다. SF 차량 예제를 사용했으며 정직한 경우 그 점을 많이 이해하지 못합니다. 나는 정확한 코드를 사용하여 테스트하고 작동하는지 확인했으며 제공된 이미지에서 오류가 발생합니다. Error on device when I open the app

로그인 한 사용자의 위치를 ​​감지하고 실시간으로지도에 표시하는 기능을 작성하는 데 도움이 필요합니다. 사용자가 이동함에 따라 업데이트됩니다. 지금이 주에 걸려 있고 거기에 모두 시도했습니다. 거기에있다 (그것은 많이 아니다).

몇 가지 도움을 주시면 감사하겠습니다. 추가 정보가 필요합니다.

이것은 내가 사용하고있는 SF Vehicle 예제의 코드입니다. 원본은 샌프란시스코 버스 부서에 연결되어 표시되어 있으므로 데이터베이스에 위치를 쓰고 같은 위치에 표시하는 코드가 필요합니다. 방법.

package nixer.nixer; 

import android.app.AlertDialog; 
import android.app.Fragment; 
import android.content.Intent; 
import android.graphics.Color; 
import android.os.Bundle; 
import android.os.Handler; 
import android.os.SystemClock; 
import android.support.v4.app.FragmentActivity; 
import android.support.v7.app.AppCompatActivity; 
import android.support.v7.widget.Toolbar; 
import android.view.Menu; 
import android.view.MenuItem; 
import android.view.animation.AccelerateDecelerateInterpolator; 
import android.view.animation.Interpolator; 
import com.firebase.client.Firebase; 
import com.firebase.client.FirebaseError; 
import com.firebase.geofire.GeoFire; 
import com.firebase.geofire.GeoLocation; 
import com.firebase.geofire.GeoQuery; 
import com.firebase.geofire.GeoQueryEventListener; 
import com.firebase.geofire.LocationCallback; 
import com.google.android.gms.maps.CameraUpdateFactory; 
import com.google.android.gms.maps.GoogleMap; 
import com.google.android.gms.maps.SupportMapFragment; 
import com.google.android.gms.maps.model.*; 
import java.util.HashMap; 
import java.util.Map; 


public class MapActivity extends AppCompatActivity implements GeoQueryEventListener, GoogleMap.OnCameraChangeListener { 

private Firebase mRef; 
private String mUserId; 
private String itemsUrl; 
private static final GeoLocation INITIAL_CENTER = new GeoLocation(53.349805, -6.260309); 
private static final int INITIAL_ZOOM_LEVEL = 14; 
private static final String GEO_FIRE_REF = "https://nixer.firebaseio.com/"; 
private GoogleMap map; 
private Circle searchCircle; 
private GeoFire geoFire; 
private GeoQuery geoQuery; 

private Map<String,Marker> markers; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_map); 
    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); 
    setSupportActionBar(toolbar); 

    // setup map and camera position 
    SupportMapFragment mapFragment = (SupportMapFragment)getSupportFragmentManager().findFragmentById(R.id.map); 
    this.map = mapFragment.getMap(); 
    LatLng latLngCenter = new LatLng(INITIAL_CENTER.latitude, INITIAL_CENTER.longitude); 
    this.searchCircle = this.map.addCircle(new CircleOptions().center(latLngCenter).radius(1000)); 
    this.searchCircle.setFillColor(Color.argb(66, 255, 0, 255)); 
    this.searchCircle.setStrokeColor(Color.argb(66, 0, 0, 0)); 
    this.map.moveCamera(CameraUpdateFactory.newLatLngZoom(latLngCenter, INITIAL_ZOOM_LEVEL)); 
    this.map.setOnCameraChangeListener(this); 

    Firebase.setAndroidContext(this); 

    // setup GeoFire 
    this.geoFire = new GeoFire(new Firebase(GEO_FIRE_REF)); 
    // radius in km 
    this.geoQuery = this.geoFire.queryAtLocation(INITIAL_CENTER, 1); 

    // setup markers 
    this.markers = new HashMap<String, Marker>();  




    // Check Authentication 
    mRef = new Firebase(Constants.FIREBASE_URL); 
    if (mRef.getAuth() == null) { 
     loadLoginView(); 
    } 


    try { 
     mUserId = mRef.getAuth().getUid(); 
    } catch (Exception e) { 
     loadLoginView(); 
    } 

} 




@Override 
protected void onStop() { 
    super.onStop(); 
    // remove all event listeners to stop updating in the background 
    this.geoQuery.removeAllListeners(); 
    for (Marker marker: this.markers.values()) { 
     marker.remove(); 
    } 
    this.markers.clear(); 
} 

@Override 
protected void onStart() { 
    super.onStart(); 
    // add an event listener to start updating locations again 
    this.geoQuery.addGeoQueryEventListener(this); 
} 

@Override 
public void onKeyEntered(String key, GeoLocation location) { 
    // Add a new marker to the map 
    Marker marker = this.map.addMarker(new MarkerOptions().position(new LatLng(location.latitude, location.longitude))); 
    this.markers.put(key, marker); 
} 

@Override 
public void onKeyExited(String key) { 
    // Remove any old marker 
    Marker marker = this.markers.get(key); 
    if (marker != null) { 
     marker.remove(); 
     this.markers.remove(key); 
    } 
} 

@Override 
public void onKeyMoved(String key, GeoLocation location) { 
    // Move the marker 
    Marker marker = this.markers.get(key); 
    if (marker != null) { 
     this.animateMarkerTo(marker, location.latitude, location.longitude); 
    } 
} 

@Override 
public void onGeoQueryReady() { 
} 

@Override 
public void onGeoQueryError(FirebaseError error) { 
    new AlertDialog.Builder(this) 
      .setTitle("Error") 
      .setMessage("There was an unexpected error querying GeoFire: " + error.getMessage()) 
      .setPositiveButton(android.R.string.ok, null) 
      .setIcon(android.R.drawable.ic_dialog_alert) 
      .show(); 
} 

// Animation handler for old APIs without animation support 
private void animateMarkerTo(final Marker marker, final double lat, final double lng) { 
    final Handler handler = new Handler(); 
    final long start = SystemClock.uptimeMillis(); 
    final long DURATION_MS = 3000; 
    final Interpolator interpolator = new AccelerateDecelerateInterpolator(); 
    final LatLng startPosition = marker.getPosition(); 
    handler.post(new Runnable() { 
     @Override 
     public void run() { 
      float elapsed = SystemClock.uptimeMillis() - start; 
      float t = elapsed/DURATION_MS; 
      float v = interpolator.getInterpolation(t); 

      double currentLat = (lat - startPosition.latitude) * v + startPosition.latitude; 
      double currentLng = (lng - startPosition.longitude) * v + startPosition.longitude; 
      marker.setPosition(new LatLng(currentLat, currentLng)); 

      // if animation is not finished yet, repeat 
      if (t < 1) { 
       handler.postDelayed(this, 16); 
      } 
     } 
    }); 
} 

private double zoomLevelToRadius(double zoomLevel) { 
    // Approximation to fit circle into view 
    return 16384000/Math.pow(2, zoomLevel); 
} 

@Override 
public void onCameraChange(CameraPosition cameraPosition) { 
    // Update the search criteria for this geoQuery and the circle on the map 
    LatLng center = cameraPosition.target; 
    double radius = zoomLevelToRadius(cameraPosition.zoom); 
    this.searchCircle.setCenter(center); 
    this.searchCircle.setRadius(radius); 
    this.geoQuery.setCenter(new GeoLocation(center.latitude, center.longitude)); 
    // radius in km 
    this.geoQuery.setRadius(radius/1000); 
} 

업데이트 :

중포 기지 규칙 : 오류를 첨부 된 이미지에서

{ 
"rules": { 
    "users": { 
    "$uid": { 
     ".read": "auth != null && auth.uid == $uid", 
     ".write": "auth != null && auth.uid == $uid", 
     "items": { 
     "$item_id": { 
      "title": { 
      ".validate": "newData.isString() && newData.val().length > 0" 
      } 
     } 
     } 
    } 
    } 

    } 
} 
+0

는 보안 및 규칙 중포 기지 관련이있다. 추가 정보가 필요하면 질문에 규칙을 추가하십시오. – adolfosrs

+0

@ adolfosrs 나는 그 자신을 생각했다. 그러나 나는 그것을 어디서부터 시작해야할지 모르겠다. 내가 코드를 자동으로 데이터베이스에 수동으로, 모든 아이디어를 할 필요가 없습니다 위치를 추가할까요? 건배. 규칙을 추가했습니다 –

+0

@adolfosrs 규칙을 추가했습니다. –

답변

0
{ 
    "rules": { 
     "users": { 
      "$uid": { 
       ".read": true, 
       ".write": true, 
       "items": { 
        "$item_id": { 
         "title": { 
          ".validate": "newData.isString() && newData.val().length > 0" 
         } 
        } 
       } 
      } 
     } 
    } 
}