当前位置: 首页 > 知识库问答 >
问题:

如何获取Firebase实时数据库中保存的所有地址,并将其显示为google地图上的标记

阎阎宝
2023-03-14

我需要确保用户添加的标记对google maps活动中的所有其他用户也是可见的,因此,例如,如果4个用户在地图的末尾各放置一个标记,则必须显示所有4个。我试着这样做,但一旦我点击Cardview,就可以进入谷歌地图。

我在addrees之前使用了日志,也使用了gender,它们都是“Null”,我如何解决?

出现此错误

java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String java.lang.Object.toString()' on a null object reference
    at com.example.chatapp.Fragments.TrovamicoActivity$1.lambda$onDataChange$1$com-example-chatapp-Fragments-TrovamicoActivity$1(TrovamicoActivity.java:88)
    at com.example.chatapp.Fragments.TrovamicoActivity$1$$ExternalSyntheticLambda1.onComplete(Unknown Source:2)
    at com.google.android.gms.tasks.zzi.run(com.google.android.gms:play-services-tasks@@18.0.1:1)
    at android.os.Handler.handleCallback(Handler.java:938)
    at android.os.Handler.dispatchMessage(Handler.java:99)
    at android.os.Looper.loop(Looper.java:223)
    at android.app.ActivityThread.main(ActivityThread.java:7656)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:592)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:947)

GoogleMaps活动

 public static final String TAG = "addreess";

//private GoogleMap mMap;
private FragmentsTrovamicoBinding binding;
LatLng latLng;


private DatabaseReference reference;
private FirebaseUser firebaseUser;

List<String> addresses, genders;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    binding = FragmentsTrovamicoBinding.inflate(getLayoutInflater());
    setContentView(binding.getRoot());
    Log.d(TAG, "String addreess: " + addresses);
    addresses = new ArrayList<>();
    genders = new ArrayList<>();

    firebaseUser = FirebaseAuth.getInstance().getCurrentUser();
    reference = FirebaseDatabase.getInstance().getReference("Users").child(firebaseUser.getUid());

  

    ValueEventListener eventListener = new ValueEventListener() {
        @Override
        public void onDataChange(@NonNull DataSnapshot snapshot) {
            for (DataSnapshot dataSnapshot: snapshot.getChildren()) {
                reference.child("address").get().addOnCompleteListener(task -> {
                    if (task.isSuccessful()) {
                        String address = task.getResult().getValue().toString();
                        addresses.add(address);
                    }
                });
                Log.d(TAG, "String addreess: " + addresses);
                reference.child("gender").get().addOnCompleteListener(task -> {
                    if (task.isSuccessful()) {
                        String gender = task.getResult().getValue().toString();
                        genders.add(gender);
                    }
                });
            }
        }

        @Override
        public void onCancelled(@NonNull DatabaseError error) {

        }
    };

    reference.addListenerForSingleValueEvent(eventListener);

    // Obtain the SupportMapFragment and get notified when the map is ready to be used.
    SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager()
            .findFragmentById(R.id.map);
    mapFragment.getMapAsync(this);
}

@Override
public void onMapReady(GoogleMap googleMap) {

    for (int i = 0; i < addresses.size(); i++) {
        String user_address = addresses.get(i);
        if (!user_address.equals("To be added")) {
            Log.d(TAG, "String addreess: " + addresses);
            String user_gender = genders.get(i);
            latLng = getLocationFromAddress(user_address);
            MarkerOptions markerOptions = new MarkerOptions();
            markerOptions.position(latLng);
            markerOptions.title("You");
            Log.d(TAG, "String addreess: " + addresses);
            markerOptions.icon(BitmapFromVector(getApplicationContext(), (user_gender.equals("Male")) ? R.drawable.male : R.drawable.female));
            googleMap.clear();
            googleMap.animateCamera(CameraUpdateFactory.newLatLngZoom(latLng, 5));
            googleMap.addMarker(markerOptions);
        }
    }
}

public LatLng getLocationFromAddress(String strAddress) {

    Geocoder coder = new Geocoder(this);
    List<Address> address;
    LatLng p1;

    try {
        address = coder.getFromLocationName(strAddress, 5);
        if (address == null) {
            return null;
        }
        Address location = address.get(0);
        p1 = new LatLng(location.getLatitude(), location.getLongitude());

        return p1;
    } catch (IOException e) {
        e.printStackTrace();
    }
    return null;
}

private BitmapDescriptor BitmapFromVector(Context context, int vectorResId) {
    // below line is use to generate a drawable.
    Drawable vectorDrawable = ContextCompat.getDrawable(context, vectorResId);

    // below line is use to set bounds to our vector drawable.
    vectorDrawable.setBounds(0, 0, vectorDrawable.getIntrinsicWidth(), vectorDrawable.getIntrinsicHeight());

    // below line is use to create a bitmap for our
    // drawable which we have added.
    Bitmap bitmap = Bitmap.createBitmap(vectorDrawable.getIntrinsicWidth(), vectorDrawable.getIntrinsicHeight(), Bitmap.Config.ARGB_8888);

    // below line is use to add bitmap in our canvas.
    Canvas canvas = new Canvas(bitmap);

    // below line is use to draw our
    // vector drawable in canvas.
    vectorDrawable.draw(canvas);

    // after generating our bitmap we are returning our bitmap.
    return BitmapDescriptorFactory.fromBitmap(bitmap);
}
}

暂时还没有答案

 类似资料:
  • 我是编程新手,我开始使用Ionic框架构建应用程序作为体验。我目前正在学习构建一个基本的社交媒体应用程序,匿名用户可以在该平台上发帖。 我现在处于用户可以评论帖子的阶段。但是,我很难在视图上显示每个帖子的实时评论数。 我计算评论的方法是从Firebase获取帖子数据,计算评论数量,然后显示给视图。 我尝试过使用间隔来每隔x秒获取post数据,以刷新post数据。这有点可行,但问题是离子内容(视图)

  • 问题内容: 作为标题,如何从Firebase获取数据并在android studio中显示?当前,由于我不知道如何使用微调器,因此我将id首先放在XML文件中作为EditText。有人知道如何从Firebase获取数据并修改Java文件吗?例如,我想显示微调器中所有(1111,2222,3333 ....)的所有registerEventName(Google)。我在下面添加了附件。感谢您的推进,

  • 我有一个带有此模式的数据库: 我测试了这段代码,但我无法从数据库中获得任何消息。我会感谢你的帮助。

  • 我试图获得保存在firebase实时数据库中的坐标,并使用google maps API在地图上显示它们。这是我目前掌握的代码。现在,它打开并使用html5 geolocation API向用户显示当前位置,并使用Geofire将lat和long坐标同步到firebase实时数据库。 我不知道如何检索这些点,并在谷歌地图上同时显示不同用户的位置。如果有人能在这方面帮助我,我将非常感激。

  • 问题内容: 我必须使用JavaScript创建一个表单,用户将上载JPG文件并与其他信息(例如名称,电子邮件等)一起提交。当用户单击提交时,表单中的所有信息将被加载到值对象中。对于图像文件,我将其设置为。 所以假设: 我还设置了一个servlet来处理提交,但是我不确定如何开始。上传如何进行?用户提交时,如何获取图像信息?这是屏幕截图:http : //imageshack.us/f/32/776

  • 我试过这个: 首先,我获得了数据库中所有数据的引用,我正在尝试获取它,但我不知道如何实现这一点。 此外,当我这样做时,它会抛出以下错误: java.lang.NullPoInterException:尝试在.laramira.atellez.moroninfo.models.newsviewholder$1$1.ondatachange(newsviewholder.java:48)在com.go