如何在回调方法的每个时间间隔将经纬度数据添加到 Firebase 数据库
How to add lat long data to Firebase database every interval of callback method
我正在创建一个使用前台服务获取位置数据的路线跟踪应用程序。我有会话,对于每个会话,我都想要一个经度和纬度坐标列表。我目前只能存储一个坐标实例,它会更新每个回调间隔,而不是完全创建一个新集合。目的是有一个纬度和经度坐标列表,从中生成路线的多段线。
服务中的回调方法class:
// Location callback every
private final LocationCallback locationCallback = new LocationCallback() {
@Override
public void onLocationResult(LocationResult locationResult) {
super.onLocationResult(locationResult);
// If both locationResult and last location are not null then...
// This avoids null pointer exceptions as there are instances where last known location
// will be null
if(locationResult != null && locationResult.getLastLocation() != null){
location = locationResult.getLastLocation();
// Parse the location to the sendBroadcastMessage method to send data
// to receiver in RecordFragment classZ
sendBroadcastMessage(location);
}
}
};
广播方法:
// Method to send data service to receiver in the RecordFragment class
// Location is parsed to the method
private void sendBroadcastMessage(Location location) {
if (location != null) {
Intent intent = new Intent(ACTION_LOCATION_BROADCAST);
// Add extra data to the intent
// When the intent is parsed so is the extra data
intent.putExtra(EXTRA_LATITUDE, location.getLatitude());
intent.putExtra(EXTRA_LONGITUDE, location.getLongitude());
intent.putExtra(EXTRA_SPEED, location.getSpeed());
intent.putExtra(EXTRA_BEARING, location.getBearing());
// Send the data to receiver
LocalBroadcastManager.getInstance(LocationService.this).sendBroadcast(intent);
}
}
广播接收者:
/*
The data sent from the service is handled below
*/
LocalBroadcastManager.getInstance(getActivity()).registerReceiver(
new BroadcastReceiver() {
@SuppressLint({"SetTextI18n", "DefaultLocale"})
@Override
public void onReceive(Context context, Intent intent) {
// Received data is now assigned to variables
double latitude = intent.getDoubleExtra(LocationService.EXTRA_LATITUDE, 0);
double longitude = intent.getDoubleExtra(LocationService.EXTRA_LONGITUDE, 0);
float speed = intent.getFloatExtra(LocationService.EXTRA_SPEED, 0);
float bearing = intent.getFloatExtra(LocationService.EXTRA_BEARING, 0);
// Stopwatch timer is retrieved
time = watch.getTime();
// Calculate the conversion from m/s to knots
// assign calculated value to variable
speedInKnots = speed * 1.194;
// Cast the float to double
doubleBearing = (((double) bearing));
// Calculate conversion from milli-seconds to seconds
// assign calculated value to variable
timeInSeconds = time / 1000;
// Log the location data
Log.d(TAG, "onReceive: Lat: " + latitude + ", Long: " + longitude);
Log.d("Speed_before_conversion", "onReceive: Speed before conversion " + speed);
// Update the text views displayed in record fragment
// round() method called, double value parsed to it and the number of
// decimal places after the value
mCurrent_speedTv.setText("Speed is: " + round(speedInKnots, 2) + " knots");
mBearingTv.setText("Direction: " + round(doubleBearing, 2) + "\u00B0");
mElapsedTimeTv.setText("Elapsed time: " + round(timeInSeconds, 2) + " s");
FirebaseUser user = mAuth.getCurrentUser();
String uid = user.getUid();
Log.d(TAG, "Current user uid: " + uid);
// Put info into HashMap
latLongStoreServer.put("longitude", longitude);
latLongStoreServer.put("latitude", latitude);
FirebaseDatabase database = FirebaseDatabase.getInstance();
// Path toe store user data named "Users"
DatabaseReference reference = database.getReference("Users/" + uid);
// Put data within HashMap in database
reference.child("Sessions").child(sessionID).setValue(latLongStoreServer);
}
}, new IntentFilter(LocationService.ACTION_LOCATION_BROADCAST)
);
return view;
}
Firebase 数据库视图:
提前致谢。
非常简单的修复。使用 arraylist 而不是 HashMap。我已经实施了以下更改。
ArrayList<Double> latLong = new ArrayList<>(); // Create an ArrayList object
LocalBroadcastManager.getInstance(getActivity()).registerReceiver(
new BroadcastReceiver() {
@SuppressLint({"SetTextI18n", "DefaultLocale"})
@Override
public void onReceive(Context context, Intent intent) {
// Received data is now assigned to variables
double latitude = intent.getDoubleExtra(LocationService.EXTRA_LATITUDE, 0);
double longitude = intent.getDoubleExtra(LocationService.EXTRA_LONGITUDE, 0);
float speed = intent.getFloatExtra(LocationService.EXTRA_SPEED, 0);
float bearing = intent.getFloatExtra(LocationService.EXTRA_BEARING, 0);
// Stopwatch timer is retrieved
time = watch.getTime();
// Calculate the conversion from m/s to knots
// assign calculated value to variable
speedInKnots = speed * 1.194;
// Cast the float to double
doubleBearing = (((double) bearing));
// Calculate conversion from milli-seconds to seconds
// assign calculated value to variable
timeInSeconds = time / 1000;
// Log the location data
Log.d(TAG, "onReceive: Lat: " + latitude + ", Long: " + longitude);
Log.d("Speed_before_conversion", "onReceive: Speed before conversion " + speed);
// Update the text views displayed in record fragment
// round() method called, double value parsed to it and the number of
// decimal places after the value
mCurrent_speedTv.setText("Speed is: " + round(speedInKnots, 2) + " knots");
mBearingTv.setText("Direction: " + round(doubleBearing, 2) + "\u00B0");
mElapsedTimeTv.setText("Elapsed time: " + round(timeInSeconds, 2) + " s");
FirebaseUser user = mAuth.getCurrentUser();
String uid = user.getUid();
Log.d(TAG, "Current user uid: " + uid);
latLong.add(longitude);
latLong.add(latitude);
FirebaseDatabase database = FirebaseDatabase.getInstance();
// Path toe store user data named "Users"
DatabaseReference reference = database.getReference("Users/" + uid);
// Put data within HashMap in database
reference.child("Sessions").child(sessionID).setValue(latLong);
}
}, new IntentFilter(LocationService.ACTION_LOCATION_BROADCAST)
);
return view;
}
我正在创建一个使用前台服务获取位置数据的路线跟踪应用程序。我有会话,对于每个会话,我都想要一个经度和纬度坐标列表。我目前只能存储一个坐标实例,它会更新每个回调间隔,而不是完全创建一个新集合。目的是有一个纬度和经度坐标列表,从中生成路线的多段线。
服务中的回调方法class:
// Location callback every
private final LocationCallback locationCallback = new LocationCallback() {
@Override
public void onLocationResult(LocationResult locationResult) {
super.onLocationResult(locationResult);
// If both locationResult and last location are not null then...
// This avoids null pointer exceptions as there are instances where last known location
// will be null
if(locationResult != null && locationResult.getLastLocation() != null){
location = locationResult.getLastLocation();
// Parse the location to the sendBroadcastMessage method to send data
// to receiver in RecordFragment classZ
sendBroadcastMessage(location);
}
}
};
广播方法:
// Method to send data service to receiver in the RecordFragment class
// Location is parsed to the method
private void sendBroadcastMessage(Location location) {
if (location != null) {
Intent intent = new Intent(ACTION_LOCATION_BROADCAST);
// Add extra data to the intent
// When the intent is parsed so is the extra data
intent.putExtra(EXTRA_LATITUDE, location.getLatitude());
intent.putExtra(EXTRA_LONGITUDE, location.getLongitude());
intent.putExtra(EXTRA_SPEED, location.getSpeed());
intent.putExtra(EXTRA_BEARING, location.getBearing());
// Send the data to receiver
LocalBroadcastManager.getInstance(LocationService.this).sendBroadcast(intent);
}
}
广播接收者:
/*
The data sent from the service is handled below
*/
LocalBroadcastManager.getInstance(getActivity()).registerReceiver(
new BroadcastReceiver() {
@SuppressLint({"SetTextI18n", "DefaultLocale"})
@Override
public void onReceive(Context context, Intent intent) {
// Received data is now assigned to variables
double latitude = intent.getDoubleExtra(LocationService.EXTRA_LATITUDE, 0);
double longitude = intent.getDoubleExtra(LocationService.EXTRA_LONGITUDE, 0);
float speed = intent.getFloatExtra(LocationService.EXTRA_SPEED, 0);
float bearing = intent.getFloatExtra(LocationService.EXTRA_BEARING, 0);
// Stopwatch timer is retrieved
time = watch.getTime();
// Calculate the conversion from m/s to knots
// assign calculated value to variable
speedInKnots = speed * 1.194;
// Cast the float to double
doubleBearing = (((double) bearing));
// Calculate conversion from milli-seconds to seconds
// assign calculated value to variable
timeInSeconds = time / 1000;
// Log the location data
Log.d(TAG, "onReceive: Lat: " + latitude + ", Long: " + longitude);
Log.d("Speed_before_conversion", "onReceive: Speed before conversion " + speed);
// Update the text views displayed in record fragment
// round() method called, double value parsed to it and the number of
// decimal places after the value
mCurrent_speedTv.setText("Speed is: " + round(speedInKnots, 2) + " knots");
mBearingTv.setText("Direction: " + round(doubleBearing, 2) + "\u00B0");
mElapsedTimeTv.setText("Elapsed time: " + round(timeInSeconds, 2) + " s");
FirebaseUser user = mAuth.getCurrentUser();
String uid = user.getUid();
Log.d(TAG, "Current user uid: " + uid);
// Put info into HashMap
latLongStoreServer.put("longitude", longitude);
latLongStoreServer.put("latitude", latitude);
FirebaseDatabase database = FirebaseDatabase.getInstance();
// Path toe store user data named "Users"
DatabaseReference reference = database.getReference("Users/" + uid);
// Put data within HashMap in database
reference.child("Sessions").child(sessionID).setValue(latLongStoreServer);
}
}, new IntentFilter(LocationService.ACTION_LOCATION_BROADCAST)
);
return view;
}
Firebase 数据库视图:
提前致谢。
非常简单的修复。使用 arraylist 而不是 HashMap。我已经实施了以下更改。
ArrayList<Double> latLong = new ArrayList<>(); // Create an ArrayList object
LocalBroadcastManager.getInstance(getActivity()).registerReceiver(
new BroadcastReceiver() {
@SuppressLint({"SetTextI18n", "DefaultLocale"})
@Override
public void onReceive(Context context, Intent intent) {
// Received data is now assigned to variables
double latitude = intent.getDoubleExtra(LocationService.EXTRA_LATITUDE, 0);
double longitude = intent.getDoubleExtra(LocationService.EXTRA_LONGITUDE, 0);
float speed = intent.getFloatExtra(LocationService.EXTRA_SPEED, 0);
float bearing = intent.getFloatExtra(LocationService.EXTRA_BEARING, 0);
// Stopwatch timer is retrieved
time = watch.getTime();
// Calculate the conversion from m/s to knots
// assign calculated value to variable
speedInKnots = speed * 1.194;
// Cast the float to double
doubleBearing = (((double) bearing));
// Calculate conversion from milli-seconds to seconds
// assign calculated value to variable
timeInSeconds = time / 1000;
// Log the location data
Log.d(TAG, "onReceive: Lat: " + latitude + ", Long: " + longitude);
Log.d("Speed_before_conversion", "onReceive: Speed before conversion " + speed);
// Update the text views displayed in record fragment
// round() method called, double value parsed to it and the number of
// decimal places after the value
mCurrent_speedTv.setText("Speed is: " + round(speedInKnots, 2) + " knots");
mBearingTv.setText("Direction: " + round(doubleBearing, 2) + "\u00B0");
mElapsedTimeTv.setText("Elapsed time: " + round(timeInSeconds, 2) + " s");
FirebaseUser user = mAuth.getCurrentUser();
String uid = user.getUid();
Log.d(TAG, "Current user uid: " + uid);
latLong.add(longitude);
latLong.add(latitude);
FirebaseDatabase database = FirebaseDatabase.getInstance();
// Path toe store user data named "Users"
DatabaseReference reference = database.getReference("Users/" + uid);
// Put data within HashMap in database
reference.child("Sessions").child(sessionID).setValue(latLong);
}
}, new IntentFilter(LocationService.ACTION_LOCATION_BROADCAST)
);
return view;
}