在通话中禁用屏幕触摸功能

时间:2014-11-04 07:31:06

标签: android touch call voip proximity

我正在调用一个调用屏幕,我需要在用户通话时启用和禁用屏幕上的触摸事件。

为此,我在我的活动上实现了SensorEventListener并覆盖了onSensorChanged()方法:

public void onSensorChanged(SensorEvent sensorEvent) {
    if(sensorEvent.sensor.getType() == Sensor.TYPE_PROXIMITY) {
        if(sensorEvent.values[0] == 0) { //Sleep
            sleepScreen(true);
        } else { //Wake
            sleepScreen(false);
        }
    }
}

以下是我的sleepScreen()方法:

protected void sleepScreen(boolean on){
    if(on == true) {
        WindowManager.LayoutParams params = getWindow().getAttributes();
        params.flags |= WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE;
        getWindow().setAttributes(params);
    } else {
        WindowManager.LayoutParams params = getWindow().getAttributes();
        params.flags |= WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON;
        getWindow().setAttributes(params);
    }

}

FLAG_NOT_TOUCHABLE可以很好地禁用触摸事件。但是,我无法再次重新启用触摸事件。

请帮助!

2 个答案:

答案 0 :(得分:2)

第1步:在调用setContentView()

之前在onCreate中添加它
int powerValue = 0x00000020;

    try {
        powerValue = PowerManager.class.getClass().getField("PROXIMITY_SCREEN_OFF_WAKE_LOCK").getInt(null);
    } catch (Throwable ignored) {
    }

    mPowerManager = (PowerManager) getSystemService(POWER_SERVICE);
    mWakeLock = mPowerManager.newWakeLock(field, getLocalClassName());

第2步:通过实施SensorEventListener

覆盖该方法
public void onSensorChanged(SensorEvent sensorEvent) {
    if (sensorEvent.sensor.getType() == Sensor.TYPE_PROXIMITY) {
        if (sensorEvent.values[0] == 0) { //Sleep
            sleepScreen(true);
        } else { //Wake
            sleepScreen(false);
        }
    }
}

第3步:包含此方法以禁用屏幕锁定

protected void sleepScreen(boolean on) {

        if (on == true) {
            if (!mWakeLock.isHeld()) {
                mWakeLock.acquire();
            }
        } else {
            if (mWakeLock.isHeld()) {
                mWakeLock.release();
            }
        }
}

第4步:将唤醒锁权限添加到AndroidManifest.xml

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

答案 1 :(得分:0)

获取唤醒锁时,使用PowerManager.PROXIMITY_SCREEN_OFF_WAKE_LOCK标志获取。它将自动打开和关闭屏幕。

  

唤醒锁定级别:当接近传感器激活时,关闭屏幕。

     

如果接近传感器检测到附近有物体,屏幕将立即关闭。物体移开后不久,屏幕再次打开。   资料来源:developer.android.com

例如。

    PowerManager powerManager = (PowerManager) getSystemService(Context.POWER_SERVICE);
    mWakeLock= powerManager.newWakeLock((PowerManager.PROXIMITY_SCREEN_OFF_WAKE_LOCK | PowerManager.ACQUIRE_CAUSES_WAKEUP), "WakeLock:TAG");