检测并区分放在一起的 Android 设备是否可行

15
我正在开发一款需要将设备并列或上下放置的安卓应用程序。
我知道可以使用附近API来检测“附近”的设备,但我需要更精细的东西。
我的应用程序需要能够识别左侧、上方、右侧或下方放置的设备,而所有设备都平放在桌子上(例如)。
我在网络上找不到任何描述这种用例的内容。
这是可能的吗?
更新:
我的用例是:我想让安卓设备能够检测到它们左侧或右侧的任意数量的“其他设备”。这些设备将水平排列,并且彼此之间有一个“小”间隙。
就像您可能会布置儿童字母块以拼出单词或短语,或者数字块以进行求和一样。
不仅应该能够检测设备行中最近的左右邻居,而且两个端点处的设备也应该能够检测到它们是行的起点和终点(从左到右读)。

1
即使有一部手机可以像这样检测位置,我猜并不是所有的手机都能做到这一点。 - Tim Biegeleisen
1
你是否可以通过一些触摸手势来初始化设备?或者它们必须自动知道它们的位置? - Katharina
2
GPS是我能想到的唯一选择。然而,我不确定其准确性,并且它在建筑物内无法使用。您可能可以将其与NFC结合使用。 - Endre Börcsök
2
也许您可以使用一些BT定位信标来确定这2个设备的位置。 - lelloman
1
我没有考虑过GPS。虽然@EndreBörcsök,但我怀疑它的精度不够准确。 - Hector
显示剩余2条评论
6个回答

5

似乎不是这样,因为TYPE_PROXIMITY传感器只能确定设备面对物体的距离,而无法识别设备是否位于左侧、上方、右侧或下方。TYPE_MAGNETIC_FIELD也无法提供有关最近物体位置的任何信息。即使在第二个设备上放置了磁性标签,也只能确定与其的距离,而无法确定方向。 - Andrii Omelchenko

4
  1. 制作自己的模拟GPS(具体来说是本地PS)。我没有相关链接,但这是完全可能的。了解GPS如何工作以获取想法。WiFi和蓝牙都是信号。但是你知道还有什么是信号吗?

A: 声音

让每部手机依次发出大哔声,并使用接收器测量音频强度。这可能比WiFi /蓝牙更有效。一旦您测量出每对手机之间的相对距离,只需要一个好算法就可以找到相对位置。

  1. 可能的替代方案: 使用图像处理。获取类似OpenCV for Android 这样的东西,并将一个手机设置为主机。这仅适用于二维布局。

  2. 另一个“想法”-使用相机。在表面上贴一个带有4个QR代码的板子。(这将有助于识别手机的边缘和方向)。如果您正在寻找三维布局,并且手机之间有足够的空间,则可以在每部手机后面贴上QR并在每部手机屏幕上显示QR。

所有这些都是解决方案。也许您可以使用各自的解决方案,也许您可以组合使用。谁知道呢。


2

一个想法,如果它与您的用例相关:

  • 设置阶段
    • 在每个设备上启动您的应用程序进入“配对模式”。
    • 每个设备都将显示包含与设备通信所需密钥(例如通过Firebase)和屏幕详细信息(以像素为单位)的QR码。它还会在屏幕边界处绘制一个矩形。
    • 另一部手机,不属于此布局的外部,将作为“主控”运行您的应用程序,并从上方拍摄手机的照片。
    • 现在,您需要编写一个算法来识别屏幕及其位置、方向并提取QR码进行分析。虽然不容易,但可行。
  • 交互阶段
    • 现在所有手机(这应该适用于超过两个手机)可以合作显示同一电影的不同部分。

