我的应用程序需要知道手机是放在口袋里还是放在手中,根据个人设置的特定参数而不是继续执行下一个任务。
我已经阅读了各种博客以及SensorManager android developer ,但没有人帮助过我。我在堆栈上找到的唯一相关链接是this没有解决方案,虽然对该问题的一个评论建议使用 Awareness API 。我正在经历它,我的理解是用户活动是找到这个的上下文 - 我可能是错的。可能有人在此工作或正在做R& D,请分享您的观察,这可能会帮助我以某种方式进一步发展。
有没有办法找到口袋里的手机?如果是的话,有人可以告诉我一个人怎么做?
任何有关概念的指导/链接都是有帮助的。
感谢。
答案 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
您可以使用Snapshot API
获取有关用户当前环境的信息。使用Snapshot API,您可以访问各种上下文信号:
使用Fence API
,您可以根据上下文信号定义围栏,例如:
答案 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!");
}
}
});
披露:我是开发人员之一。