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();
                    }
                }
            }
        }
    };
}
 p.k.
 p.k.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)
 Sdghasemi
 SdghasemiUser contributions licensed under CC BY-SA 3.0