android - 在 Android on call 中禁用屏幕触摸

标签 android touch call voip proximity

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

为此,我在 Activity 上实现 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 可以很好地禁用触摸事件。但是,我无法再次重新启用触摸事件。

请帮忙!

最佳答案

第 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" />

关于android - 在 Android on call 中禁用屏幕触摸,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26729811/

相关文章:

html5 滑动事件

android - Sencha Touch 2.1 native (android)应用程序无法从远程获取 json(它适用于 PC)

android - 如何从另一个 Activity 调用 ListView 适配器进行刷新 - notifyDataSetChanged()

android - apk 文件和 dex 文件不是由 eclipse 生成的

java - 从 Hijri 日期字符串中获取公历日期

Android - 最顶栏名称?

c - 如果给出了错误的输入,我的函数应该包含什么才能返回 -1.0 的值?

android - 适用于 Android 的语音效果环调制器

qt - Windows 7 中带有 Qt/QML 应用程序的自定义触摸行为

function - 如何从 CLI 调用 PHP 函数?