Proximity sensor stop working after one minute

0

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();
                    }
                }
            }
        }
    };
}
android
asked on Stack Overflow Jul 2, 2019 by p.k.

1 Answer

0

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)

answered on Stack Overflow Jul 2, 2019 by Sdghasemi

User contributions licensed under CC BY-SA 3.0