当前位置: 代码迷 >> java >> 从Firebase上存储的geopint向Google地图添加自定义标记
  详细解决方案

从Firebase上存储的geopint向Google地图添加自定义标记

热度:40   发布时间:2023-07-31 11:52:01.0

请原谅我的无知,但我对Android Studio和Java还是陌生的。 我已经从另一门课程中适应了很多以下代码,以适应我的需求,但是它不起作用。

我正在尝试向我的Google Maps Android应用添加自定义标记。 标记的位置作为地理点存储在Firebase上。 我试图使用群集标记来做到这一点。 当我尝试使用以下缩短的错误运行该应用程序时,该应用程序立即崩溃。

java.lang.NullPointerException:尝试在com.codingwithmitch上的空对象引用上调用虚拟方法“ com.google.firebase.firestore.CollectionReference com.google.firebase.firestore.FirebaseFirestore.collection(java.lang.String)”。 com.codingwithmitch.googlemaps2018.ui.MapsActivity.onMapReady(MapsActivity.java:486)上的googlemaps2018.ui.MapsActivity.addMapMarkers(MapsActivity.java:400)

我正在尝试显示“停止位置”集合中的每个地理位置

我无法对firebase进行屏幕截图,但它看起来如下:

集合“停止位置” >>>>>文档“ KzDQ2sITZ3O8GEoZgp0I”,...等>>>>>字段Geo:“”名称:“”头像:“” loc_id“”

如果我猜我会说mLocationInformations为空,可能起源于>> >> mLocationInformations.add(document.toObject(LocationInformation.class))

来自MapsActivity的代码:

 private ClusterManager<ClusterMarker> mClusterManager;
private MyClusterManagerRenderer mClusterManagerRenderer;
private ArrayList<ClusterMarker> mClusterMarkers = new ArrayList<>();
private LocationInformation mLocationInformation;
private ArrayList<LocationInformation> mLocationInformations = new ArrayList<>();
private void addMapMarkers(){
    CollectionReference locationsRef = mDb
            .collection("Stop Locations");


    locationsRef.get().addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
        @Override
        public void onComplete(@NonNull Task<QuerySnapshot> task) {

            if(task.isSuccessful()){

                for (QueryDocumentSnapshot document : task.getResult()) {

                    mLocationInformations.add(document.toObject(LocationInformation.class));
                }

            } else {
                Log.d(TAG, "Error getting documents: ", task.getException());




            }
        }
    });
    if(mMap != null){

        if(mClusterManager == null){
            mClusterManager = new ClusterManager<ClusterMarker>(this.getApplicationContext(), mMap);
        }
        if(mClusterManagerRenderer == null){
            mClusterManagerRenderer = new MyClusterManagerRenderer(
                    this,
                    mMap,
                    mClusterManager
            );
            mClusterManager.setRenderer(mClusterManagerRenderer);
        }

        for(LocationInformation locationInformation: mLocationInformations){

            Log.d(TAG, "addMapMarkers: location: " + locationInformation.getGeo().toString());
            try{
                String snippet = "";
                snippet = "";



                int avatar = R.drawable.cartman_cop; // set the default avatar
                try{
                    avatar = Integer.parseInt(locationInformation.getAvatar());
                }catch (NumberFormatException e){
                    Log.d(TAG, "addMapMarkers: no avatar  ");
                }
                ClusterMarker newClusterMarker = new ClusterMarker(
                        new LatLng(locationInformation.getGeo().getLatitude(), locationInformation.getGeo().getLongitude()),
                        //locationInformation.getName().getUsername(),
                        locationInformation.getLoc_id(),
                        snippet,
                        avatar,
                        locationInformation.getName()
                );
                mClusterManager.addItem(newClusterMarker);//adding to the map
                mClusterMarkers.add(newClusterMarker);//making an easy access array list

            }catch (NullPointerException e){
                Log.e(TAG, "addMapMarkers: NullPointerException: " + e.getMessage() );
            }

        }
        mClusterManager.cluster();


    }
}



@Override
public void onMapReady(GoogleMap googleMap) {
    mMap = googleMap;
    if(mLocationPermissionGranted){
        getDeviceLocation();
    }else{
        Toast.makeText(this, "mLocationpermission denied at origin", Toast.LENGTH_SHORT).show();
    }
    addMapMarkers();
}

}

LocationInfromation.java

  import com.google.firebase.firestore.GeoPoint;

public class LocationInformation {
private String Name;
private GeoPoint Geo;
private String  avatar;
private String loc_id;


public LocationInformation(String Name, GeoPoint Geo, String avatar, String loc_id) {
    this.Name = Name;
    this.Geo = Geo;
    this.avatar = avatar;
    this.loc_id = loc_id;

}

public LocationInformation(){

}



public String getLoc_id() {
    return loc_id;
}

public void setLoc_id(String loc_id) {
    this.loc_id = loc_id;
}

public Double getLongitude() {
    return longitude;
}

public void setLongitude(Double longitude) {
    this.longitude = longitude;
}

private Double longitude;



public String getName() {
    return Name;
}

public void setName(String name) {
    this.Name = Name;
}

public GeoPoint getGeo() {
    return Geo;
}

public void setGeo(GeoPoint geo) {
    this.Geo = Geo;
}

public String getAvatar() {
    return avatar;
}

public void setAvatar(String avatar) {
    this.avatar = avatar;
}

@Override
public String toString() {
    return "LocationInformation{" +
            "Name=" + Name +
            ", Geo=" + Geo +
            ", avatar='" + avatar +
            ", loc_id='" + loc_id +

            '}';
}

}

ClusterMArker.java

 import com.google.android.gms.maps.model.LatLng;
  import com.google.maps.android.clustering.ClusterItem;

 public class ClusterMarker implements ClusterItem {

private LatLng position; // required field
private String title; // required field
private String snippet; // required field
private int iconPicture;
private String name;

public ClusterMarker(LatLng position, String title, String snippet, int iconPicture, String name) {
    this.position = position;
    this.title = title;
    this.snippet = snippet;
    this.iconPicture = iconPicture;
    this.name = name;
}
public ClusterMarker() {

}

public String getName() {
    return name;
}

public void setName(String name) {
    this.name = name;
}

public int getIconPicture() {
    return iconPicture;
}

public void setIconPicture(int iconPicture) {
    this.iconPicture = iconPicture;
}



public void setPosition(LatLng position) {
    this.position = position;
}

public void setTitle(String title) {
    this.title = title;
}

public void setSnippet(String snippet) {
    this.snippet = snippet;
}

public LatLng getPosition() {
    return position;
}

public String getTitle() {
    return title;
}

public String getSnippet() {
    return snippet;
}

}

[在此处输入图片描述] [1]

要解决此问题,请添加以下代码行:

FirebaseFirestore mDb = FirebaseFirestore.getInstance();

就在这行之前:

CollectionReference locationsRef = mDb.collection("Stop Locations");

因此,您的FirebaseFirestore对象已正确初始化。

  相关解决方案