检测其他用户位置

Posted

技术标签:

【中文标题】检测其他用户位置【英文标题】:Detect Other User Location 【发布时间】:2016-10-31 23:21:18 【问题描述】:

我想构建一个实时的安卓应用(比如司机去接客时的优步应用)。

[捕获优步应用 - 挑选客户]

我不知道构建它的正确方法,但我尝试用这个技巧构建它。

[存储并选择用户位置]

这个技巧成功了。 但是……问题是……

    有了这个技巧,就没有预计到达时间的信息了。 如果我想强制估计到达时间信息,我必须将 Direction Request API 发送到 google Maps,这会使我的限制请求 API 更快地耗尽。

感谢任何帮助、链接或示例。

谢谢。

毛拉纳

【问题讨论】:

【参考方案1】:

为此,我的建议是引入服务器。如果管理员需要任何特定用户的位置(使用 id 来识别),那么管理员应用程序将通知服务器(通过 api 调用)。然后服务器将推送特定设备(托管 id)以定期更新有关设备位置的信息。现在用户应用程序将收到通知(推送是这里最好的方式)并开始更新服务器关于当前坐标(再次通过 api 调用),每当服务器收到更新的位置时,它会通知管理员(通过推送/长拉/tcp 套接字)。

或者

您可以使用设备到设备通信,因为该管理员必须拥有 userId 与 gcm push id 的所有映射。现在,如果管理员想要跟踪任何用户,那么它将向特定设备推送通知(通过推送)。每当任何用户设备收到此类通知时,它将开始定期推回当前坐标。

如果您需要距离和时间映射,最好先通过 Google Api 找到它。假设 google apis 响应说距离为 2 公里(apiDistance),从 carLat、carLang 移动到您当前的位置(比如说 userLat、userLang)需要 8 分钟(apiTime)。现在对于每个位置更新,使用简单的距离映射算法来查找剩余距离:

    private double distance(double carLat, double carLang, double userLat, double userLang) 
      double theta = carLang - userLang;
      double dist = Math.sin(deg2rad(carLat)) * Math.sin(deg2rad(userLat)) + Math.cos(deg2rad(carLat)) * Math.cos(deg2rad(userLat)) * Math.cos(deg2rad(theta));
      dist = Math.acos(dist);
      dist = rad2deg(dist);
      dist = dist * 60 * 1.1515;
       return (dist);
    

   private double deg2rad(double deg) 
      return (deg * Math.PI / 180.0);
    
   private double rad2deg(double rad) 
      return (rad * 180.0 / Math.PI);
    

现在您有了 apiDistance 和 apiTime(通过最后一次 google Api 调用)和 updatedDistance,因此您可以轻松找到 updatedTime(这将是近似值)。为了更正,您可以在标准时间(可能是 1 分钟)后进行 google api 调用,这将提高准确性。

希望对您有所帮助,如果您需要进一步的帮助,请告诉我:)

【讨论】:

嗨 Neo,正如您在我的图表中看到的那样,定期更新坐标(最新的其他用户位置)不再有问题。问题是如何在没有请求 API 到 googlemapAPI 的情况下获得估计的到达时间,因为它会使我的请求 API 限制更快地耗尽。时长 更新了我的答案,请检查:)【参考方案2】:

使用 gcm(推送通知)

步骤:

    创建一个 Web 服务,您可以在其中获取 latlng 和用户 ID 并保存到数据库中。然后使用 Gcm 脚本将此数据推送到目标设备。 集成目标设备以接受推送通知。 使用 android 后台服务在后台定期从用户的 android 设备调用此 Web 服务。

工作原理:

以masterslave为例,slave周期性的调用web service,请求参数为lat,lng,userid,mastergcmid。这个webservice调用的时候,server把这个lat lng推送到mastergcmid。是不是很简单?

您可以选择将接收到的 lat、lng 和 userid 保存到数据库中以进行跟踪记录。

提示:

使用后台服务时请注意,请在通知栏中设置适当的停止条件。持续调用 Web 服务会消耗 Internet 数据和 CPU 使用。但据我所知,我们没有其他击球手选择 告诉我你是否在实施时遇到困难。

使用套接字

这是一种很好的设备之间直接通信的方法,这里不需要使用任何类型的网络服务。

工作原理:

这里一个设备作为服务器,另一个作为客户端,在你的情况下,客户端应该是发送位置的用户,服务器应该是接收位置的用户。因此,如果连接成功,客户端会通过 IP 地址和端口号连接到服务器,然后客户端可以在您的情况下发送消息 lat,lng,userid。

提示:

我已经在套接字消息传递上构建了演示,但它可以在相同的网络上运行。我没有在不同的网络上检查过这个。

【讨论】:

我会试试的。感谢 Smit 提供的线索。 :) @Maulana 好的,如果你觉得它有用,请点赞,当它有效时,请接受它。这只是我们的动力 没有完全回答我的问题,但非常感谢您为我提供有关 gcm 和 lmp 的线索。我的新作业。 :) 非常感谢 Smit。【参考方案3】:

对于此类应用程序,您必须实现一个管理所有任务的网络服务器。

现在解决您的问题。您应该知道您正在谈论的优步应用程序有预计到达时间,但这在很多情况下都不起作用。你应该看看这个article。他们都根据自己的算法和每天收集的数据来估计持续时间。所以现在你有两种方法可以实现这一点-

    你去google direction api,得到最准确的到达客户端的时间,这也考虑了当前的交通状况和天气状况。

    这是一个有限的配额请求,因此它不会支持您拥有庞大的客户群并且您不会从谷歌购买额外的配额。

    第二种方法是使用您自己的算法。您从您正在处理的城市或地区收集数据。 一天中不同时间城市不同地区的交通状况。然后以正常允许速度将它们应用于道路上的车辆。这将为您提供预计到达时间。

    此计算将在服务器端完成,并且对请求没有限制。您收集的数据越多,您的预计到达时间就越长。

【讨论】:

很有启发性的解释。谢谢萨加尔。 :) 如果您喜欢,请考虑投票。 还没有投票权。声望低于 15。:(

以上是关于检测其他用户位置的主要内容,如果未能解决你的问题,请参考以下文章

如何在不使用谷歌地图和其他地图的情况下获取用户当前位置?

检测一个区域内两部手机的移动?

检测移动应用用户是不是在代理后面

如何检测两个 CALayer 是不是重叠?

Android - 检测我的应用的其他用户是否在附近

Delphi如何检测表单上任何地方的点击事件,包括其他组件