资讯详情

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

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); 

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

标签: 3p2261接近传感器

锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

锐单商城 - 一站式电子元器件采购平台