检测其他用户位置

时间:2016-06-29 10:04:17

标签: android google-maps android-location

我想构建一个能够实时检测其他用户位置的Android应用程序(例如当驱动程序转到提货客户时的Uber应用程序)。

[Uber App的捕获 - 挑选客户]

enter image description here

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

[存储并选择用户位置]

enter image description here

这招很成功。 但是......问题是......

  1. 有了这个技巧,没有预计到达时间的信息。
  2. 如果我想强制估计时间到达信息,我必须向Google地图发送方向请求API,这将使我的限制请求API快速耗尽。
  3. 大感谢任何帮助,链接或示例。

    谢谢。

    毛拉

3 个答案:

答案 0 :(得分:1)

为此,我的建议是引入服务器。如果admin需要任何特定用户的位置(使用id来识别),则admin app将通知服务器(通过api调用)。然后,服务器将推送特定设备(主机ID)以定期更新设备位置。现在用户应用程序将获得通知(推送是这里的最佳方式)并开始更新服务器有关当前坐标(再次通过api调用),每当服务器将收到更新的位置时,它将通知管理员(通过推送/ long pull / tcp socket)。

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

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

    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分钟)之后进行谷歌API呼叫,这将提高准确性。

希望它会对你有所帮助,如果你需要进一步的帮助,请告诉我们。)

答案 1 :(得分:0)

  

使用gcm(推送通知)

步骤:

  1. 创建一个web服务,您可以在其中获取latlng和userid并保存到数据库中。并使用Gcm脚本将此数据推送到目标设备。
  2. 整合目标设备以接受推送通知。
  3. 使用android后台服务在后台定期从用户的android设备调用此Web服务。
  4. 工作原理:

    举一个示例主从,slave定期调用带有请求参数的web服务,如lat,lng,userid,mastergcmid。当这个webservice调用时,服务器将这个lat lng推送到mastergcmid.simple不是吗? / p>

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

    注意事项:

    使用后台服务时请注意,请在通知栏中输入相应的停止条件。连续调用Web服务会使Internet数据和cpu使用成本增加。但据我所知,我们没有其他的击球选择 如果您发现实施此问题,请告诉我。

      

    使用套接字

    这是在设备之间直接通信的非常好的方法,这里不需要使用任何类型的Web服务。

    工作原理:

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

    注意事项:

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

答案 2 :(得分:0)

对于这种应用程序,您必须实现管理所有任务的Web服务器。

现在为您解决问题。你应该知道你正在谈论的超级应用程序有一个估计的到达时间,但这在许多情况下永远不会起作用。你应该看看这个article。他们都估算了自己算法的持续时间和日常收集的数据。所以现在你有两种方法可以实现这一目标 -

  1. 你去google方向api并获得最准确的到达时间到客户端,这也考虑到当前的交通状况和天气状况。

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

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

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