Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/google-maps/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 如何在用户打开活动时在地图上添加标记,并在用户移动时更新每个标记的实时位置?_Android_Google Maps_Firebase_Google Maps Markers_Google Maps Android Api 2 - Fatal编程技术网

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