一、底层的驱动在这里不提,只关心上层。

二、实现AndroidR 获取接近传感器Proximity Sensor的信号,休眠和唤醒的方法:获取SENSOR_SERVICE服务,侦听Sensor事件。

三、修改的代码,在frameworks\base\services\core\java\com\android\server\policy\PhoneWindowManager.java 文件里面添加下面的代码。

diff --git a/services/core/java/com/android/server/policy/PhoneWindowManager.java b/services/core/java/com/android/server/policy/PhoneWindowManager.java
index d966f36..97b2ef8 100755
--- a/services/core/java/com/android/server/policy/PhoneWindowManager.java
+++ b/services/core/java/com/android/server/policy/PhoneWindowManager.java
@@ -123,6 +123,11 @@ import android.hardware.hdmi.HdmiControlManager;import android.hardware.hdmi.HdmiPlaybackClient;import android.hardware.hdmi.HdmiPlaybackClient.OneTouchPlayCallback;import android.hardware.input.InputManagerInternal;
+import android.hardware.Sensor;
+import android.hardware.SensorEvent;
+import android.hardware.SensorEventListener;
+import android.hardware.SensorManager;
+import android.media.AudioAttributes;import android.media.AudioManager;import android.media.AudioManagerInternal;
@@ -229,6 +234,7 @@ import java.io.IOException;import java.io.PrintWriter;import java.util.HashSet;import java.util.List;
+import android.util.Log;/*** WindowManagerPolicy implementation for the Android phone UI.  This
@@ -378,6 +384,9 @@ public class PhoneWindowManager implements WindowManagerPolicy {BurnInProtectionHelper mBurnInProtectionHelper;private DisplayFoldController mDisplayFoldController;AppOpsManager mAppOpsManager;
+  private Sensor sensor;
+    private SensorManager sm;
+    private SensorEventListener listener;PackageManager mPackageManager;private boolean mHasFeatureAuto;private boolean mHasFeatureWatch;
@@ -1924,6 +1933,37 @@ public class PhoneWindowManager implements WindowManagerPolicy {"PhoneWindowManager.mBroadcastWakeLock");mPowerKeyWakeLock = mPowerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK,"PhoneWindowManager.mPowerKeyWakeLock");
+
+        sm=(SensorManager) mContext.getSystemService(Context.SENSOR_SERVICE);
+        sensor=sm.getDefaultSensor(Sensor.TYPE_PROXIMITY);
+
+        listener=new SensorEventListener() {
+
+            @Override
+            public void onSensorChanged(SensorEvent event) {
+                // TODO Auto-generated method stub
+                //获得距离传感器中的数值,这里只有一个距离
+                float[] values = event.values;
+                Log.i(TAG,"onSensorChanged values[0]="+values[0]+" maxrange="+sensor.getMaximumRange());
+
+                if (values[0] == 0.0) {// 贴近手机
+                    mPowerManager.goToSleep(SystemClock.uptimeMillis());
+                    Log.d(TAG, "The object is near to sensor ! go to sleep now");
+                } else {// 远离手机
+                  wakeUpFromPowerKey(SystemClock.uptimeMillis());
+                    Log.d(TAG, "The object is far to sensor !");
+
+                }
+            }
+
+            @Override
+            public void onAccuracyChanged(Sensor sensor, int accuracy) {
+                // TODO Auto-generated method stub
+                Log.i(TAG,"onAccuracyChanged");
+            }
+        };
+
+        sm.registerListener(listener, sensor, SensorManager.SENSOR_DELAY_NORMAL);mEnableShiftMenuBugReports = "1".equals(SystemProperties.get("ro.debuggable"));mLidKeyboardAccessibility = mContext.getResources().getInteger(com.android.internal.R.integer.config_lidKeyboardAccessibility);

四、用手指接近传感器的时候会灭屏休眠,手指离开的时候亮屏唤醒,查看log如下:

五、新需求,物体遮挡传感器超过5s就进入灭屏休眠,物体移开唤醒亮屏。

1、先修复驱动一个bug,进入休眠后会把sensor 的电断开,需要重新init。

diff --git a/drivers/input/sensors/psensor/ps_stk3x1x.c b/drivers/input/sensors/psensor/ps_stk3x1x.c
index 985c897..e5141a6 100755
--- a/drivers/input/sensors/psensor/ps_stk3x1x.c
+++ b/drivers/input/sensors/psensor/ps_stk3x1x.c
@@ -895,6 +895,23 @@ static int proximity_sensor_report_value(struct i2c_client *client)return result;}+static int proximity_sensor_suspend(struct i2c_client *client)
+{
+   printk("%s:line=%d\n",__func__,__LINE__);
+
+   return 0;
+}
+
+
+static int proximity_sensor_resume(struct i2c_client *client)
+{
+   proximity_sensor_init(client);
+   proximity_sensor_active(client,1,190);
+
+   printk("%s:line=%d\n",__func__,__LINE__);
+   return 0;
+}
+struct sensor_operate proximity_stk3x1x_ops = {.name             = "ps_stk3x1x",.type             = SENSOR_TYPE_PROXIMITY,   //sensor type and it should be correct
@@ -911,6 +928,8 @@ struct sensor_operate proximity_stk3x1x_ops = {.active                = proximity_sensor_active, .init               = proximity_sensor_init,.report                = proximity_sensor_report_value,
+  .suspend            = proximity_sensor_suspend,
+  .resume             = proximity_sensor_resume,// int   brightness[2];//backlight min_brightness max_brightness // int int_ctrl_reg;// int (*suspend)(struct i2c_client *client);

2、framework PhoneWindowManager.java 的修改。

diff --git a/services/core/java/com/android/server/policy/PhoneWindowManager.java b/services/core/java/com/android/server/policy/PhoneWindowManager.java
index d966f36..281e6a2 100755
--- a/services/core/java/com/android/server/policy/PhoneWindowManager.java
+++ b/services/core/java/com/android/server/policy/PhoneWindowManager.java
@@ -123,6 +123,11 @@ import android.hardware.hdmi.HdmiControlManager;import android.hardware.hdmi.HdmiPlaybackClient;import android.hardware.hdmi.HdmiPlaybackClient.OneTouchPlayCallback;import android.hardware.input.InputManagerInternal;
+import android.hardware.Sensor;
+import android.hardware.SensorEvent;
+import android.hardware.SensorEventListener;
+import android.hardware.SensorManager;
+import android.media.AudioAttributes;import android.media.AudioManager;import android.media.AudioManagerInternal;
@@ -229,6 +234,7 @@ import java.io.IOException;import java.io.PrintWriter;import java.util.HashSet;import java.util.List;
+import android.util.Log;/*** WindowManagerPolicy implementation for the Android phone UI.  This
@@ -378,6 +384,9 @@ public class PhoneWindowManager implements WindowManagerPolicy {BurnInProtectionHelper mBurnInProtectionHelper;private DisplayFoldController mDisplayFoldController;AppOpsManager mAppOpsManager;
+  private Sensor sensor;
+    private SensorManager sm;
+    private SensorEventListener listener;PackageManager mPackageManager;private boolean mHasFeatureAuto;private boolean mHasFeatureWatch;
@@ -578,6 +587,7 @@ public class PhoneWindowManager implements WindowManagerPolicy {private boolean mBugreportTvKey1Pressed;private boolean mBugreportTvKey2Pressed;private boolean mBugreportTvScheduled;
+  private boolean mSentmessageproximitystatus = false;private boolean mAccessibilityTvKey1Pressed;private boolean mAccessibilityTvKey2Pressed;
@@ -636,6 +646,7 @@ public class PhoneWindowManager implements WindowManagerPolicy {private static final int MSG_LAUNCH_ASSIST_LONG_PRESS = 24;private static final int MSG_POWER_VERY_LONG_PRESS = 25;private static final int MSG_RINGER_TOGGLE_CHORD = 26;
+    private static final int MSG_PROXIMITY_STATUS = 27;private int screenWidth;private int screenHeight;
@@ -731,6 +742,16 @@ public class PhoneWindowManager implements WindowManagerPolicy {case MSG_POWER_LONG_PRESS:powerLongPress();break;
+              case MSG_PROXIMITY_STATUS:
+                   final int status = (int) msg.obj;
+                   if(status == 1){
+                       mPowerManager.goToSleep(SystemClock.uptimeMillis());
+                     Log.d(TAG, "MSG_PROXIMITY_STATUS,GO TO SLEEP NOW!");
+                   }else if (status == 2){
+
+                   }
+                   Log.d(TAG, "MSG_PROXIMITY_STATUS status="+status);
+                    break;case MSG_POWER_VERY_LONG_PRESS:powerVeryLongPress();break;
@@ -1924,6 +1945,50 @@ public class PhoneWindowManager implements WindowManagerPolicy {"PhoneWindowManager.mBroadcastWakeLock");mPowerKeyWakeLock = mPowerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK,"PhoneWindowManager.mPowerKeyWakeLock");
+
+        sm=(SensorManager) mContext.getSystemService(Context.SENSOR_SERVICE);
+        sensor=sm.getDefaultSensor(Sensor.TYPE_PROXIMITY);
+
+        listener=new SensorEventListener() {
+
+            @Override
+            public void onSensorChanged(SensorEvent event) {
+                // TODO Auto-generated method stub
+                //获得距离传感器中的数值,这里只有一个距离
+                float[] values = event.values;
+                Log.i(TAG,"onSensorChanged values[0]="+values[0]+" maxrange="+sensor.getMaximumRange());
+
+                if (values[0] == 0.0) {// 贴近手机
+                 //mPowerManager.goToSleep(SystemClock.uptimeMillis());
+                  if(mPowerManager.isScreenOn()){
+                    Message msg = mHandler.obtainMessage(MSG_PROXIMITY_STATUS, 1 );
+                    msg.setAsynchronous(true);
+                    mHandler.sendMessageDelayed(msg, 5000);
+                    mSentmessageproximitystatus = true;
+                    Log.d(TAG, "the screen is on,The object is near to sensor , ready to sleep after 5s");
+                }else
+                    Log.d(TAG, "The object is near to sensor,the screen is off");
+                } else {// 远离手机
+                      if(mSentmessageproximitystatus){
+                     mHandler.removeMessages(MSG_PROXIMITY_STATUS);
+                     mSentmessageproximitystatus = false;
+                     if(!mPowerManager.isScreenOn()){
+                        wakeUpFromPowerKey(SystemClock.uptimeMillis());
+                        Log.d(TAG, "The object is far to sensor , wake up");
+                      }
+                      }
+                    Log.d(TAG, "The object is far to sensor !");
+                }
+            }
+
+            @Override
+            public void onAccuracyChanged(Sensor sensor, int accuracy) {
+                // TODO Auto-generated method stub
+                Log.i(TAG,"onAccuracyChanged");
+            }
+        };
+
+        sm.registerListener(listener, sensor, SensorManager.SENSOR_DELAY_NORMAL);mEnableShiftMenuBugReports = "1".equals(SystemProperties.get("ro.debuggable"));mLidKeyboardAccessibility = mContext.getResources().getInteger(com.android.internal.R.integer.config_lidKeyboardAccessibility);

3、运行log,当有物体遮挡传感器5s后会进入灭屏休眠,移开之后会唤醒亮屏幕。

2022-06-29 AndroidR 获取接近传感器Proximity Sensor的信号,休眠和唤醒。相关推荐

  1. verp之增加接近传感器(proximity sensor)

    V-REP offers a very powerful and efficient way to simulate proximity sensors. The user can model alm ...

  2. 人工智能 | ShowMeAI资讯日报 #2022.06.29

    ShowMeAI日报系列全新升级!覆盖AI人工智能 工具&框架 | 项目&代码 | 博文&分享 | 数据&资源 | 研究&论文 等方向.点击查看 历史文章列表, ...

  3. android g sensor,android gsensor 休眠震动唤醒功能怎么实现

    一.唤醒源 设备休眠后,通过触发唤醒源使设备恢复正常工作模式.设备唤醒源有多种,对于Android设备常见的就有PowerKey.来电唤醒.Alarm唤醒等. 唤醒源的实现处于内核空间,本文重点讨论下 ...

  4. 自然语言处理技术(NLP)在推荐系统中的应用 原2017.06.29人工智能头条 作者: 张相於,58集团算法架构师,转转搜索推荐部负责人,负责搜索、推荐以及算法相关工作。多年来主要从事推荐系统以及机

    自然语言处理技术(NLP)在推荐系统中的应用 原2017.06.29人工智能头条 作者: 张相於,58集团算法架构师,转转搜索推荐部负责人,负责搜索.推荐以及算法相关工作.多年来主要从事推荐系统以及机 ...

  5. Android 8.1 DisplayPowerController(二) Proximity Sensor的亮灭屏

    概述 P-Sensor亮屏和按Power键亮屏流程还是有些不同之处,如开始调用位置.PowerManagerService中的流程等,由于在平常遇到过许多PSensor亮屏相关Bug,因此这里独立地进 ...

  6. Android Proximity Sensor近距离传感器P-Sensor

    好文章: Android 4.4中的距离/接近传感器 P-sensor(一) https://blog.csdn.net/kongjianjian1988/article/details/435248 ...

  7. RK3288获取摄像头的Sensor ID【原创】

    平台信息: 内核:linux3.0.68  系统:android/android6.0 平台:RK3288 作者:庄泽彬(欢迎转载,请注明作者) 邮箱:2760715357@qq.com 说明:通过I ...

  8. 人工智能 | ShowMeAI资讯日报 #2022.06.18

    ShowMeAI日报系列全新升级!覆盖AI人工智能 工具&框架 | 项目&代码 | 博文&分享 | 数据&资源 | 研究&论文 等方向.点击查看 历史文章列表, ...

  9. 最新青龙面板一键搭建及拉库脚本教程----JD挂机一体化平台搭建之篇一【2022.11.29】

    实际搭建效果(上车地址):http://jdbean.tk​​​​​​ QQ机器人搭建效果 ,可以发送"菜单"."登录"."查询"等指令 可 ...

最新文章

  1. 我的第一个用Hibernate框架写的小例子
  2. 人工智能技术结合制造业,是学术研究还是落地方案?!
  3. 小程序二级页面tabbar_小程序页面推广踩坑记
  4. es6 async函数与其他异步处理方法的比较
  5. ZooKeeper 到底解决了什么问题?
  6. Centos7---1708 Linux上从零开始安装mysql
  7. ENVI5.3.1使用Landsat 8影像进行灰度分割(密度分割)
  8. 人民币金额大写转小写
  9. 图像特征点匹配,SIFT及SURF算法的原理及尽量抛开数学问题的浅析(含示例程序,基于VS2013,OpenCV_2.49)
  10. RL78平台开发注意点
  11. 小学计算机的一些课题,小学计算机课题研究价值主要体现在什么方面
  12. 移动端开发入门--基础知识
  13. Layui数据表格的引用
  14. 有限视图(Limited View)断层重建--CasRedSCAN论文阅读
  15. PC后台管理( 基于图形化界面自动安装教程)
  16. AIGC和ChatGPT的区别
  17. 【一周头条盘点】中国软件网(2017.1.2~2017.1.5)
  18. JIRA 从低版本升级到高版本(3.6.2-6.0.8)
  19. 农民伯伯android,[同人]墨水儿哥哥乡下小山村的农民伯伯生活.avi
  20. Linux-看完这篇Linux基本的操作就会了(转)

热门文章

  1. 推广、策划、运营都在用这些工具,不知道就太out了
  2. 格兰杰因果 Granger causality
  3. Linux下RTL8723BE无线网卡驱动问题解决方法(转载)
  4. rtl8723be无线网卡不稳定
  5. 英文版xp系统下载ghost xp sp3英文版(双语纯净版、可随意转换)
  6. 宝付大叔的家书,满满的父爱
  7. div设置为可获取焦点并且判断是否已获取焦点的方法
  8. 安卓中关于图片的类型
  9. 人人都道RAZ好,我读了400多本之后,才明白哪里好
  10. 浅谈统计检验效能和FDR