我正在调用一个调用屏幕,我需要在用户通话时启用和禁用屏幕上的触摸事件。
为此,我在我的活动上实现了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可以很好地禁用触摸事件。但是,我无法再次重新启用触摸事件。
请帮助!
答案 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");