我正在制作一个Capstone项目我现在非常需要帮助被困在这几天,我想在用户点击按钮时向Firebase发送位置更新。更新设置为每3秒发送一次位置更改。但问题是,一旦按下按钮,它只发送坐标,而不是连续发送位置变化的更新。这是我的代码
Start = (Button) findViewById(R.id.btnLoc);
Stop = (Button) findViewById(R.id.btnStopSend);
mRef = new Firebase ("FIREBASE URL");
Start.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
listener = new LocationListener() {
@Override
public void onLocationChanged(Location location) {
Firebase busCoords = mRef.child("Location");
busCoords.setValue(location.getLatitude()+ ", "+location.getLongitude());
}
@Override
public void onStatusChanged(String s, int i, Bundle bundle) {
}
@Override
public void onProviderEnabled(String s) {
}
@Override
public void onProviderDisabled(String s) {
}
};
locationManager = (LocationManager) getApplicationContext().getSystemService(Context.LOCATION_SERVICE);
//noinspection MissingPermission
locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER,3000,1000,listener);
}
});
Stop.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if(locationManager != null){
//noinspection MissingPermission
locationManager.removeUpdates(listener);
}
}
});
}
答案 0 :(得分:0)
使用firebase提供的 GeoFire Api 来获取位置更新。在onLocationChanged()
方法中,你必须这样做。
@Override
public void onLocationChanged(Location location) {
geoFire.setLocation("location", new GeoLocation(location.getLatitude(), location.getLongitude()), new GeoFire.CompletionListener() {
@Override
public void onComplete(String key, DatabaseError error) {
if (error != null) {
Toast.makeText(MapsActivity.this, "There was an error saving the location to GeoFire: " + error, Toast.LENGTH_LONG).show();
} else {
Toast.makeText(MapsActivity.this, "Location saved on server successfully!", Toast.LENGTH_LONG).show();
}
}
});
}
每次更改时,此方法都会为您提供LatLong。
答案 1 :(得分:0)
我看到有两件事情正在发生:
1)仅记录最后记录的位置。你在哪里:
Firebase busCoords = mRef.child("Location");
busCoords.setValue(location.getLatitude()+ ", "+location.getLongitude());
你应该把:
Firebase busCoords = mRef.child("Location");
busCoords.push().setValue(location.getLatitude()+ ", "+location.getLongitude());
这会将每个新位置作为列表项推送到您的Firebase数据库。
2)坐标之间的距离也可能太大:
locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER,3000,1000,listener);
在记录另一个位置之前,预计距离至少为1000米。您可能需要考虑在测试时将其更改为2或3米分离。
这有帮助吗?