从 Firebase 检索位置数据未进入 MapActivity

Posted

技术标签:

【中文标题】从 Firebase 检索位置数据未进入 MapActivity【英文标题】:Retrieve location data from Firebase not getting on MapActivity 【发布时间】:2020-11-16 14:18:27 【问题描述】:

所以,我想从我的数据库参考路径“驱动程序位置”中获取latitudelongitude。但是,它什么也没发生,只是显示正常的谷歌地图而不触发位置。请帮忙!

public class StudentMapActivity extends FragmentActivity implements OnMapReadyCallback 

    private GoogleMap mMap;
    private DatabaseReference databaseReference;


    @Override
    protected void onCreate(Bundle savedInstanceState) 
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_student_map);
        FirebaseDatabase database = FirebaseDatabase.getInstance();
        databaseReference = database.getReference("Driver Location");

        // 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(final GoogleMap googleMap) 
        mMap = googleMap;
        databaseReference.addListenerForSingleValueEvent(new ValueEventListener() 
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) 

                for (DataSnapshot child : dataSnapshot.getChildren()) 
                    String lat = child.child("latitude").getValue().toString();
                    String lng = child.child("longitude").getValue().toString();

                    double latitude = Double.parseDouble(lat);
                    double longitude = Double.parseDouble(lng);
                    LatLng latLng = new LatLng(latitude, longitude);
                    MarkerOptions markerOptions = new MarkerOptions()
                            .position(latLng)
                            .title("Bus is here");
                    mMap.addMarker(markerOptions);
                    mMap.moveCamera(CameraUpdateFactory.newLatLngZoom(latLng, 16));
                
            

            @Override
            public void onCancelled(@NonNull DatabaseError databaseError) 

            
        );


    


Logcat:

2020-07-24 00:41:18.926 22586-22586/com.example.upmbus D/InputTransport: Input channel destroyed: '1df605 ', fd=100
2020-07-24 00:41:18.939 22586-23234/com.example.upmbus W/.example.upmbu: Accessing hidden method Lsun/misc/Unsafe;->getLong(Ljava/lang/Object;J)J (greylist,core-platform-api, linking, allowed)
2020-07-24 00:41:18.940 22586-23234/com.example.upmbus W/.example.upmbu: Accessing hidden method Lsun/misc/Unsafe;->putLong(Ljava/lang/Object;JJ)V (greylist, linking, allowed)
2020-07-24 00:41:18.942 22586-23234/com.example.upmbus W/.example.upmbu: Accessing hidden method Lsun/misc/Unsafe;->getObject(Ljava/lang/Object;J)Ljava/lang/Object; (greylist, linking, allowed)
2020-07-24 00:41:18.942 22586-23234/com.example.upmbus W/.example.upmbu: Accessing hidden method Lsun/misc/Unsafe;->getInt(Ljava/lang/Object;J)I (greylist, linking, allowed)

附加的数据库详细信息

【问题讨论】:

@AlexMamo 你能帮帮我吗? 嗨,诺贝尔,但问题是什么?这段代码中究竟有什么不符合您的预期? 地图打开但没有得到位置值也没有放置任何标记,只是一张普通地图@AlexMamo 我已成功存储经纬度,但使用提供的代码avobe无法检索。 请将您的数据库结构添加为 JSON 文件或至少是屏幕截图。 【参考方案1】:

没有必要循环遍历DataSnapshot 对象,因为那里只有两个属性,并且都可以像下面的代码行一样直接访问:

DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
DatabaseReference driverLocationRef = rootRef.child("Driver Location");
ValueEventListener valueEventListener = new ValueEventListener() 
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) 
        double latitude = dataSnapshot.child("latitude").getValue(Double.class);
        double longitude = dataSnapshot.child("longitude").getValue(Double.class);
        Log.d("TAG", latitude + ", " + longitude);
    

    @Override
    public void onCancelled(@NonNull DatabaseError databaseError) 
        Log.d("TAG", databaseError.getMessage()); //Don't ignore errors!
    
;
driverLocationRef.addListenerForSingleValueEvent(valueEventListener);

logcat 中的结果将是:

3.0227801, 101.71208

除此之外,使用:

String lng = child.child("longitude").getValue().toString();

没有任何意义,因为这两个属性都持有一个双精度值,而不是一个字符串。

【讨论】:

com.example.upmbus D/androidRuntime:关闭 VM com.example.upmbus E/AndroidRuntime:致命异常:主进程:com.example.upmbus,PID:31676 java.lang.NullPointerException:尝试在空对象引用上调用虚拟方法“double java.lang.Double.doubleValue()” com.example.upmbus.StudentMapActivity$1.onDataChange(StudentMapActivity.java:79) 在 com.google.firebase.database.Query$1.onDataChange(Query.java:179) 在 com.google。 firebase.database.core.ValueEventRegistration.fireEvent(ValueEventRegistration.java:75) 在 com.google.firebase.database.core.view.DataEvent.fire(DataEvent.java:63) 在 com.google.firebase.database.core.view.EventRaiser$1.run(EventRaiser.java:55) 在 android.os.Handler.handleCallback(Handler.java:883) 在 android。 os.Handler.dispatchMessage(Handler.java:100) 在 android.os.Looper.loop(Looper.java:237) 在 android.app.ActivityThread.main(ActivityThread.java:7948) 在 java.lang.reflect.Method .invoke(Native Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1075) 请编辑您的问题并添加您正在使用的确切代码。 嗨,诺贝尔!你解决了问题吗?如果您认为我的回答对您有所帮助,请考虑通过单击左侧投票箭头下方的复选标记(✔️)来接受它。应将颜色更改为绿色。我真的很感激。谢谢!

以上是关于从 Firebase 检索位置数据未进入 MapActivity的主要内容,如果未能解决你的问题,请参考以下文章

Firebase GeoFire,从我当前位置检索具有特定半径的帖子

从Firebase数据库检索数据时,浏览器显示未定义

使用 Android Studio 从 Firebase 中的某个位置检索数据

从 Firebase 为每个特定帖子检索特定数据的比 datasnapshot 更好的方法?返回的位置错误

未检索到特定集合 Firebase 的数据

从 Firebase 检索位置并将标记放在谷歌地图上