我需要在我的应用程序中复制股票拨号器的功能 - 当接近传感器检测到手机靠近我的脸时,关闭屏幕,当我把手机从脸上拿开时重新打开。
此线程中有一个部分有效的解决方案。它依赖于一个次优的私有 API,但更糟糕的是,它可以在我测试过的 3 台设备中的一台上运行。我的目标是Android 4.03及更高版本,我正在测试Galaxy S3,Galaxy Nexus和Nexus 4。我链接到的解决方案适用于 GN。在 Nexus 4 上,它什么都没有(看到官方的 androidnadroid 拨号器使用相同的代码并且它在那里工作,我觉得特别令人困惑。在 S3 上,获取 wakeLock 似乎执行与按下电源按钮相同的操作(锁定手机,从而关闭接近传感器)。
由于调用powerManager.goToSleep需要需要手机根的权限,因此设置屏幕亮度似乎一拍即合(并且在我的3部手机上都无法正常工作 - 我可以改变亮度但永远无法关闭屏幕),唯一的其他方法似乎是另一个私有API(setScreenState - 在我的情况下,这意味着Java互操作,因为我使用的是Mono4Android), 我想知道 - 有没有办法全面完成这项工作,或者这只是我们不应该做的事情之一?尽管如此,仍然有很多呼叫应用程序需要这样的功能,所以世界上的Skypes,Vibers&Co.需要以某种方式解决这个问题,我将不胜感激,因为我正处于智慧的尽头。
这是我在此期间学到的 - 不要尝试获取特殊的 wakeLock,除非调用状态不是空闲状态。如果有呼叫,锁可以工作,但有一个问题:在 Google 手机上(尝试使用 GN 和 G4),即使屏幕关闭,活动也会保持活动状态。在我的 S3 上,一旦我获得锁,活动就会停止(未暂停...停下了!因此,您需要以一种保持接近传感器处于活动状态的方式编写代码(我在 onPause 后将其注销,这导致我相信它在 S3 上不起作用) - 必须保持传感器停止活动肯定会让你更难,但它仍然是可行的。