I am building a app in which using proximity sensor i detect the object is near of far from the screen and when as per that i am doing screen on or off. Proximity sensor works perfectly but after one minute proximity sensor stops working and i am not able to detect object is near or far from the mobile screen. And when after register proximity sensor, i open google map which is also a part of my application, proximity sensor stops working immediately.I am really not able to understand why this is happening.
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();
}
}
}
}
};
}
Try this approach:
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();
}
}
}
}
}
But keep in mind that it's a better approach to register your listener in onResume
and unregister it in onPause
event of your activity. (Control registration using a proper boolean)
User contributions licensed under CC BY-SA 3.0