如何在 Firebase 中实时存储位置?

Posted

技术标签:

【中文标题】如何在 Firebase 中实时存储位置?【英文标题】:How to store location in Firebase in real-time? 【发布时间】:2017-06-21 08:10:35 【问题描述】:

我正在使用带有 Firebase 的 android Studio。我已将我的项目链接到数据库并完成了用于登录和注册的用户界面。用户现在可以注册,我可以在 Firebase 中看到。用户登录后,他们可以看到 MapsActivity(谷歌地图,他们可以在其中跟踪自己的位置,但此位置并未存储​​在任何地方,我观看了有关跟踪自己位置的 YouTube 教程)

问题:我真正想要的是,当用户注册时,他们的位置也被发送到数据库中(所以每个用户都有一个名为位置的属性),这样当用户登录时,他/她自己的位置就可以被检索以跟踪位置。

基本上,Firebase 应在用户注册时存储位置,并在用户移动时不断更新。用户登录后,应检索位置(以便用户可以跟踪当前位置)。同样,当用户移动时,应更新 Firebase 中的位置。

我尝试在网上查找,但似乎找不到解决方案。

【问题讨论】:

【参考方案1】:

您可以使用LocationListener。这是一个简单的例子:

 LocationListener locationListener = new android.location.LocationListener() 
        @Override
        public void onLocationChanged(Location location) 
            double latitude = location.getLatitude();
            double longitude = location.getLongitude();
            // Push your location to FireBase
        

        @Override
        public void onStatusChanged(String s, int i, Bundle bundle) 

        

        @Override
        public void onProviderEnabled(String s) 

        

        @Override
        public void onProviderDisabled(String s) 

        
    ;

然后你将 locationListener 传递给 LocationManager

LocationManager locationManager = (LocationManager) getActivity().getSystemService(LOCATION_SERVICE);

locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, locationListener);
    locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 0, locationListener);

这将监听来自 GPRS 和 NetworkProvider 的位置变化

要将更改推送到 Firebase,您可以通过以下方式进行

private FirebaseDatabase database = FirebaseDatabase.getInstance();
private DatabaseReference myRef = database.getReference();

当发布到数据库时,您必须唯一标识一行,就像在普通数据库中一样(即 ID、UUID),因此您必须生成一个并将其存储到您的 SharedPreferences 中。

public void postToDatabase(UserLocation location) 
    DatabaseReference usersRef = myRef.child(someUUID);
    usersRef.setValue(location);

要监听更改,您必须实现 ValueEventListener。一个例子,但必须适应你的需求

ValueEventListener valueEventListener = new ValueEventListener() 
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) 

            for(DataSnapshot snapshot : dataSnapshot.getChildren()) 
                UserLocation location = new UserLocation();
                location.setLongitude((String) snapshot.child("longitude").getValue());
                location.setLatitude((String) snapshot.child("latitute").getValue());
               //Dispatch your changes in application, i.e with and EventBus
            
        

        @Override
        public void onCancelled(DatabaseError databaseError) 

        
    ;

【讨论】:

这就是我目前正在做的事情。而且我可以追踪我自己的位置。但我想将每个用户的位置存储在数据库中并检索... 据我了解,您遇到的问题是将您的位置推送到 Firebase 实时数据库并检查更改?您是否实现了来自 Firebase 的 ValueEventListener 来监听数据库更改? 我的问题是如何将位置存储到数据库中? 已编辑答案,您现在可以查看,但我认为您可以在互联网上找到大量有关此的资源。 非常感谢。我会试试这个并回复你! :)

以上是关于如何在 Firebase 中实时存储位置?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Firebase 中保存用户分数并在 Android Studio 中实时检索

使用 Firebase 存储和检索位置

如何知道在 swift 4 中实时 Firebase 的 childChanged 事件类型中更新了哪个子子项

如何让 Google 将几何位置数据放入 Firebase

如何获取firebase列表对象位置?

Firebase:设置其他用户属性