检测设备在Pocket中的存在

时间:2018-01-30 10:34:10

标签: java android android-sensors proximitysensor google-awareness

我的应用程序需要知道手机是放在口袋里还是放在手中,根据个人设置的特定参数而不是继续执行下一个任务。

我已经阅读了各种博客以及SensorManager android developer ,但没有人帮助过我。我在堆栈上找到的唯一相关链接是this没有解决方案,虽然对该问题的一个评论建议使用 Awareness API 。我正在经历它,我的理解是用户活动是找到这个的上下文 - 我可能是错的。可能有人在此工作或正在做R& D,请分享您的观察,这可能会帮助我以某种方式进一步发展。

有没有办法找到口袋里的手机?如果是的话,有人可以告诉我一个人怎么做?

任何有关概念的指导/链接都是有帮助的。

感谢。

3 个答案:

答案 0 :(得分:1)

我们可以接近解决方案的唯一方法是使用.Google Awareness API不会解决问题,因为它具有完全不同的用途。

  • 光传感器(环境传感器)
  • 接近传感器(位置传感器)

Android平台提供四个传感器,可让您监控各种环境属性。您可以使用这些传感器进行监控

  • 相对环境湿度
  • 发光
  • 环境压力
  • 环境温度

所有四个环境传感器都是基于硬件的,仅在设备制造商将其构建到设备中时才可用。除了大多数设备制造商用来控制屏幕亮度的光传感器外,环境传感器并非始终可在设备上使用。因此,在尝试从中获取数据之前,在运行时验证环境传感器是否存在尤为重要。

光传感器可用于计算光强度。例如,许多具有自动亮度模式功能的手机,此功能在光传感器上工作,可根据光强度调节屏幕亮度。 有许多单位,如勒克斯,坎德拉,流明等,来测量光强度。

考虑到这一点,当您在口袋或口袋里打电话时,光线强度会有很大差异。

虽然在您操作手机的情况下也会发生同样的情况。或者在光强度很低的地方。因此,区分这种情况是真正的挑战。你可以使用其他环境传感器结合光传感器来达到有效的结果。但我认为一个准确的解决方案是冒险的。

要了解有关这些传感器的更多信息,请参阅以下链接

https://developer.android.com/guide/topics/sensors/sensors_environment.html https://developer.android.com/guide/topics/sensors/sensors_position.html

Google认知API无法适用于此案例。提供完全不同的解决方案。 它提供了两个API

  • Fence API
  • 快照API

您可以使用Snapshot API获取有关用户当前环境的信息。使用Snapshot API,您可以访问各种上下文信号:

  • 检测到用户活动,例如步行或驾车。
  • 您已注册的附近信标。
  • 耳机状态(插入与否)
  • 位置,包括纬度和经度。
  • 用户当前所在的位置。
  • 用户当前位置的天气状况。

使用Fence API,您可以根据上下文信号定义围栏,例如:

  • 用户的当前位置(lat / lng)
  • 用户当前的活动(步行,驾车等)。
  • 设备特定条件,例如耳机是否为 插上电源。
  • 靠近附近的信标。

答案 1 :(得分:0)

我在项目中实现了这一点。我从光传感器,加速度计和接近传感器获得了读数。我在自述文件中描述了该算法。请记住,它可以大致检测出口袋中的设备状态。 https://github.com/IvanLudvig/SwordSoundApp

答案 2 :(得分:0)

对于跨平台解决方案,您现在可以使用NumberEight SDK来完成此任务。

它在iOS和Android上执行各种上下文识别任务,包括:

  • 实时体育锻炼检测
  • 设备位置检测(即口袋中是否存在)
  • 运动检测
  • 可达性
  • 当地天气

它还可以记录用户上下文,以便通过在线门户进行报告和分析。

如何检测手机是否放在口袋里:

例如,要记录Kotlin中的用户活动,您可以这样做:

val ne = NumberEight()

ne.onDevicePositionUpdated { glimpse ->
    if (glimpse.mostProbable.state == State.InPocket) {
        Log.d("MyApp", "Phone is in a pocket!")
    }
}

或使用Java:

NumberEight ne = new NumberEight();

ne.onDevicePositionUpdated(
    new NumberEight.SubscriptionCallback<NEDevicePosition>() {
        @Override
        public void onUpdated(@NonNull Glimpse<NEDevicePosition> glimpse) {
            if (glimpse.mostProbable.state == State.InPocket) {
                Log.d("MyApp", "Phone is in a pocket!");
            }
        }
    });

这里有一些iOSAndroid示例项目。

披露:我是开发人员之一。