【问题标题】:Turn off screen programmatically when face is close the screen on Android在Android上关闭屏幕时以编程方式关闭屏幕
【发布时间】:2014-02-19 14:58:07
【问题描述】:

我的应用是一个拨号器,当用户将手机靠近头部时,我需要关闭屏幕并防止点击控件 - 就像原生 Android 拨号器行为一样。我需要什么 API 级别以及如何以正确的方式做到这一点?

【问题讨论】:

标签: android screen android-sensors sensormanager


【解决方案1】:

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

另外,此功能需要权限:

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

活动。试试看。

public class MainActivity extends Activity {

    private Button button1;
    private Button button2;
    private PowerManager powerManager;
    private PowerManager.WakeLock wakeLock;
    private int field = 0x00000020;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        try {
            // Yeah, this is hidden field.
            field = PowerManager.class.getClass().getField("PROXIMITY_SCREEN_OFF_WAKE_LOCK").getInt(null);
        } catch (Throwable ignored) {
        }

        powerManager = (PowerManager) getSystemService(POWER_SERVICE);
        wakeLock = powerManager.newWakeLock(field, getLocalClassName());

        setContentView(R.layout.main);
        button1 = (Button) findViewById(R.id.button1);
        button2 = (Button) findViewById(R.id.button2);

        button1.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {
                if(!wakeLock.isHeld()) {
                    wakeLock.acquire();
                }
            }
        });

        button2.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {
                if(wakeLock.isHeld()) {
                    wakeLock.release();
                }
            }
        });
    }
}

【讨论】:

  • 一个小修复:你应该使用PowerManager.class.getClass()而不是PowerManager.class
  • 不适用于 samsung duos、moto e、moto g 3rd gen
  • 真的好用!!!我花了很多时间来寻找解决方案!非常感谢!!!
  • 在 LGE Nexus 4 -- Android v.4.3 (API:18) 上为我工作,尽管官方文档说在 API 21 (developer.android.com/reference/android/os/PowerManager) 中添加了 PROXIMITY_SCREEN_OFF_WAKE_LOCK 标志!
  • 那是什么应用程序??
【解决方案2】:

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

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);
 }}

尝试this 链接以在人脸靠近屏幕时使用接近传感器关闭屏幕。

希望对您有所帮助。

【讨论】:

  • 是的,这会向我发送很多事件,但不知道如何关闭屏幕...在链接的答案中,仅使用了私有 Android API。
  • 我看不出 OP 想要加速度计做什么。他更有可能对来自the proximity sensor 的事件感兴趣。
  • Michael 建议使用接近传感器。当任何物体靠近屏幕时,接近传感器将关闭屏幕。例如:当我们将设备靠近面部时拨打/拨打任何电话时,屏幕显示会关闭。所以@Solkin 你想要的东西将通过接近传感器得到。通过此链接developer.android.com/guide/topics/sensors/…
  • 谢谢,但是...这只是传感器侦听器。但我需要禁用屏幕。
  • @i.n.e.f,没有FLAG_KEEP_SCREEN_OFF
【解决方案3】:

如果您尝试使用 Solkin 发布的方法(使用唤醒锁),很多设备的 CPU 使用率会很高。这是 android 设备中的错误。

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

【讨论】:

  • “只显示黑屏以避免任何问题”?你的意思是,除了屏幕实际上仍然打开这一事实引起的所有新问题之外?
【解决方案4】:

最好的方法是使用 DialogFragment,你显示一个黑屏并关闭它

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

   }

【讨论】:

  • 在这种情况下,用户将触摸屏幕,收到通知等。这就是为什么您必须在通话时关闭屏幕。
猜你喜欢
  • 1970-01-01
  • 2018-08-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-02
  • 2017-11-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多