检测其他用户位置

Detect Other User Location

我想构建一个 android 应用程序来实时检测其他用户的位置(就像 driver 去接客户时的 Uber 应用程序)。

[Uber 应用程序的捕获 - 选择客户]

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

[存储和 Select 用户位置]

这一招成功了。 但是……问题是……

  1. 有了这个技巧,就没有估计到达时间的信息了。
  2. 如果我想强制估计到达时间信息,我必须将方向请求 API 发送到 google 地图,它会使我的限制请求 API 运行出得更快。

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

谢谢。

毛拉那

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

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

如果您需要距离和时间映射,最好先通过Google Api 找到它。假设 google 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 分钟)后进行 google api 调用,这将提高准确性。

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

Using gcm(Push notification)

步骤:

  1. 制作一个网络服务,您可以在其中获取 latlng 和用户 ID 并保存到 database.And 使用 Gcm 脚本将此数据推送到目标设备。
  2. 集成目标设备以接受推送通知。
  3. 使用 android 后台服务定期从用户的 android 设备调用此网络服务。

工作原理:

以master slave为例,slave周期性调用请求参数为lat,lng,userid的web service,mastergcmid.When这个webservice调用,server push this lat lng to the mastergcmid.simple is'是吗?

可选地,您可以将收到的经纬度和用户 ID 保存到数据库中以供跟踪记录。

小鬼注:

注意在使用后台服务时,在通知栏中放置适当的停止条件。持续调用 Web 服务会消耗互联网数据和 cpu 使用。但据我所知,我们没有其他击球手选择 如果您发现实施起来有困难,请告诉我。

Using socket

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

工作原理:

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

小鬼注:

我已经在套接字消息传递上构建了演示,但它在相同的平台上工作networks.I还没有在不同的网络上检查过。

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

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

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

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

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

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