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

Sol*_*kin 21 android screen android-sensors sensormanager

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

Sol*_*kin 43

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

此外,此功能需要权限:

<uses-permission android:name="android.permission.WAKE_LOCK" />
Run Code Online (Sandbox Code Playgroud)

活动.试试吧.

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();
                }
            }
        });
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 一个小修复:而不是`PowerManager.class.getClass()`你应该使用`PowerManager.class` (3认同)
  • 不适用于Nexus 4 android 4.4.2 (3认同)