如何解决如何在回调方法的每个时间间隔将经纬度数据添加到 Firebase 数据库
我正在创建一个使用前台服务获取位置数据的路线跟踪应用程序。我有会话,对于每个会话,我想要一个经度和纬度坐标列表。我目前只能存储一个坐标实例,它更新每个回调间隔,而不是完全创建一个新集合。目的是获得经纬度坐标列表,从中生成路线的折线。
服务类中的回调方法:
// 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 数据库视图:
提前致谢。
解决方法
非常简单的修复。使用数组列表而不是 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;
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。