PowerManager屏幕休眠断网与距离感应器P-Sensor
PowerManager.java
。
1. 应用程序获取PowerManager服务, 我们可以这样书写:
PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
2. goToSleep()方法, 这个方法可以强制我们的屏幕熄屏。我们可以这样调用:
在上面拿到pm对象之后,这样调用 pm.goToSleep(SystemClock.uptimeMillis());
3. setBacklightBrightness()方法,这个方法可以设置背光的亮度,从0-255
三. 定时熄灭屏幕
有时屏幕休眠状态会造成断网,
那么这里,还可以介绍一个控制屏幕的方法就是PowerManager.WakeLock
顾名思义,WakeLock这个东西就是亮屏控制,这里说的亮屏,它定义了几种类型的亮屏。如下:
类型 | cpu | 屏幕 | 键盘 |
PARTIAL_WAKE_LOCK | on | off | off |
SCREEN_DIM_WAKE_LOCK | on | dim | off |
SCREEN_BRIGHT_WAKE_LOCK | on | Bright | off |
FULL_WAKE_LOCK | on | Bright | Bright |
PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
PowerManager.WakeLock wakeLock = pm.newWakeLock(PowerManager.SCREEN_DIM_WAKE_LOCK, "TAG");
wakeLock.acquire();
//做我们的工作,在这个阶段,我们的屏幕会持续点亮
//释放锁,屏幕熄灭。
wakeLock.release()
那么这里我们也可以这样使用,就是多少时间后熄灭屏幕
首先点亮屏幕
PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
PowerManager.WakeLock wakeLock = pm.newWakeLock(PowerManager.SCREEN_DIM_WAKE_LOCK, "TAG");
wakeLock.acquire();
然后
mTimeHandler.postDelayed(new Runnable(){public void run(){wakeLock.release();}}, 10*1000);
嗯,延迟10s后熄灭屏幕。。。。
那么,这里要注意的是acquire()和release()要成对调用哦!也就是说,你申请了亮屏,过段时间,你要是释放它。
P-Sensor,距离感应器,可以感应手机和人体距离。具体使用用途是在通话过程中打开P-Sensor时靠近脸时屏幕熄灭,第三方apk无法调用,只能系统开发调用
参考http://blog.csdn.net/wds1181977/article/details/18005665
http://bbs.51cto.com/thread-1021568-1.html
Android4.2源码Phone的模块的P-Sensor的控制的类在DisplayPowerController.java
路径:framework/base/services/java/com/android/server/power/DisplayPowerController.java中的:
private PowerManager.WakeLock mProximityWakeLock;
mProximityWakeLock = pm.newWakeLock(PowerManager.PROXIMITY_SCREEN_OFF_WAKE_LOCK, LOG_TAG);
打开P-Sensor(正确的说法是获得锁)
if (!mProximityWakeLock.isHeld()) {if (DBG) Log.d(LOG_TAG, "updateProximitySensorMode: acquiring...");mProximityWakeLock.acquire();}
释放P-Sensor
if (mProximityWakeLock.isHeld()) {mProximityWakeLock.release(flags)
}
这个mProximityWakeLock.acquire();和mProximityWakeLock.release(flags);只是申请这个锁,和释放这个锁,防止其他的调用其中mProximityWakeLock.acquire();会辗转调用到PowerManagerService.java的enableProximityLockLocked()方法,顾名思义,这个方法是打开P-Sensor,是的!这个方法会去判断当前手机有没有P-Sensor,如果有的话,就会去向SensorManager注册一个P-Sensor监听器,那么当P-Sensor检测到手机和人体距离发生改变时,就会调用我们PowerManagerService.java的监听器.同样,当电话挂断时,电话模块会去调用mProximityWakeLock.release(flags), 这样就会取消P-Sensor监听器.
ok.. 那么接下来就是分析PowerManagerService里面这个P-Sensor是怎么工作的。
SensorEventListener mProximityListener = new SensorEventListener() {public void onSensorChanged(SensorEvent event) {long milliseconds = SystemClock.elapsedRealtime();synchronized (mLocks) {float distance = event.values[0]; //检测到手机和人体的距离long timeSinceLastEvent = milliseconds - mLastProximityEventTime; //这次检测和上次检测的时间差mLastProximityEventTime = milliseconds; //更新上一次检测的时间mHandler.removeCallbacks(mProximityTask); boolean proximityTaskQueued = false;// compare against getMaximumRange to support sensors that only return 0 or 1boolean active = (distance >= 0.0 && distance < PROXIMITY_THRESHOLD &&distance < mProximitySensor.getMaximumRange()); //如果距离小于某一个距离阈值,默认是5.0f,说明手机和脸部距离贴近,应该要熄灭屏幕。if (mDebugProximitySensor) {Slog.d(TAG, "mProximityListener.onSensorChanged active: " + active);}if (timeSinceLastEvent < PROXIMITY_SENSOR_DELAY) {// enforce delaying atleast PROXIMITY_SENSOR_DELAY before processingmProximityPendingValue = (active ? 1 : 0);mHandler.postDelayed(mProximityTask, PROXIMITY_SENSOR_DELAY - timeSinceLastEvent);proximityTaskQueued = true;} else {// process the value immediatelymProximityPendingValue = -1;proximityChangedLocked(active); //熄灭屏幕操作}// update mProximityPartialLock stateboolean held = mProximityPartialLock.isHeld();if (!held && proximityTaskQueued) {// hold wakelock until mProximityTask runsmProximityPartialLock.acquire();} else if (held && !proximityTaskQueued) {mProximityPartialLock.release();}}}public void onAccuracyChanged(Sensor sensor, int accuracy) {// ignore}};
代码里面我已经有一些注释,下面来用文字描述下。
a. 首先会拿到这测距离变化的距离,float distance = event.values[0];
b. 检测这次距离变化和上次距离变化时间差,如果小于系统设置的阈值,则不会去熄灭屏幕。过于频繁的操作系统会忽略掉。所以,如果你感觉P-Sensor不够灵敏,就可以修改这个系统默认值
代码:
private static final int PROXIMITY_SENSOR_DELAY = 1000;
如果你改的很小,就会发现P-Sensor会变得灵敏很多。。。
c. 嗯,如果P-Sensor检测到这次距离变化小于系统默认值,且这次是一次正常的变化,那么就应该去熄灭屏幕:
复制内容到剪贴板
代码:
proximityChangedLocked(active);
这里的active是true,同样,在这里它还会判断P-Sensor是否可以用,如果不可用,则返回。。忽略这次距离变化
复制内容到剪贴板
代码:
if (!mProximitySensorEnabled) {Slog.d(TAG, "Ignoring proximity change after sensor is disabled");return;}
如果一切都满足,则调用:
复制内容到剪贴板
代码:
goToSleepLocked(SystemClock.uptimeMillis(),WindowManagerPolicy.OFF_BECAUSE_OF_PROX_SENSOR);
熄灭屏幕。。
PowerManager屏幕休眠断网与距离感应器P-Sensor相关推荐
- 计算机休眠会断网,win10系统休眠断网的解决方法
win10纯净版系统使用过程中,电脑如果长时间不用我们一般会设置睡眠模式.一位win10 64位纯净版用户碰到电脑睡眠,唤醒后断网,需要重启电脑才能连上网络.我们碰到这个问题该怎么解决呢?现在我们跟着 ...
- 怎么设置计算机自己休眠断网,win10系统怎么设置待机断网 待机断网设置方法
大家在用win10系统电脑工作和学习的过程中,可能会出现win10系统待机断网的情况.如果遇到win10系统待机断网的问题应该如何处理呢?对于电脑水平属于小白的用户来说一般不知道win10系统待机断网 ...
- 红米k40怎样关闭休眠断网(红米k40取消锁屏)
手机通常通过屏幕节约电力.但是最近红米k40用户对自己的手机做出反应,屏幕一关闭就自动休眠.有时也会影响信息的接收.为了帮助大家解决问题.下面的小编为大家整理了详细的解决方法.快来一起看! 红米k40 ...
- 距离感应器下的休眠唤醒机制实现
前言 从事Android framework开发已经两年了,今天起决定把工作上遇到的问题.做过的需求都用博客的形式记录一下,特地新开一个系列---Android framework开发工作记录,有需要 ...
- android距离感应器控制屏幕灭屏白屏
最近在做一个网络通话的apk,功能和手机打sim卡电话一样.虽然只做java部分,但也遇到很多问题,其中一个就是模拟通话时的状态,要控制屏幕锁屏.我知道是通过手机上的距离感应器来实现,但也搞了好久,今 ...
- 微信停机断网可充话费;苹果正研发可折叠屏幕 iPad;Rust 1.36.0 发布 | 极客头条...
快来收听极客头条音频版吧,智能播报由标贝科技提供技术支持. 「CSDN 极客头条」,是从 CSDN 网站延伸至官方微信公众号的特别栏目,专注于一天业界事报道.风里雨里,我们将每天为朋友们,播报最新鲜有 ...
- 怎么调解计算机休眠不断网,怎么设置Win7不待机 Win7进入待机状态会断网的解决方法...
有时候我们需要挂一些游戏或者应用的时候,希望人在电脑面前的时候,电脑不进入待机状态,因为一旦进入待机状态后,会断网,应用将停止运行,因此需要设置电脑不待机来解决.那么电脑不待机怎么设置呢?以下我们以W ...
- 7月6日科技资讯|微信停机断网可充话费;苹果正研发可折叠屏幕 iPad;Rust 1.36.0 发布
「CSDN 极客头条」,是从 CSDN 网站延伸至官方微信公众号的特别栏目,专注于一天业界事报道.风里雨里,我们将每天为朋友们,播报最新鲜有料的新闻资讯,让所有技术人,时刻紧跟业界潮流. 快讯速知 微 ...
- Android距离感应器P-Sensor浅析
(一) 前言 P-Sensor,距离感应器,可以感应手机和人体距离.具体使用用途是在通话过程中打开P-Sensor,那么当手机屏幕贴近用户脸部时,就会自动感应出手机和人体距离是多少.当小于某一个值时 ...
最新文章
- 电商的「穿衣AI」用得好,剁手根本停不了 | CVPR 2020
- Handler详细说明系列(六)——View的post()详解
- 一些常用正则表达解析
- pku 3159 Candies 差分约束
- POS消费机C#例子代码
- java jdbc 删除_java使用jdbc实现各种类型添加删除修改数据
- cks32和stm32_cks子,间谍,局部Mo子和短管
- Lightbox JS v2.0
- mysql视图表修复_mysql中含有视图数据库在恢复数据时视图变成数据表的解决方法...
- 如何应对视觉深度学习存在的问题
- jquery获取前一个月日期
- js高级技巧之函数节流
- 大数据开发笔记(九):Flink综合学习
- 磁盘结构非常详细的介绍
- asp编程实例:通过表单创建word的一个例子
- php firefox导出csv,如果文件名有空格,空格后面部分不会导出,后缀也没有
- 翻译:自动驾驶相关术语的分类和定义Taxonomy and Definitions for Terms Related to On-Road Motor Vehicle Automated
- Set集合之HashSet添加的数据是如何保证不重复的
- 牛客网算法之洗牌详解
- gps面积测量仪手机版下载安装_gps面积测量仪手机版下载-GPS距离面积测量仪 安卓版v3.5.7-PC6安卓网...