Добавить пользовательские маркеры на карты Google из геопунктов, хранящихся на базе Firebase - PullRequest
0 голосов
/ 14 февраля 2019

Извините за невежество, но я новичок в Android Studio и Java.Я много адаптировал следующий код из другого курса для своих нужд, но он не работает.

Я пытаюсь добавить пользовательские маркеры в свое приложение Google maps для Android.Места расположения маркеров хранятся в виде географических точек в базе данных.Я попытался сделать это с помощью маркера кластера.Приложение сразу падает, когда я пытаюсь запустить его со следующей сокращенной ошибкой.

java.lang.NullPointerException: попытка вызвать виртуальный метод com.google.firebase.firestore.CollectionReference com.google.firebase.firestore.FirebaseFirestore.collection (java.lang.String) 'для ссылки на пустой объект в com.codingwithmitch.googlemaps2018.ui.MapsActivity.addMapMarkers (MapsActivity.java:400) в com.codingwithmitch.googlemaps2018.ui.MapsActivity.onMapReady (MapsActivity.java:486)

Я пытаюсь отобразить каждый геопоинт в коллекции Stop Locations

Я не могу сделать снимок экрана с моей пожарной базой, но это выглядит следующим образом:

Коллекция "Stop Locations" >>>>> Документы "KzDQ2sITZ3O8GEoZgp0I", ... и т. Д. >>>>> Поля Geo: "" Имя: "" avatar: "" loc_id ""

ЕслиЯ должен был предположить, что я сказал бы, что mLocationInformations пуста, вероятно, происходит отсюда >> mLocationInformations.add (document.toObject (LocationInformation.class))

cода от 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]

1 Ответ

0 голосов
/ 14 февраля 2019

Чтобы решить эту проблему, добавьте следующую строку кода:

FirebaseFirestore mDb = FirebaseFirestore.getInstance();

Прямо перед этой строкой:

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

Таким образом, ваш FirebaseFirestore объект инициализирован правильно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...