Android 如何在用户打开活动时在地图上添加标记,并在用户移动时更新每个标记的实时位置?
我的应用程序中有一个活动,其中有一个Android 如何在用户打开活动时在地图上添加标记,并在用户移动时更新每个标记的实时位置?,android,google-maps,firebase,google-maps-markers,google-maps-android-api-2,Android,Google Maps,Firebase,Google Maps Markers,Google Maps Android Api 2,我的应用程序中有一个活动,其中有一个地图,当用户从他们的设备打开此活动时,会添加一个标记,显示他们的当前位置,然后添加一个内部服务类,其中包含更新实时位置的代码 这是我的密码: mDatabase.child(rID).addChildEventListener(new ChildEventListener() { @Override public void onChildAdded(DataSnapshot dataSnapsho
地图
,当用户从他们的设备打开此活动时,会添加一个标记,显示他们的当前位置,然后添加一个内部服务
类,其中包含更新实时位置的代码
这是我的密码:
mDatabase.child(rID).addChildEventListener(new ChildEventListener() {
@Override
public void onChildAdded(DataSnapshot dataSnapshot, String s) {
if (dataSnapshot.getValue() != null) {
Map<String, String> newAcceptedUser = (Map<String, String>) dataSnapshot.getValue();
pAccepted = newAcceptedUser.get("pName");
uidPAccepted = newAcceptedUser.get("pUrl");
String cLatS = newAcceptedUser.get("currentLat").trim();
currentLtAU = Double.parseDouble(cLatS);
String cLngS = newAcceptedUser.get("currentLng").trim();
currentLnAU = Double.parseDouble(cLngS);
Toast.makeText(getBaseContext(), pAccepted.trim() + " joined", Toast.LENGTH_LONG).show();
pMarker = mMap.addMarker(new MarkerOptions().position(new LatLng(currentLtAU, currentLnAU)).title(pAccepted.trim()));
venueMarker = mMap.addMarker(new MarkerOptions().position(new LatLng(Double.parseDouble(venueLat), Double.parseDouble(venueLng))).title("Play at " + venue.trim()).icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_GREEN)));
markersList.add(pMarker);
markersList.add(venueMarker);
////get the latLngbuilder from the marker list
LatLngBounds.Builder builder = new LatLngBounds.Builder();
for (Marker m : markersList) {
builder.include(m.getPosition());
}
//Bounds padding here
int padding = 100;
//Create bounds here
LatLngBounds bounds = builder.build();
//Create camera with bounds
final CameraUpdate cu = CameraUpdateFactory.newLatLngBounds(bounds, padding);
startService(new Intent(getBaseContext(), ALocationService.class));
//Check map is loaded
mMap.setOnMapLoadedCallback(new GoogleMap.OnMapLoadedCallback() {
@Override
public void onMapLoaded() {
mMap.animateCamera(cu);
mMap.getUiSettings().setZoomControlsEnabled(true);
mMap.getUiSettings().setMapToolbarEnabled(true);
mMap.setMapType(GoogleMap.MAP_TYPE_SATELLITE);
mMap.setMaxZoomPreference(19.0f);
}
});
} else {
Snackbar snackbar = Snackbar
.make(coordinatorLayout, "Some error occurred. Please retry!", Snackbar.LENGTH_SHORT);
snackbar.show();
}
}
...
...
});
下面是onBackPressed()的onBackPressed()
:
以下是数据结构的外观:
-app
-child
-rID
-uniqueId
-key: value
-key: value
-key: value
-uniqueId
-key: value
-key: value
-key: value
-uniqueId
-key: value
-key: value
-key: value
问题在于,当不同的用户从他们的设备打开此活动时,会发生一些奇怪的事情。就像有时venueMarker
被重命名为pMarker
或者一个用户立即添加了2-3个标记,或者用户无法看到其他用户在地图上的实时位置更新,当按下后退按钮时,这个Toast.makeText(getBaseContext(),pAccepted.trim()+“left”,Toast.LENGTH\u LONG)。show();代码>显示其他用户的名称,而不是已离开的用户的名称
这一切都很复杂如果你能建议我一些简单的方法,或者改进我的代码,让我知道问题所在,那将非常有帮助 看起来您正处于添加大量日志语句将有所帮助的阶段。添加大量日志记录,运行代码,并查看出现问题时日志显示的内容。根据需要添加更多日志记录,以深入了解问题。@DanielNugent但没有任何运行时或编译错误,这只是我所应用的逻辑的问题,这就是为什么我要求提供一些简单的方法或相关教程:|是的,没错。您需要使用额外的日志记录,以便找出发生错误的原因。在所有重要部分中添加日志,并记录重要变量的值。您将在日志中看到成功案例的样子,然后您可以将其与出现问题的会话的日志进行比较。这就是我在大型代码库中解决复杂问题所做的,您应该能够相当快地找出哪里出了问题。只需继续添加更多日志,运行代码,然后查看日志。就这么简单!您是否在服务中添加标记???我认为这就是问题所在。我记得我做过一个类似的应用程序。我的服务的目的只是获取标记的latlng值和其他信息,然后传递给我的活动,活动将可靠地绘制标记。
@Override
public void onBackPressed() {
new AlertDialog.Builder(AcceptedRequest.this)
.setMessage("Are you sure you want to quit?")
.setPositiveButton("Yes", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
Toast.makeText(getBaseContext(), pAccepted.trim() + " left", Toast.LENGTH_LONG).show();
markersList.remove(pMarker);
markersList.remove(venueMarker);
pMarker.remove();
venueMarker.remove();
stopService(new Intent(getBaseContext(), ALocationService.class));
subscription.unsubscribe();
finish();
}
})
.setNegativeButton("No", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
// do nothing
}
})
.show();
}
-app
-child
-rID
-uniqueId
-key: value
-key: value
-key: value
-uniqueId
-key: value
-key: value
-key: value
-uniqueId
-key: value
-key: value
-key: value