在Android上,当face关闭屏幕时,以编程方式关闭屏幕

在Android上,当face关闭屏幕时,以编程方式关闭屏幕,android,screen,android-sensors,sensormanager,Android,Screen,Android Sensors,Sensormanager,我的应用程序是一个拨号器,当用户将手机举近头部时,我需要关闭屏幕,并防止点击控件,就像本机Android拨号器行为一样。我需要什么样的API级别以及如何以正确的方式执行此操作?以下代码向您展示了如何使用接近传感器: public class SensorActivity extends Activity implements SensorEventListener { private SensorManager mSensorManager; private Sensor mProximity;

我的应用程序是一个拨号器,当用户将手机举近头部时,我需要关闭屏幕,并防止点击控件,就像本机Android拨号器行为一样。我需要什么样的API级别以及如何以正确的方式执行此操作?

以下代码向您展示了如何使用接近传感器:

public class SensorActivity extends Activity implements SensorEventListener {
private SensorManager mSensorManager;
private Sensor mProximity;

 @Override
 public final void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);

// Get an instance of the sensor service, and use that to get an instance of
// a particular sensor.
mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
mProximity = mSensorManager.getDefaultSensor(Sensor.TYPE_PROXIMITY);
 }

 @Override
 public final void onAccuracyChanged(Sensor sensor, int accuracy) {
// Do something here if sensor accuracy changes.
 }

 @Override
  public final void onSensorChanged(SensorEvent event) {
   float distance = event.values[0];
// Do something with this sensor data.
   }

 @Override
 protected void onResume() {
// Register a listener for the sensor.
super.onResume();
mSensorManager.registerListener(this, mProximity, SensorManager.SENSOR_DELAY_NORMAL);
 }

 @Override
  protected void onPause() {
// Be sure to unregister the sensor when the activity pauses.
super.onPause();
mSensorManager.unregisterListener(this);
 }}
当面部靠近屏幕时,尝试使用接近传感器的链接关闭屏幕


希望这对您有所帮助。

我通过分解一个非常著名的VoIP应用程序找到了解决方案。按下按钮1后的此活动将在关闭传感器时禁用屏幕和硬件键。按下按钮2后,此功能将关闭

此外,此功能还需要以下权限:

<uses-permission android:name="android.permission.WAKE_LOCK" />

如果您尝试Solkin发布的方法(使用wakelock),很多设备的CPU使用率会很高。这是android设备中的一个bug


您应该使用onSensorChanged事件,只显示一个黑屏以避免任何问题

最好的方法是使用DialogFragment،显示一个黑屏,然后将其忽略

@Override
  public final void onSensorChanged(SensorEvent event) {
   float distance = event.values[0];
     if(distance <10f)
    showDialogFragment()
     else
    hideDialogFragment()

   }
@覆盖
传感器更改时的公共最终无效(传感器事件){
浮动距离=事件值[0];

如果(距离是的,这会给我发送很多事件,但不知道如何关闭屏幕…在链接的回答中,只使用了私有的Android API。我不知道OP想要加速计做什么。他更可能对来自的事件感兴趣。正如Michael建议的那样,使用接近传感器。接近传感器会在任何时候关闭屏幕对象靠近屏幕。例如:在呼叫/拨打任何呼叫时,当我们让设备靠近面部时,屏幕显示关闭。因此@Solkin您想要的东西将通过接近传感器获得。通过此链接,谢谢,但…这只是传感器侦听器。但我需要禁用屏幕。@I.n.e.f,没有
标记保持屏幕关闭
一个小错误x:你应该使用
PowerManager.class.getClass()
而不是
PowerManager.class
在三星duos、moto e、moto g第三代精灵上不起作用!!!我花了很多时间寻找解决方案!!非常感谢!!!为我在LGE Nexus 4——Android v.4.3(API:18)上工作过,即使官方文件说API 21()中添加了
接近屏幕关闭唤醒锁定
标志!手机锁定时不起作用可能重复“只显示黑屏以避免任何问题”?您的意思是,除了由于屏幕实际仍处于打开状态而导致的所有新问题之外?在这种情况下,用户将触摸屏幕、收到的通知等。这就是为什么您在呼叫时必须关闭屏幕的原因。
@Override
  public final void onSensorChanged(SensorEvent event) {
   float distance = event.values[0];
     if(distance <10f)
    showDialogFragment()
     else
    hideDialogFragment()

   }