android 使用距离传感器让屏幕自动息屏
时间:2022-10-10 01:00:00
1.mainfest中权限注册
2.onCreate该方法初始化了电源和传感器管理器
@SuppressLint("InvalidWakeLockTag") private void initSenor() { localPowerManager = (PowerManager) getSystemService(Context.POWER_SERVICE); sensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE); wakeLock = localPowerManager.newWakeLock(32, "MyPower"); mSensor = sensorManager.getDefaultSensor(Sensor.TYPE_PROXIMITY); }
其中powerManager.newWakeLock方法不同wakelock操作对象
对各种锁的类型CPU 、屏幕、键盘的影响:
PARTIAL_WAKE_LOCK:保持CPU 运行时,屏幕和键盘灯可能会关闭。
SCREEN_DIM_WAKE_LOCK:保持CPU 操作时,允许屏幕显示,但可能是灰色的。关闭键盘灯
SCREEN_BRIGHT_WAKE_LOCK:保持CPU 操作时,允许屏幕高亮显示,关闭键盘灯
FULL_WAKE_LOCK:保持CPU 操作,保持屏幕亮度,键盘灯亮度
ACQUIRE_CAUSES_WAKEUP:正常唤醒锁实际上并没有打开照明。相反,一旦打开,它们仍然会保持(例如,来世user的activity)。当获得wakelock,这个标志会立即打开屏幕或/和键盘。一个典型的用途是立即看到对用户重要的通知。
ON_AFTER_RELEASE:设置此标志,当wakelock释放时用户activity计时器会被重置,导致照明持续一段时间。如果你在wacklock这可以用来减少条件下的闪烁
3.在onResume注册传感器
if (sensorMnager!=null){ ///注册传感器 第一个参数是距离监听器,第二个是传感器类型,第三个是延迟类型 sensorManager.registerListener(this,mSensor,SensorManager.SENSOR_DELAY_NORMAL); }
4.接口实现:
@Override public void onSensorChanged(SensorEvent event) { float[] its = event.values; if (its != null && event.sensor.getType() == Sensor.TYPE_PROXIMITY) { // 测试后,当手靠近距离传感器时its[0]返回值为0.0,手离开时返回1.0 if (its[0] == 0.0) {// 贴近手机 if (wakeLock.isHeld()) { return; } else { wakeLock.acquire();// 申请设备电源锁 } } else {// 远离手机 if (wakeLock.isHeld()) { return; } else { wakeLock.setReferenceCounted(false); wakeLock.release(); // 释放设备电源锁 } } } } @Override public void onAccuracyChanged(Sensor sensor, int accuracy) { }
5.释放资源
@Override protected void onDestroy() { super.onDestroy(); if (sensorManager != null) { sensorManager.unregisterListener(this);// 取消传感器监听 } if (wakeLock != null) { if (wakeLock.isHeld()) wakeLock.release(); ///释放电源锁 wakeLock = null; } if (localPowerManager != null) { localPowerManager = null; } }