OnLocationChange将坐标发送到Firebase

时间:2016-12-29 13:27:19

标签: android google-maps firebase firebase-realtime-database

我正在制作一个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);
            }

        }
    });

}

2 个答案:

答案 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米分离。

这有帮助吗?