我是靠谱客的博主 秀丽画板,最近开发中收集的这篇文章主要介绍2022-06-29 AndroidR 获取接近传感器Proximity Sensor的信号,休眠和唤醒。,觉得挺不错的,现在分享给大家,希望可以做个参考。
概述
一、底层的驱动在这里不提,只关心上层。
二、实现AndroidR 获取接近传感器Proximity Sensor的信号,休眠和唤醒的方法:获取SENSOR_SERVICE服务,侦听Sensor事件。
三、修改的代码,在frameworksbaseservicescorejavacomandroidserverpolicyPhoneWindowManager.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=%dn",__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=%dn",__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的信号,休眠和唤醒。的全部内容,希望文章能够帮你解决2022-06-29 AndroidR 获取接近传感器Proximity Sensor的信号,休眠和唤醒。所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复