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