public abstract class SensorManager extends Object
SensorManager lets you access the device's sensors
. Get an instance of this class by calling
Context.getSystemService()
with the argument
Context.SENSOR_SERVICE
.
Always make sure to disable sensors you don't need, especially when your activity is paused. Failing to do so can drain the battery in just a few hours. Note that the system will not disable sensors automatically when the screen turns off.
public class SensorActivity extends Activity, implements SensorEventListener { private final SensorManager mSensorManager; private final Sensor mAccelerometer; public SensorActivity() { mSensorManager = (SensorManager)getSystemService(SENSOR_SERVICE); mAccelerometer = mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER); } protected void onResume() { super.onResume(); mSensorManager.registerListener(this, mAccelerometer, SensorManager.SENSOR_DELAY_NORMAL); } protected void onPause() { super.onPause(); mSensorManager.unregisterListener(this); } public void onAccuracyChanged(Sensor sensor, int accuracy) { } public void onSensorChanged(SensorEvent event) { } }
SensorEventListener
,
SensorEvent
,
Sensor
Modifier and Type | Class and Description |
---|---|
protected static class |
SensorManager.SensorEventPool
Sensor event pool implementation.
|
Modifier and Type | Field and Description |
---|---|
static int |
AXIS_MINUS_X
|
static int |
AXIS_MINUS_Y
|
static int |
AXIS_MINUS_Z
|
static int |
AXIS_X
|
static int |
AXIS_Y
|
static int |
AXIS_Z
|
static int |
DATA_X
Deprecated.
use
Sensor instead. |
static int |
DATA_Y
Deprecated.
use
Sensor instead. |
static int |
DATA_Z
Deprecated.
use
Sensor instead. |
static float |
GRAVITY_DEATH_STAR_I
Gravity (estimate) on the first Death Star in Empire units (m/s^2)
|
static float |
GRAVITY_EARTH
Earth's gravity in SI units (m/s^2)
|
static float |
GRAVITY_JUPITER
Jupiter's gravity in SI units (m/s^2)
|
static float |
GRAVITY_MARS
Mars' gravity in SI units (m/s^2)
|
static float |
GRAVITY_MERCURY
Mercury's gravity in SI units (m/s^2)
|
static float |
GRAVITY_MOON
The Moon's gravity in SI units (m/s^2)
|
static float |
GRAVITY_NEPTUNE
Neptune's gravity in SI units (m/s^2)
|
static float |
GRAVITY_PLUTO
Pluto's gravity in SI units (m/s^2)
|
static float |
GRAVITY_SATURN
Saturn's gravity in SI units (m/s^2)
|
static float |
GRAVITY_SUN
Sun's gravity in SI units (m/s^2)
|
static float |
GRAVITY_THE_ISLAND
Gravity on the island
|
static float |
GRAVITY_URANUS
Uranus' gravity in SI units (m/s^2)
|
static float |
GRAVITY_VENUS
Venus' gravity in SI units (m/s^2)
|
static float |
LIGHT_CLOUDY
luminance under a cloudy sky in lux
|
static float |
LIGHT_FULLMOON
luminance at night with full moon in lux
|
static float |
LIGHT_NO_MOON
luminance at night with no moon in lux
|
static float |
LIGHT_OVERCAST
luminance under an overcast sky in lux
|
static float |
LIGHT_SHADE
luminance in shade in lux
|
static float |
LIGHT_SUNLIGHT
luminance of sunlight in lux
|
static float |
LIGHT_SUNLIGHT_MAX
Maximum luminance of sunlight in lux
|
static float |
LIGHT_SUNRISE
luminance at sunrise in lux
|
static float |
MAGNETIC_FIELD_EARTH_MAX
Maximum magnetic field on Earth's surface
|
static float |
MAGNETIC_FIELD_EARTH_MIN
Minimum magnetic field on Earth's surface
|
static float |
PRESSURE_STANDARD_ATMOSPHERE
Standard atmosphere, or average sea-level pressure in hPa (millibar)
|
static int |
RAW_DATA_INDEX
Deprecated.
use
Sensor instead. |
static int |
RAW_DATA_X
Deprecated.
use
Sensor instead. |
static int |
RAW_DATA_Y
Deprecated.
use
Sensor instead. |
static int |
RAW_DATA_Z
Deprecated.
use
Sensor instead. |
static int |
SENSOR_ACCELEROMETER
Deprecated.
use
Sensor instead. |
static int |
SENSOR_ALL
Deprecated.
use
Sensor instead. |
static int |
SENSOR_DELAY_FASTEST
get sensor data as fast as possible
|
static int |
SENSOR_DELAY_GAME
rate suitable for games
|
static int |
SENSOR_DELAY_NORMAL
rate (default) suitable for screen orientation changes
|
static int |
SENSOR_DELAY_UI
rate suitable for the user interface
|
static int |
SENSOR_LIGHT
Deprecated.
use
Sensor instead. |
static int |
SENSOR_MAGNETIC_FIELD
Deprecated.
use
Sensor instead. |
static int |
SENSOR_MAX
Deprecated.
use
Sensor instead. |
static int |
SENSOR_MIN
Deprecated.
use
Sensor instead. |
static int |
SENSOR_ORIENTATION
Deprecated.
use
Sensor instead. |
static int |
SENSOR_ORIENTATION_RAW
Deprecated.
use
Sensor instead. |
static int |
SENSOR_PROXIMITY
Deprecated.
use
Sensor instead. |
static int |
SENSOR_STATUS_ACCURACY_HIGH
This sensor is reporting data with maximum accuracy
|
static int |
SENSOR_STATUS_ACCURACY_LOW
This sensor is reporting data with low accuracy, calibration with the
environment is needed
|
static int |
SENSOR_STATUS_ACCURACY_MEDIUM
This sensor is reporting data with an average level of accuracy,
calibration with the environment may improve the readings
|
static int |
SENSOR_STATUS_UNRELIABLE
The values returned by this sensor cannot be trusted, calibration is
needed or the environment doesn't allow readings
|
static int |
SENSOR_TEMPERATURE
Deprecated.
use
Sensor instead. |
static int |
SENSOR_TRICORDER
Deprecated.
use
Sensor instead. |
static float |
STANDARD_GRAVITY
Standard gravity (g) on Earth.
|
protected static String |
TAG |
Constructor and Description |
---|
SensorManager() |
Modifier and Type | Method and Description |
---|---|
static float |
getAltitude(float p0,
float p)
Computes the Altitude in meters from the atmospheric pressure and the
pressure at sea level.
|
static void |
getAngleChange(float[] angleChange,
float[] R,
float[] prevR)
Helper function to compute the angle change between two rotation matrices.
|
Sensor |
getDefaultSensor(int type)
Use this method to get the default sensor for a given type.
|
protected abstract List<Sensor> |
getFullSensorList()
Gets the full list of sensors that are available.
|
static float |
getInclination(float[] I)
Computes the geomagnetic inclination angle in radians from the
inclination matrix I returned by
getRotationMatrix(float[], float[], float[], float[]) . |
static float[] |
getOrientation(float[] R,
float[] values)
Computes the device's orientation based on the rotation matrix.
|
static void |
getQuaternionFromVector(float[] Q,
float[] rv)
Helper function to convert a rotation vector to a normalized quaternion.
|
static boolean |
getRotationMatrix(float[] R,
float[] I,
float[] gravity,
float[] geomagnetic)
Computes the inclination matrix I as well as the rotation matrix
R transforming a vector from the device coordinate system to the
world's coordinate system which is defined as a direct orthonormal basis,
where:
|
static void |
getRotationMatrixFromVector(float[] R,
float[] rotationVector)
Helper function to convert a rotation vector to a rotation matrix.
|
List<Sensor> |
getSensorList(int type)
Use this method to get the list of available sensors of a certain type.
|
int |
getSensors()
Deprecated.
This method is deprecated, use
getSensorList(int) instead |
boolean |
registerListener(SensorEventListener listener,
Sensor sensor,
int rate)
Registers a
SensorEventListener for the given sensor. |
boolean |
registerListener(SensorEventListener listener,
Sensor sensor,
int rate,
Handler handler)
Registers a
SensorEventListener for the given sensor. |
boolean |
registerListener(SensorListener listener,
int sensors)
Deprecated.
This method is deprecated, use
registerListener(SensorEventListener, Sensor, int)
instead. |
boolean |
registerListener(SensorListener listener,
int sensors,
int rate)
Deprecated.
This method is deprecated, use
registerListener(SensorEventListener, Sensor, int)
instead. |
protected abstract boolean |
registerListenerImpl(SensorEventListener listener,
Sensor sensor,
int delay,
Handler handler) |
static boolean |
remapCoordinateSystem(float[] inR,
int X,
int Y,
float[] outR)
Rotates the supplied rotation matrix so it is expressed in a different
coordinate system.
|
void |
unregisterListener(SensorEventListener listener)
Unregisters a listener for all sensors.
|
void |
unregisterListener(SensorEventListener listener,
Sensor sensor)
Unregisters a listener for the sensors with which it is registered.
|
void |
unregisterListener(SensorListener listener)
Deprecated.
This method is deprecated, use
unregisterListener(SensorEventListener)
instead. |
void |
unregisterListener(SensorListener listener,
int sensors)
Deprecated.
This method is deprecated, use
unregisterListener(SensorEventListener, Sensor)
instead. |
protected abstract void |
unregisterListenerImpl(SensorEventListener listener,
Sensor sensor) |
protected static final String TAG
@Deprecated public static final int SENSOR_ORIENTATION
Sensor
instead.SensorListener
for more details.@Deprecated public static final int SENSOR_ACCELEROMETER
Sensor
instead.SensorListener
for more details.@Deprecated public static final int SENSOR_TEMPERATURE
Sensor
instead.SensorListener
for more details.@Deprecated public static final int SENSOR_MAGNETIC_FIELD
Sensor
instead.SensorListener
for more details.@Deprecated public static final int SENSOR_LIGHT
Sensor
instead.SensorListener
for more details.@Deprecated public static final int SENSOR_PROXIMITY
Sensor
instead.SensorListener
for more details.@Deprecated public static final int SENSOR_TRICORDER
Sensor
instead.SensorListener
for more details.@Deprecated public static final int SENSOR_ORIENTATION_RAW
Sensor
instead.SensorListener
for more details.@Deprecated public static final int SENSOR_ALL
Sensor
instead.@Deprecated public static final int SENSOR_MIN
Sensor
instead.@Deprecated public static final int SENSOR_MAX
Sensor
instead.@Deprecated public static final int DATA_X
Sensor
instead.SensorListener.onSensorChanged(int, float[])
@Deprecated public static final int DATA_Y
Sensor
instead.SensorListener.onSensorChanged(int, float[])
@Deprecated public static final int DATA_Z
Sensor
instead.SensorListener.onSensorChanged(int, float[])
@Deprecated public static final int RAW_DATA_INDEX
Sensor
instead.SensorListener.onSensorChanged(int, float[])
@Deprecated public static final int RAW_DATA_X
Sensor
instead.SensorListener.onSensorChanged(int, float[])
@Deprecated public static final int RAW_DATA_Y
Sensor
instead.SensorListener.onSensorChanged(int, float[])
@Deprecated public static final int RAW_DATA_Z
Sensor
instead.SensorListener.onSensorChanged(int, float[])
public static final float STANDARD_GRAVITY
public static final float GRAVITY_SUN
public static final float GRAVITY_MERCURY
public static final float GRAVITY_VENUS
public static final float GRAVITY_EARTH
public static final float GRAVITY_MOON
public static final float GRAVITY_MARS
public static final float GRAVITY_JUPITER
public static final float GRAVITY_SATURN
public static final float GRAVITY_URANUS
public static final float GRAVITY_NEPTUNE
public static final float GRAVITY_PLUTO
public static final float GRAVITY_DEATH_STAR_I
public static final float GRAVITY_THE_ISLAND
public static final float MAGNETIC_FIELD_EARTH_MAX
public static final float MAGNETIC_FIELD_EARTH_MIN
public static final float PRESSURE_STANDARD_ATMOSPHERE
public static final float LIGHT_SUNLIGHT_MAX
public static final float LIGHT_SUNLIGHT
public static final float LIGHT_SHADE
public static final float LIGHT_OVERCAST
public static final float LIGHT_SUNRISE
public static final float LIGHT_CLOUDY
public static final float LIGHT_FULLMOON
public static final float LIGHT_NO_MOON
public static final int SENSOR_DELAY_FASTEST
public static final int SENSOR_DELAY_GAME
public static final int SENSOR_DELAY_UI
public static final int SENSOR_DELAY_NORMAL
public static final int SENSOR_STATUS_UNRELIABLE
public static final int SENSOR_STATUS_ACCURACY_LOW
public static final int SENSOR_STATUS_ACCURACY_MEDIUM
public static final int SENSOR_STATUS_ACCURACY_HIGH
public static final int AXIS_X
public static final int AXIS_Y
public static final int AXIS_Z
public static final int AXIS_MINUS_X
public static final int AXIS_MINUS_Y
public static final int AXIS_MINUS_Z
protected abstract List<Sensor> getFullSensorList()
@Deprecated public int getSensors()
getSensorList(int)
insteadpublic List<Sensor> getSensorList(int type)
Sensor.TYPE_ALL
to get all the
sensors.type
- of sensors requestedgetDefaultSensor(int)
,
Sensor
public Sensor getDefaultSensor(int type)
getSensorList
.type
- of sensors requestedgetSensorList(int)
,
Sensor
@Deprecated public boolean registerListener(SensorListener listener, int sensors)
registerListener(SensorEventListener, Sensor, int)
instead.listener
- sensor listener objectsensors
- a bit masks of the sensors to register totrue
if the sensor is supported and successfully
enabled@Deprecated public boolean registerListener(SensorListener listener, int sensors, int rate)
registerListener(SensorEventListener, Sensor, int)
instead.listener
- sensor listener objectsensors
- a bit masks of the sensors to register torate
- rate of events. This is only a hint to the system. events may be
received faster or slower than the specified rate. Usually events
are received faster. The value must be one of
SENSOR_DELAY_NORMAL
, SENSOR_DELAY_UI
,
SENSOR_DELAY_GAME
, or SENSOR_DELAY_FASTEST
.true
if the sensor is supported and successfully
enabled@Deprecated public void unregisterListener(SensorListener listener)
unregisterListener(SensorEventListener)
instead.listener
- a SensorListener object@Deprecated public void unregisterListener(SensorListener listener, int sensors)
unregisterListener(SensorEventListener, Sensor)
instead.listener
- a SensorListener objectsensors
- a bit masks of the sensors to unregister frompublic void unregisterListener(SensorEventListener listener, Sensor sensor)
listener
- a SensorEventListener objectsensor
- the sensor to unregister fromunregisterListener(SensorEventListener)
,
registerListener(SensorEventListener, Sensor, int)
public void unregisterListener(SensorEventListener listener)
listener
- a SensorListener objectunregisterListener(SensorEventListener, Sensor)
,
registerListener(SensorEventListener, Sensor, int)
protected abstract void unregisterListenerImpl(SensorEventListener listener, Sensor sensor)
public boolean registerListener(SensorEventListener listener, Sensor sensor, int rate)
SensorEventListener
for the given sensor.listener
- A SensorEventListener
object.sensor
- The Sensor
to register to.rate
- The rate sensor events
are
delivered at. This is only a hint to the system. Events may be
received faster or slower than the specified rate. Usually events
are received faster. The value must be one of
SENSOR_DELAY_NORMAL
, SENSOR_DELAY_UI
,
SENSOR_DELAY_GAME
, or SENSOR_DELAY_FASTEST
or, the desired delay between events in microsecond.true
if the sensor is supported and successfully
enabled.registerListener(SensorEventListener, Sensor, int, Handler)
,
unregisterListener(SensorEventListener)
,
unregisterListener(SensorEventListener, Sensor)
public boolean registerListener(SensorEventListener listener, Sensor sensor, int rate, Handler handler)
SensorEventListener
for the given sensor.listener
- A SensorEventListener
object.sensor
- The Sensor
to register to.rate
- The rate sensor events
are
delivered at. This is only a hint to the system. Events may be
received faster or slower than the specified rate. Usually events
are received faster. The value must be one of
SENSOR_DELAY_NORMAL
, SENSOR_DELAY_UI
,
SENSOR_DELAY_GAME
, or SENSOR_DELAY_FASTEST
.
or, the desired delay between events in microsecond.handler
- The Handler
the
sensor events
will be
delivered to.registerListener(SensorEventListener, Sensor, int)
,
unregisterListener(SensorEventListener)
,
unregisterListener(SensorEventListener, Sensor)
protected abstract boolean registerListenerImpl(SensorEventListener listener, Sensor sensor, int delay, Handler handler)
public static boolean getRotationMatrix(float[] R, float[] I, float[] gravity, float[] geomagnetic)
Computes the inclination matrix I as well as the rotation matrix R transforming a vector from the device coordinate system to the world's coordinate system which is defined as a direct orthonormal basis, where:
By definition:
[0 0 g] = R * gravity (g = magnitude of gravity)
[0 m 0] = I * R * geomagnetic (m = magnitude of geomagnetic field)
R is the identity matrix when the device is aligned with the world's coordinate system, that is, when the device's X axis points toward East, the Y axis points to the North Pole and the device is facing the sky.
I is a rotation matrix transforming the geomagnetic vector into
the same coordinate space as gravity (the world's coordinate space).
I is a simple rotation around the X axis. The inclination angle in
radians can be computed with getInclination(float[])
.
Each matrix is returned either as a 3x3 or 4x4 row-major matrix depending on the length of the passed array:
If the array length is 16:
/ M[ 0] M[ 1] M[ 2] M[ 3] \ | M[ 4] M[ 5] M[ 6] M[ 7] | | M[ 8] M[ 9] M[10] M[11] | \ M[12] M[13] M[14] M[15] /This matrix is ready to be used by OpenGL ES's
glLoadMatrixf(float[], int)
.
Note that because OpenGL matrices are column-major matrices you must transpose the matrix before using it. However, since the matrix is a rotation matrix, its transpose is also its inverse, conveniently, it is often the inverse of the rotation that is needed for rendering; it can therefore be used with OpenGL ES directly.
Also note that the returned matrices always have this form:
/ M[ 0] M[ 1] M[ 2] 0 \ | M[ 4] M[ 5] M[ 6] 0 | | M[ 8] M[ 9] M[10] 0 | \ 0 0 0 1 /
If the array length is 9:
/ M[ 0] M[ 1] M[ 2] \ | M[ 3] M[ 4] M[ 5] | \ M[ 6] M[ 7] M[ 8] /
The inverse of each matrix can be computed easily by taking its transpose.
The matrices returned by this function are meaningful only when the device is not free-falling and it is not close to the magnetic north. If the device is accelerating, or placed into a strong magnetic field, the returned matrices may be inaccurate.
R
- is an array of 9 floats holding the rotation matrix R when
this function returns. R can be null.
I
- is an array of 9 floats holding the rotation matrix I when
this function returns. I can be null.
gravity
- is an array of 3 floats containing the gravity vector expressed in
the device's coordinate. You can simply use the
values
returned by a
SensorEvent
of a
Sensor
of type
TYPE_ACCELEROMETER
.
geomagnetic
- is an array of 3 floats containing the geomagnetic vector
expressed in the device's coordinate. You can simply use the
values
returned by a
SensorEvent
of a
Sensor
of type
TYPE_MAGNETIC_FIELD
.true
on success, false
on failure (for
instance, if the device is in free fall). On failure the output
matrices are not modified.getInclination(float[])
,
getOrientation(float[], float[])
,
remapCoordinateSystem(float[], int, int, float[])
public static float getInclination(float[] I)
getRotationMatrix(float[], float[], float[], float[])
.I
- inclination matrix see getRotationMatrix(float[], float[], float[], float[])
.getRotationMatrix(float[], float[], float[], float[])
,
getOrientation(float[], float[])
,
GeomagneticField
public static boolean remapCoordinateSystem(float[] inR, int X, int Y, float[] outR)
Rotates the supplied rotation matrix so it is expressed in a different
coordinate system. This is typically used when an application needs to
compute the three orientation angles of the device (see
getOrientation(float[], float[])
) in a different coordinate system.
When the rotation matrix is used for drawing (for instance with OpenGL
ES), it usually doesn't need to be transformed by this function,
unless the screen is physically rotated, in which case you can use
Display.getRotation()
to
retrieve the current rotation of the screen. Note that because the user
is generally free to rotate their screen, you often should consider the
rotation in deciding the parameters to use here.
Examples:
remapCoordinateSystem(inR, AXIS_X, AXIS_Z, outR);
Surface.ROTATION_90
:
remapCoordinateSystem(inR, AXIS_Y, AXIS_MINUS_X, outR);
getOrientation(float[], float[])
). If the rotation matrix is also used
for rendering, it may not need to be transformed, for instance if your
Activity
is running in landscape mode.
Since the resulting coordinate system is orthonormal, only two axes need to be specified.
inR
- the rotation matrix to be transformed. Usually it is the matrix
returned by getRotationMatrix(float[], float[], float[], float[])
.X
- defines on which world axis and direction the X axis of the device
is mapped.Y
- defines on which world axis and direction the Y axis of the device
is mapped.outR
- the transformed rotation matrix. inR and outR can be the same
array, but it is not recommended for performance reason.true
on success. false
if the input
parameters are incorrect, for instance if X and Y define the same
axis. Or if inR and outR don't have the same length.getRotationMatrix(float[], float[], float[], float[])
public static float[] getOrientation(float[] R, float[] values)
When it returns, the array values is filled with the result:
The reference coordinate-system used is different from the world coordinate-system defined for the rotation matrix:
All three angles above are in radians and positive in the counter-clockwise direction.
R
- rotation matrix see getRotationMatrix(float[], float[], float[], float[])
.values
- an array of 3 floats to hold the result.getRotationMatrix(float[], float[], float[], float[])
,
GeomagneticField
public static float getAltitude(float p0, float p)
Typically the atmospheric pressure is read from a
Sensor.TYPE_PRESSURE
sensor. The pressure at sea level must be
known, usually it can be retrieved from airport databases in the
vicinity. If unknown, you can use PRESSURE_STANDARD_ATMOSPHERE
as an approximation, but absolute altitudes won't be accurate.
To calculate altitude differences, you must calculate the difference
between the altitudes at both points. If you don't know the altitude
as sea level, you can use PRESSURE_STANDARD_ATMOSPHERE
instead,
which will give good results considering the range of pressure typically
involved.
float altitude_difference =
getAltitude(SensorManager.PRESSURE_STANDARD_ATMOSPHERE, pressure_at_point2)
- getAltitude(SensorManager.PRESSURE_STANDARD_ATMOSPHERE, pressure_at_point1);
p0
- pressure at sea levelp
- atmospheric pressurepublic static void getAngleChange(float[] angleChange, float[] R, float[] prevR)
Each input matrix is either as a 3x3 or 4x4 row-major matrix depending on the length of the passed array:
If the array length is 9, then the array elements represent this matrix
/ R[ 0] R[ 1] R[ 2] \ | R[ 3] R[ 4] R[ 5] | \ R[ 6] R[ 7] R[ 8] /
If the array length is 16, then the array elements represent this matrix
/ R[ 0] R[ 1] R[ 2] R[ 3] \ | R[ 4] R[ 5] R[ 6] R[ 7] | | R[ 8] R[ 9] R[10] R[11] | \ R[12] R[13] R[14] R[15] /
R
- current rotation matrixprevR
- previous rotation matrixangleChange
- an an array of floats (z, x, and y) in which the angle change is storedpublic static void getRotationMatrixFromVector(float[] R, float[] rotationVector)
/ R[ 0] R[ 1] R[ 2] \ | R[ 3] R[ 4] R[ 5] | \ R[ 6] R[ 7] R[ 8] /If R.length == 16, the following matrix is returned:
/ R[ 0] R[ 1] R[ 2] 0 \ | R[ 4] R[ 5] R[ 6] 0 | | R[ 8] R[ 9] R[10] 0 | \ 0 0 0 1 /
rotationVector
- the rotation vector to convertR
- an array of floats in which to store the rotation matrixpublic static void getQuaternionFromVector(float[] Q, float[] rv)
rv
- the rotation vector to convertQ
- an array of floats in which to store the computed quaternion