【问题标题】:Retrieve location from Firebase with a UID and put in Google Maps使用 UID 从 Firebase 检索位置并放入 Google 地图
【发布时间】:2018-04-05 05:05:12
【问题描述】:

我正在尝试保存和检索来自 Firebase 的位置并将其放入 Google 地图。纬度和经度值在用户 ID 下,因为它将用于特定用户的位置。保存位置成功,但我无法检索它。我正在尝试检索它,但我不断收到

java.lang.NullPointerException:尝试调用虚拟方法 空对象引用上的'double java.lang.Double.doubleValue()' 错误。

有什么办法可以解决或做到这一点?提前谢谢你。

这是保存位置的代码:

    profDatabase = FirebaseDatabase.getInstance().getReference().child("Profile");

       if (auth.getCurrentUser() != null){

                    String userid = auth.getCurrentUser().getUid();
                    final DatabaseReference locDatabase = FirebaseDatabase.getInstance()
                            .getReferenceFromUrl("https://sholoco-9cf1e.firebaseio.com/Profile/" + userid);

                    profDatabase.child(userid).addValueEventListener(new ValueEventListener() {
                        @Override
                        public void onDataChange(DataSnapshot dataSnapshot) {
                            String stallname = dataSnapshot.child("StallName").getValue().toString();

                            Marker marker = mMap.addMarker(new
                                    MarkerOptions().position(point).title(stallname));
                            final LatLng latlng = marker.getPosition();

                            mSaveButton.setOnClickListener(new View.OnClickListener() {
                                @Override
                                public void onClick(View v) {
                                    //DatabaseReference newPost = profDatabase.push();
                                    //newPost.setValue(latlng);

                                    String latkey = "latitude";
                                    double latvalue = latlng.latitude;
                                    DatabaseReference child = locDatabase.child(latkey);
                                    child.setValue(latvalue);

                                    String longkey = "longitude";
                                    double longvalue = latlng.longitude;
                                    child = locDatabase.child(longkey);
                                    child.setValue(longvalue);
                                }
                            });
                        }

                        @Override
                        public void onCancelled(DatabaseError databaseError) {

                        }
                    });

这是我检索位置的代码:

profDatabase = FirebaseDatabase.getInstance().getReference().child("Profile");
        if (auth.getCurrentUser() != null) {

            String userid = auth.getCurrentUser().getUid();
            profDatabase.child(userid).addChildEventListener(new ChildEventListener() {
                @Override
                public void onChildAdded(DataSnapshot dataSnapshot, String s) {
                    double latt = (double) dataSnapshot.child("latitude").getValue();
                    double longg = (double) dataSnapshot.child("longitude").getValue();
                    String stallname = dataSnapshot.child("StallName").getValue().toString();

                    LatLng newLocation = new LatLng(latt, longg);

                    mMap.addMarker(new MarkerOptions()
                            .position(newLocation)
                            .title(stallname));
                }

                @Override
                public void onChildChanged(DataSnapshot dataSnapshot, String s) {

                }

                @Override
                public void onChildRemoved(DataSnapshot dataSnapshot) {

                }

                @Override
                public void onChildMoved(DataSnapshot dataSnapshot, String s) {

                }

                @Override
                public void onCancelled(DatabaseError databaseError) {

                }
            });
        }

我的数据库截图:

【问题讨论】:

    标签: android google-maps firebase firebase-realtime-database google-api


    【解决方案1】:

    您是否尝试过使用addListenerForSingleValueEvent() 而不是addChildEventListener()

    要获取没有userid 的值: 参考https://stackoverflow.com/a/46651960/4653447

     FirebaseDatabase.getInstance().getReference().child("Profile").addValueEventListener(new ValueEventListener() {
        public void onDataChange(DataSnapshot dataSnapshot) {
             for (DataSnapshot snapshot: dataSnapshot.getChildren()) {
                double latt = (double) snapshot.child("latitude").getValue();
                double longg = (double) snapshot.child("longitude").getValue();
               //store this data in list
             }
        }
    

    【讨论】:

    • 顺便说一句,将数据存储在列表中是什么意思? (对不起,我问了很多)
    • 我删除了其他没有位置的用户,并留下了有位置的用户并且它有效。但是当我创建并尝试保存位置时出现错误。
    • 当我尝试保存另一个用户的位置时,应用程序崩溃并出现此错误:java.lang.NullPointerException: Attempt to invoke virtual method 'double java.lang.Double.此行上的空对象引用上的 doubleValue()'(带有用户 ID):double latt = (double) dataSnapshot.child("latitude").getValue();
    【解决方案2】:

    您无需将经纬度类型转换为double,而是将Double.class 作为参数传递给getValue()

                @Override
                public void onChildAdded(DataSnapshot dataSnapshot, String s) {
                    double latt = dataSnapshot.child("latitude").getValue(Double.class);
                    double longg = dataSnapshot.child("longitude").getValue(Double.class);
                    String stallname = dataSnapshot.child("StallName").getValue().toString();
    
                    LatLng newLocation = new LatLng(latt, longg);
    
                    mMap.addMarker(new MarkerOptions()
                            .position(newLocation)
                            .title(stallname));
                }
    

    参考this answer

    【讨论】:

    • 这实际上是我的第一个代码,但它仍然没有工作
    【解决方案3】:

    此代码有效

        @Override
    public void onMapReady(GoogleMap googleMap) {
        mMap = googleMap;
        DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
        DatabaseReference locationsRef = rootRef.child("childName");
        final GeoFire geoFire = new GeoFire(locationsRef);
            geoFire.getLocation("dataKey", new LocationCallback() {
                @Override
                public void onLocationResult(String key, GeoLocation location) {
                    double lat =location.latitude;
                    double lng =location.longitude;
                    LatLng sydney = new LatLng(lng, lat);
                    mMap.addMarker(new MarkerOptions().icon(BitmapDescriptorFactory.defaultMarker(HUE_BLUE)).position(sydney).title("car"));
                    Toast.makeText(getApplicationContext(),""+sydney,Toast.LENGTH_SHORT).show();
                    mMap.moveCamera(CameraUpdateFactory.newLatLng(sydney));
                    mMap.animateCamera(CameraUpdateFactory.zoomTo(9));
                }
    
                @Override
                public void onCancelled(DatabaseError databaseError) {
    
                }
            });
        
    
        if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
            return;
        }
        mMap = googleMap;
        mMap.setMyLocationEnabled(true);
        buildGoogleApiClient();
    
    }
    

    【讨论】:

      猜你喜欢
      • 2020-07-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-14
      相关资源
      最近更新 更多