Android proximity sensor

351 Views Asked by At

A few years (and several API's) ago I made an app that turned off the screen when the lid/cover was closed (but the app didn't go to sleep). I'm trying to do it again but I can't remember if I used the proximity sensor or Wake lock. I've been trying with the below code. If I put my finger on the sensor it fires a 'onSensorChanged' event but not if I just close the lid/cover over the sensor. Any bright ideas anyone?

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);
    }
}   
1

There are 1 best solutions below

3
Khalid Lakhani On

You need 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 (event.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*/);
        
            }
            }