2022-06-29 AndroidR 获取接近传感器Proximity Sensor的信号,休眠和唤醒。
一、底层的驱动在这里不提,只关心上层。
二、实现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的信号,休眠和唤醒。相关推荐
- verp之增加接近传感器(proximity sensor)
V-REP offers a very powerful and efficient way to simulate proximity sensors. The user can model alm ...
- 人工智能 | ShowMeAI资讯日报 #2022.06.29
ShowMeAI日报系列全新升级!覆盖AI人工智能 工具&框架 | 项目&代码 | 博文&分享 | 数据&资源 | 研究&论文 等方向.点击查看 历史文章列表, ...
- android g sensor,android gsensor 休眠震动唤醒功能怎么实现
一.唤醒源 设备休眠后,通过触发唤醒源使设备恢复正常工作模式.设备唤醒源有多种,对于Android设备常见的就有PowerKey.来电唤醒.Alarm唤醒等. 唤醒源的实现处于内核空间,本文重点讨论下 ...
- 自然语言处理技术(NLP)在推荐系统中的应用 原2017.06.29人工智能头条 作者: 张相於,58集团算法架构师,转转搜索推荐部负责人,负责搜索、推荐以及算法相关工作。多年来主要从事推荐系统以及机
自然语言处理技术(NLP)在推荐系统中的应用 原2017.06.29人工智能头条 作者: 张相於,58集团算法架构师,转转搜索推荐部负责人,负责搜索.推荐以及算法相关工作.多年来主要从事推荐系统以及机 ...
- Android 8.1 DisplayPowerController(二) Proximity Sensor的亮灭屏
概述 P-Sensor亮屏和按Power键亮屏流程还是有些不同之处,如开始调用位置.PowerManagerService中的流程等,由于在平常遇到过许多PSensor亮屏相关Bug,因此这里独立地进 ...
- Android Proximity Sensor近距离传感器P-Sensor
好文章: Android 4.4中的距离/接近传感器 P-sensor(一) https://blog.csdn.net/kongjianjian1988/article/details/435248 ...
- RK3288获取摄像头的Sensor ID【原创】
平台信息: 内核:linux3.0.68 系统:android/android6.0 平台:RK3288 作者:庄泽彬(欢迎转载,请注明作者) 邮箱:2760715357@qq.com 说明:通过I ...
- 人工智能 | ShowMeAI资讯日报 #2022.06.18
ShowMeAI日报系列全新升级!覆盖AI人工智能 工具&框架 | 项目&代码 | 博文&分享 | 数据&资源 | 研究&论文 等方向.点击查看 历史文章列表, ...
- 最新青龙面板一键搭建及拉库脚本教程----JD挂机一体化平台搭建之篇一【2022.11.29】
实际搭建效果(上车地址):http://jdbean.tk QQ机器人搭建效果 ,可以发送"菜单"."登录"."查询"等指令 可 ...
最新文章
- 我的第一个用Hibernate框架写的小例子
- 人工智能技术结合制造业,是学术研究还是落地方案?!
- 小程序二级页面tabbar_小程序页面推广踩坑记
- es6 async函数与其他异步处理方法的比较
- ZooKeeper 到底解决了什么问题?
- Centos7---1708 Linux上从零开始安装mysql
- ENVI5.3.1使用Landsat 8影像进行灰度分割(密度分割)
- 人民币金额大写转小写
- 图像特征点匹配,SIFT及SURF算法的原理及尽量抛开数学问题的浅析(含示例程序,基于VS2013,OpenCV_2.49)
- RL78平台开发注意点
- 小学计算机的一些课题,小学计算机课题研究价值主要体现在什么方面
- 移动端开发入门--基础知识
- Layui数据表格的引用
- 有限视图(Limited View)断层重建--CasRedSCAN论文阅读
- PC后台管理( 基于图形化界面自动安装教程)
- AIGC和ChatGPT的区别
- 【一周头条盘点】中国软件网(2017.1.2~2017.1.5)
- JIRA 从低版本升级到高版本(3.6.2-6.0.8)
- 农民伯伯android,[同人]墨水儿哥哥乡下小山村的农民伯伯生活.avi
- Linux-看完这篇Linux基本的操作就会了(转)