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相关推荐

  1. 计算机休眠会断网,win10系统休眠断网的解决方法

    win10纯净版系统使用过程中,电脑如果长时间不用我们一般会设置睡眠模式.一位win10 64位纯净版用户碰到电脑睡眠,唤醒后断网,需要重启电脑才能连上网络.我们碰到这个问题该怎么解决呢?现在我们跟着 ...

  2. 怎么设置计算机自己休眠断网,win10系统怎么设置待机断网 待机断网设置方法

    大家在用win10系统电脑工作和学习的过程中,可能会出现win10系统待机断网的情况.如果遇到win10系统待机断网的问题应该如何处理呢?对于电脑水平属于小白的用户来说一般不知道win10系统待机断网 ...

  3. 红米k40怎样关闭休眠断网(红米k40取消锁屏)

    手机通常通过屏幕节约电力.但是最近红米k40用户对自己的手机做出反应,屏幕一关闭就自动休眠.有时也会影响信息的接收.为了帮助大家解决问题.下面的小编为大家整理了详细的解决方法.快来一起看! 红米k40 ...

  4. 距离感应器下的休眠唤醒机制实现

    前言 从事Android framework开发已经两年了,今天起决定把工作上遇到的问题.做过的需求都用博客的形式记录一下,特地新开一个系列---Android framework开发工作记录,有需要 ...

  5. android距离感应器控制屏幕灭屏白屏

    最近在做一个网络通话的apk,功能和手机打sim卡电话一样.虽然只做java部分,但也遇到很多问题,其中一个就是模拟通话时的状态,要控制屏幕锁屏.我知道是通过手机上的距离感应器来实现,但也搞了好久,今 ...

  6. 微信停机断网可充话费;苹果正研发可折叠屏幕 iPad;Rust 1.36.0 发布 | 极客头条...

    快来收听极客头条音频版吧,智能播报由标贝科技提供技术支持. 「CSDN 极客头条」,是从 CSDN 网站延伸至官方微信公众号的特别栏目,专注于一天业界事报道.风里雨里,我们将每天为朋友们,播报最新鲜有 ...

  7. 怎么调解计算机休眠不断网,怎么设置Win7不待机 Win7进入待机状态会断网的解决方法...

    有时候我们需要挂一些游戏或者应用的时候,希望人在电脑面前的时候,电脑不进入待机状态,因为一旦进入待机状态后,会断网,应用将停止运行,因此需要设置电脑不待机来解决.那么电脑不待机怎么设置呢?以下我们以W ...

  8. 7月6日科技资讯|微信停机断网可充话费;苹果正研发可折叠屏幕 iPad;Rust 1.36.0 发布

    「CSDN 极客头条」,是从 CSDN 网站延伸至官方微信公众号的特别栏目,专注于一天业界事报道.风里雨里,我们将每天为朋友们,播报最新鲜有料的新闻资讯,让所有技术人,时刻紧跟业界潮流. 快讯速知 微 ...

  9. Android距离感应器P-Sensor浅析

    (一)  前言 P-Sensor,距离感应器,可以感应手机和人体距离.具体使用用途是在通话过程中打开P-Sensor,那么当手机屏幕贴近用户脸部时,就会自动感应出手机和人体距离是多少.当小于某一个值时 ...

最新文章

  1. 电商的「穿衣AI」用得好,剁手根本停不了 | CVPR 2020
  2. Handler详细说明系列(六)——View的post()详解
  3. 一些常用正则表达解析
  4. pku 3159 Candies 差分约束
  5. POS消费机C#例子代码
  6. java jdbc 删除_java使用jdbc实现各种类型添加删除修改数据
  7. cks32和stm32_cks子,间谍,局部Mo子和短管
  8. Lightbox JS v2.0
  9. mysql视图表修复_mysql中含有视图数据库在恢复数据时视图变成数据表的解决方法...
  10. 如何应对视觉深度学习存在的问题
  11. jquery获取前一个月日期
  12. js高级技巧之函数节流
  13. 大数据开发笔记(九):Flink综合学习
  14. 磁盘结构非常详细的介绍
  15. asp编程实例:通过表单创建word的一个例子
  16. php firefox导出csv,如果文件名有空格,空格后面部分不会导出,后缀也没有
  17. 翻译:自动驾驶相关术语的分类和定义Taxonomy and Definitions for Terms Related to On-Road Motor Vehicle Automated
  18. Set集合之HashSet添加的数据是如何保证不重复的
  19. 牛客网算法之洗牌详解
  20. gps面积测量仪手机版下载安装_gps面积测量仪手机版下载-GPS距离面积测量仪 安卓版v3.5.7-PC6安卓网...

热门文章

  1. onenote的笔记本在windows10保存的路径
  2. 一张纸还能上天能救命?理工男宁愿放弃NASA百万年薪,也要回家折纸?!
  3. SQL 查询排名,相同数据排名相同
  4. PS 色相、饱和度和明度
  5. ORA-00392: log 4 of thread 2 is being cleared, operation not allowed
  6. 读《应试教育的死穴,恰在于堵死了孩子“犯错”的空间》有感
  7. 帮我看看怎么回事的错误
  8. 离散数学 第十六章 环和域
  9. 如何度过中年危机(转)
  10. SQL中重复数据的查询与删除