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

Android - Detect if other users of my app are nearby

我正在开发一个 Android 应用程序,它需要检测该应用程序的其他用户是否彼此靠近(比如在同一个房间或蓝牙范围内)。应用程序需要能够在没有任何用户交互的情况下检测到此

我的想法是通过定期蓝牙扫描并根据包含所有安装了应用程序的设备的 MAC 地址列表检查结果来检测用户是否在彼此的近距离内。 所有设备的 MAC 地址都发送到服务器,然后设备从服务器获取此 mac 地址列表,与 BT 扫描的结果进行比较。

问题是,BT 和 Google 似乎使用广告/发现模式,其中一台设备充当服务器,一台设备充当客户端。为了使其正常工作,我觉得设备需要始终可被发现。

基于 Google 的 Nearby 或 BT 的实施能否满足我的需求?

是否可以在不被发现的情况下检测附近设备的存在?

由于电池寿命是一个问题(需要能够每天至少 8 小时这样做)BLE 是一种选择吗?

如果 phone 没有真正用于其他用途,您几乎可以肯定每天处理 8 个小时。然而,有很多变数。

许多较旧的 phones 需要使用无限扫描器重新启动的不同类型的扫描,以便正确报告 "seeing" 外围设备。这会大大缩短电池寿命。

如果 phone 是 运行 Marshmallow 或更高版本,它们有打瞌睡模式会中断扫描。这可以使用 AlarmManager、JobService/Dispatcher 或 WorkManager 来规避。这会大大缩短电池寿命。

如果 phone 是 运行 Oreo 或更高版本,它们需要前台服务(持续通知)以防止应用程序被 OS 自动杀死节省电池。该应用程序还应该从电池优化中列入白名单,因为即使使用前台服务,该应用程序仍会被 OS.

杀死。

最后,使用位置服务扫描广播在电池方面相当昂贵。如果您尝试对 phones 进行聚类并根据附近的其他 phones 猜测它们的位置,在某种程度上您仍然需要 phones 的位置数据弄清楚他们在哪里。

你最好只是扫描一下。您可以用信标覆盖您的公司 属性,其中记录了每个信标的位置。当 phone "enters a region"(进入信标范围内)时,它应该向您的 api 发送一些信息,报告它刚刚找到的信标。这将告诉您 room/area 它在什么地方。

另一种不那么花哨(而且可能不太准确)的跟踪一切的方法是通过它们所连接的无线接入点的 IP 地址。使用 WorkManager 定期更新 api,其中包含 phone 的一些唯一 ID 和 AP 的 IP 地址。您的 IT 部门应该知道它们每个的位​​置。通过这种方式,您可以获得相当不错的跟踪效果,并且几乎不会耗尽电池电量。