1
通过了解您的使用情况,可以使用附近的API和其他技术找到被主机设备包围的设备数量。但是找出每一侧有多少设备!我认为使用当前的手机硬件和技术是不可能的。因为考虑到所有因素,磁传感器只是最不可能的解决方案。但是当前的手机没有这样的功能。
基于上述答案,我提出以下观点。 TYPE_ACCELEROMETER、TYPE_LINEAR_ACCELERATION、TYPE_MAGNETIC_FIELD、TYPE_ORIENTATION这些传感器会对设备周围的磁场(指南针对磁铁)产生反应。您可以尝试使用TYPE_MAGNETIC_FIELD的应用程序,在靠近其他设备时测试其反应(我认为它会产生反应)。
但我在这里想要说明的是,如果您将三个设备放在一侧,将四个设备放在另一侧,MAGNETIC_FIELD传感器会读取相对磁场。因此,我们无法确定每一侧有多少设备,除非您进行了一些科学计算。
第二点是,有人建议使用“TYPE_PROXIMITY”传感器,但它并不适用于此目的。当前的手机可以测量物体相对于设备屏幕的距离(以厘米为单位)。这种传感器通常用于确定手持式设备是否贴近人的耳朵。
另一个可能性最小的方法是使用位置传感器,它可以识别相对于您的设备坐标的坐标,您可以使用NFC在每个设备坐标之间与主机进行通信。但问题是,您的用例说这些设备非常接近彼此,因此无法使用位置服务测量距离。
总之,使用当前的移动硬件无法识别主机设备两侧的每个设备数量。可以通过使用外部传感器来扩展移动设备的功能来实现这一点。例如,装备有这种功能的手机壳,这将为其他用例和应用程序打开窗口。

1
似乎不行,如果您只有2个设备,但如果您有外部来源(位置已知)的任何信号(音频、震动、蓝牙或WiFi无线电等),可以由具有足够准确度的设备检测到,并且设备时间已同步,则可以通过比较两个设备上的信号开始时间(或信号强度)来实现,就像这张图片一样:

Example

或者,如果您可以向其中一个设备添加一些传感器,您可以创建“其他设备定位器”,例如像this声音定位器。

更新

在更新的表述中,该问题也无法解决:可以确定哪两个设备处于边缘位置,但无法确定哪个设备在左侧,哪个设备在右侧。必须至少有一个设备知道它是最左侧的设备 - 然后其他设备会生成声音,其他设备接收到并根据到达时间差确定其顺序。但需要锚点和时间同步。


@Hector 基于这个想法(检测“已知”信号的时间),你_可以尝试让排在第一位的机器发出某种“嘟嘟”声,然后让其他设备监听它...这_可能足以确定它们的相对顺序。声音传播时间(我想象中)肯定比蓝牙/wifi要短得多,因此您更有可能能够解决差异。这并不会告诉_他们是否排成了一行,但如果他们排成了一行,就可以给出顺序。 - TripeHound
@TripeHound “这可能足以确定它们的相对顺序” - 仅通过距离,而不是方向(位置),例如:两个设备,在同一距离的左侧和右侧将同时接收到信号。 - Andrii Omelchenko
这就是为什么我建议将 终端 设备制成发出声音的状态...所有其他设备(如果在一条直线上)会在 稍微 不同的时间内听到它。正如我所说,如果设备不在一条直线上,它可能会被欺骗。这可能是 OP 能做的最好的办法。(如果原始想法能够实现,更复杂的选项是让所有设备以稍微不同的频率发出蜂鸣声,然后可能可以通过彼此之间的“三角定位”来获得一些相对定位的想法)。 - TripeHound
@TripeHound 我同意在这种情况下我们可以确定“终端设备”,但不能确定“左端设备”或“右端设备”。 - Andrii Omelchenko

-1

我认为有一种方法,但可能需要一些工作。首先通过获取设备方向并使用加速度计或旋转向量检查俯仰、翻滚等方式来检查2个设备是否平放。

确定它们正在平放后,使用蓝牙或Wi-Fi从一个设备向另一个设备发送数据。数据应包括发送时间。在另一个设备上检查检索时间,还应检查发送和检索数据的延迟。如果您可以在设备之间的小距离差异中具有明显的毫秒级时间差异,则很容易检查它们的大致接近程度。还可以要求用户将其设备相互保持1米或固定距离,以获取您发送到其他设备的蓝牙或Wi-Fi信号的传输时间。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接