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后会进入灭屏休眠,移开之后会唤醒亮屏幕。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值