android 使用距离传感器让屏幕自动息屏

记录一下最近做的自动息屏,原理是根据手机距离传感器来判断是否息屏

1.mainfest中权限注册

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

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;
    }
}

 

 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值