Using proximity sensor in android
I want to use proximity sensor in my project. I searched for proximity sensor tutorial. And I found a sensor tutorial at http://www.vogella.com/articles/AndroidSensor/article.html#sensoroverview_manager. I tried to use proximity sensor as following code:
@Override
public void onSensorChanged(SensorEvent event)
{
if(event.sensor.getType() == Sensor.TYPE_PROXIMITY)
{
Toast.makeText(getApplicationContext(), "working", Toast.LENGTH_SHORT).show();
}
}
My Activity
is implementing SensorEventListener
. But its not working. Do I need to use any permission to use proximity sensor? Or My code is wrong for doing this stuff. Your help will be very appreciated. Thank you
I use this code:
import android.content.Context;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.Toast;
public class MainActivity extends AppCompatActivity implements SensorEventListener {
private SensorManager mSensorManager;
private Sensor mProximity;
private static final int SENSOR_SENSITIVITY = 4;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
mProximity = mSensorManager.getDefaultSensor(Sensor.TYPE_PROXIMITY);
}
@Override
protected void onResume() {
super.onResume();
mSensorManager.registerListener(this, mProximity, SensorManager.SENSOR_DELAY_NORMAL);
}
@Override
protected void onPause() {
super.onPause();
mSensorManager.unregisterListener(this);
}
@Override
public void onSensorChanged(SensorEvent event) {
if (event.sensor.getType() == Sensor.TYPE_PROXIMITY) {
if (event.values[0] >= -SENSOR_SENSITIVITY && event.values[0] <= SENSOR_SENSITIVITY) {
//near
Toast.makeText(getApplicationContext(), "near", Toast.LENGTH_SHORT).show();
} else {
//far
Toast.makeText(getApplicationContext(), "far", Toast.LENGTH_SHORT).show();
}
}
}
@Override
public void onAccuracyChanged(Sensor sensor, int accuracy) {
}
}
Also you can check this code in GitHub
The right way to use proximity sensor is via PowerManager. Forget about light sensor and use Android abstraction and already written code!
public class ProximityViaPowerManager {
private Context context;
private WakeLock proximityWakeLock;
public ProximityViaPowerManager(Context context) {
this.context = context;
}
public boolean enableProximityWakeLock() {
if (proximityWakeLock != null) {
return true;
}
PowerManager powerManager =
context.getApplicationContext().getSystemService(Context.POWER_SERVICE);
proximityWakeLock = powerManager.newWakeLock(PowerManager.PROXIMITY_SCREEN_OFF_WAKE_LOCK, TAG);
proximityWakeLock.acquire();
return true;
}
public void disableProximityWakeLock() {
if (proximityWakeLock != null) {
proximityWakeLock.release();
proximityWakeLock = null;
}
}
}
Ensure correct enable/disable capability in Android life cycle resume/pause and add the permission to manifest:
<uses-permission android:name="android.permission.WAKE_LOCK" />
you are to register your listener. In your activity:
@Override
public final void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
// Get an instance of the sensor service, and use that to get an instance of
// a particular sensor.
mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
mProximity = mSensorManager.getDefaultSensor(Sensor.TYPE_PROXIMITY);
}
@Override
protected void onResume() {
// Register a listener for the sensor.
super.onResume();
mSensorManager.registerListener(this, mProximity, SensorManager.SENSOR_DELAY_NORMAL);
}
and then in you overriden onSensorChanged() method you can do your stuff with sensor data.
Sorry if my answer is too late =)
You can follow this code which has the basic framework using which we can program any sensor.
Change this line
linearAcceleration = senseManager.getDefaultSensor(Sensor.TYPE_LINEAR_ACCELERATION);
to
proximity = senseManager.getDefaultSensor(Sensor.TYPE_PROXIMITY);