Google Maps API 仅显示一个用户位置,但 Firebase 上保存了多个用户位置(Kotlin android 应用)

Posted

技术标签:

【中文标题】Google Maps API 仅显示一个用户位置,但 Firebase 上保存了多个用户位置(Kotlin android 应用)【英文标题】:Google Maps API only shows one user location, but multiple user locations are saved on Firebase (Kotlin android app) 【发布时间】:2021-08-05 14:12:08 【问题描述】:

我创建了一个以 Google Maps API 作为主页的应用,用户可以使用 Realtime Firebase 数据库注册帐户。树将所有用户的位置分别存储在每个 UID 下,如下所示:

Firebase-root
  |
  --- users
       |
       --- $uid
            |
            --- profileImageUrl: "https://..."
            |
            --- uid: "h9xZs...bV82"
            |
            --- username: "My name"
            |
            --- location
                  |
                  --- latitude: 53.37...
                  |
                  --- longitude: -0.90...

这是此问题的代码当前的样子:

private fun getLocationUpdates() 
        locationRequest = LocationRequest()
        locationRequest.interval = 30000
        locationRequest.fastestInterval = 20000
        locationRequest.priority = LocationRequest.PRIORITY_HIGH_ACCURACY

        locationCallback = object : LocationCallback() 
            override fun onLocationResult(locationResult: LocationResult) 
                if (locationResult.locations.isNotEmpty()) 
                    val location = locationResult.lastLocation



                    //save each user`s location to firebase database

                    val user = FirebaseAuth.getInstance().getCurrentUser();
                    val databaseRef: DatabaseReference = Firebase.database.reference
                    val locationlogging = LocationLogging(location.latitude, location.longitude)
                    databaseRef.child("users").child(user!!.getUid()).child("userlocation").setValue(locationlogging)

                        .addOnSuccessListener 
                            Toast.makeText(applicationContext, "Locations written into the database", Toast.LENGTH_LONG).show()
                        
                        .addOnFailureListener 
                            Toast.makeText(applicationContext, "Error occured while writing your location to the database", Toast.LENGTH_LONG).show()
                        


                    //show marker on map

                    val latLng = LatLng(location.latitude, location.longitude)
                    val markerOptions = MarkerOptions().position(latLng)
                    map.addMarker(markerOptions)
                    map.animateCamera(CameraUpdateFactory.newLatLngZoom(latLng, 10f))
                
            
        
    

如果我登录,我只能看到一个位置,即我自己的设备位置。但是,如果我同时使用其他设备登录,则标记不会显示。

有人建议我将我的代码放入 for each 循环中,因此它会从 Firebase 读取所有经度和纬度,直到全部显示在地图上。

如何让我的应用显示所有位置,以便每个用户都能看到彼此的位置?

【问题讨论】:

你如何读取其他用户位置? 这就是问题所在。它只读取自己的位置,看不到其他用户的位置。 请编辑您的问题并将您的数据库结构添加为 JSON 文件。您可以通过单击 Firebase Console 的溢出菜单 (⠇) 中的导出 JSON 来获取它,或者至少是屏幕截图。 ibb.co/XV7nrmc 【参考方案1】:

根据您的数据库schema,获取所有用户的位置,请使用以下代码行:

val rootRef = FirebaseDatabase.getInstance().reference
val usersRef = rootRef.child("users")
usersRef.get().addOnCompleteListener  task ->
    if (task.isSuccessful) 
        for (userSnapshot in task.result!!.children) 
            val lat = userSnapshot.child("userlocation/latitude").getValue(Double::class.java)!!
            val lng = userSnapshot.child("userlocation/longitude").getValue(Double::class.java)!!
            Log.d(TAG, "$lat, $lng")
        
     else 
        Log.d(TAG, task.exception!!.message!!) //Don't ignore potential errors!
    

logcat 中的结果将是:

53.82809, -1.6617683
...

现在有了所有用户的坐标,你可以在谷歌地图上添加相应的标记。

【讨论】:

嘿!我可以帮助您了解其他信息吗?如果您认为我的回答对您有所帮助,请考虑通过单击左侧投票箭头下方的复选标记(✔️)来接受它。应将颜色更改为绿色。我真的很感激。谢谢!

以上是关于Google Maps API 仅显示一个用户位置,但 Firebase 上保存了多个用户位置(Kotlin android 应用)的主要内容,如果未能解决你的问题,请参考以下文章

Google Maps JavaScript API 地理位置标记

如何在注册时使用 google maps api 在全球地图中显示自动注册用户的地理位置?

Apple Maps 和 Google Maps API 的可行性

如何使用来自 Firebase Google Maps API Android 的数据更新标记位置

Android Google Maps API OnLocationChanged 仅调用一次

Google maps api v2如何找到最近的位置