我正在构建一个应用程序,其中使用接近传感器检测物体离屏幕的距离很近,并且在我打开或关闭屏幕的时候。 接近传感器可以正常工作,但是在一分钟后接近传感器停止工作,并且我无法检测到物体靠近或远离移动屏幕。 在注册接近传感器后,当我打开谷歌地图(这也是我的应用程序的一部分)时,接近传感器立即停止工作。我真的不明白为什么会这样。
public class ScreenOnOff extends AppCompatActivity {
Button btn_on,btn_off;
SensorManager mySensorManager;
Sensor myProximitySensor;
private PowerManager powerManager;
private PowerManager.WakeLock wakeLock;
private int field = 0x00000020;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_screen_on_off);
btn_on = findViewById(R.id.sensor_on);
btn_off = findViewById(R.id.sensor_off);
mySensorManager = (SensorManager)getSystemService(Context.SENSOR_SERVICE);
myProximitySensor = mySensorManager.getDefaultSensor(
Sensor.TYPE_PROXIMITY);
try {
// Yeah, this is hidden field.
field = PowerManager.class.getClass().getField("PROXIMITY_SCREEN_OFF_WAKE_LOCK").getInt(null);
} catch (Throwable ignored) {
}
powerManager = (PowerManager) getSystemService(POWER_SERVICE);
wakeLock = powerManager.newWakeLock(field, getLocalClassName());
btn_on.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if (myProximitySensor == null) {
Toast.makeText(ScreenOnOff.this, "sensor not available", Toast.LENGTH_SHORT).show();
} else {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
mySensorManager.registerListener(proximitySensorEventListener, myProximitySensor,
SensorManager.SENSOR_DELAY_NORMAL);
}
Toast.makeText(ScreenOnOff.this, "Enable autolock mode", Toast.LENGTH_SHORT).show();
}
}
});
btn_off.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
mySensorManager.unregisterListener(proximitySensorEventListener, myProximitySensor);
Toast.makeText(ScreenOnOff.this, "Disable autolock mode", Toast.LENGTH_SHORT).show();
}
});
}
SensorEventListener proximitySensorEventListener
= new SensorEventListener() {
@Override
public void onAccuracyChanged(Sensor sensor, int accuracy) {
}
@Override
public void onSensorChanged(SensorEvent event) {
// TODO Auto-generated method stub
if (event.sensor.getType() == Sensor.TYPE_PROXIMITY) {
if (event.values[0] == 0) {
if(!wakeLock.isHeld()) {
wakeLock.acquire();
Log.d("screenvalue:", String.valueOf(event.values[0]));
}
} else {
if(wakeLock.isHeld()){
wakeLock.release();
}
}
}
}
};
}
答案 0 :(得分:0)
尝试这种方法:
public class ScreenOnOff extends AppCompatActivity implements SensorEventListener {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_screen_on_off);
....
btn_on.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if (myProximitySensor == null) {
Toast.makeText(ScreenOnOff.this, "sensor not available", Toast.LENGTH_SHORT).show();
} else {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
mySensorManager.registerListener(ScreenOnOff.this, myProximitySensor,
SensorManager.SENSOR_DELAY_NORMAL);
}
Toast.makeText(ScreenOnOff.this, "Enable autolock mode", Toast.LENGTH_SHORT).show();
}
}
});
btn_off.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
mySensorManager.unregisterListener(ScreenOnOff.this, myProximitySensor);
Toast.makeText(ScreenOnOff.this, "Disable autolock mode", Toast.LENGTH_SHORT).show();
}
});
}
@Override
public void onAccuracyChanged(Sensor sensor, int accuracy) {
}
@Override
public void onSensorChanged(SensorEvent event) {
// TODO Auto-generated method stub
if (event.sensor.getType() == Sensor.TYPE_PROXIMITY) {
if (event.values[0] == 0) {
if(!wakeLock.isHeld()) {
wakeLock.acquire();
Log.d("screenvalue:", String.valueOf(event.values[0]));
}
} else {
if(wakeLock.isHeld()){
wakeLock.release();
}
}
}
}
}
但是请记住,这是在onResume
中注册监听器并在onPause
活动中取消注册监听器的更好方法。 (使用适当的布尔值控制注册)