我正在处理调用屏幕,我需要在用户通话时启用和禁用屏幕上的触摸事件。
为此,我在 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/