【问题标题】:Android proximity sensor安卓接近传感器
【发布时间】:2022-10-09 01:51:38
【问题描述】:
几年(和几个 API)前,我做了一个应用程序,当盖子/盖子关闭时关闭屏幕(但应用程序没有进入睡眠状态)。我正在尝试再做一次,但我不记得我是否使用了接近传感器或唤醒锁。我一直在尝试使用下面的代码。如果我将手指放在传感器上,它会触发“onSensorChanged”事件,但如果我只是关闭传感器上的盖子/盖子,则不会。有什么好主意吗?
public class MainActivity extends AppCompatActivity implements SensorEventListener {
private SensorManager mSensorManager;
private Sensor mProximity;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Toolbar toolbar = findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
mSensorManager = (SensorManager)getSystemService(SENSOR_SERVICE);
mProximity = mSensorManager.getDefaultSensor(Sensor.TYPE_PROXIMITY);
}
public void onAccuracyChanged(Sensor sensor, int accuracy) {
}
public void onSensorChanged(SensorEvent event) {
Toast.makeText(this,"Sensor change detected", Toast.LENGTH_SHORT).show();
}
protected void onResume() {
super.onResume();
mSensorManager.registerListener(this, mProximity, SensorManager.SENSOR_DELAY_NORMAL);
}
protected void onPause() {
super.onPause();
mSensorManager.unregisterListener(this);
}
}
【问题讨论】:
标签:
android
sensors
proximity
【解决方案1】:
您需要 PROXIMITY_SCREEN_OFF_WAKE_LOCK
public class MainActivity extends AppCompatActivity implements SensorEventListener {
private SensorManager mSensorManager;
private Sensor mProximity;
PowerManager powerManager;
PowerManager.WakeLock wakeLock;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Toolbar toolbar = findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
mSensorManager = (SensorManager)getSystemService(SENSOR_SERVICE);
mProximity = mSensorManager.getDefaultSensor(Sensor.TYPE_PROXIMITY);
powerManager = (PowerManager) getSystemService(Context.POWER_SERVICE);
wakeLock = powerManager.newWakeLock(PowerManager.PROXIMITY_SCREEN_OFF_WAKE_LOCK, "aodplus:pocket_mode");
}
public void onAccuracyChanged(Sensor sensor, int accuracy) {
}
public void onSensorChanged(SensorEvent event) {
if (sensorEvent.sensor.getType() == Sensor.TYPE_PROXIMITY) {
boolean isNear = event.values[0] < mProximity.getMaximumRange();
if(isNear){
// near
turnOffScreen();
}
else {
// far
turnOnScreen();
}
}
Toast.makeText(this,"Sensor change detected", Toast.LENGTH_SHORT).show();
}
protected void onResume() {
super.onResume();
mSensorManager.registerListener(this, mProximity, SensorManager.SENSOR_DELAY_NORMAL);
}
protected void onPause() {
super.onPause();
mSensorManager.unregisterListener(this);
}
public void turnOnScreen(){
if(wakeLock.isHeld()) wakeLock.release();
}
@TargetApi(21) //Suppress lint error for PROXIMITY_SCREEN_OFF_WAKE_LOCK
public void turnOffScreen(){
wakeLock.acquire( /*10 minutes*/);
}
}