Most Android phones have sensors, sensor types are direction, acceleration (gravity), light, magnetic field, distance (proximity), temperature, etc.
Direction sensor: Sensor.type_orientation
Acceleration (Gravity) Sensor: Sensor.type_accelerometer
Light sensor: Sensor.type_light
magnetic field Sensor: Sensor.type_magnetic_field
Distance (proximity) sensor: sensor.type_proximity
Temperature sensor: Sensor.type_temperature
Get some kind of sensor
Sensor sensor = Sensormanager.getdefaultsensor (Sensor.type_accelerometer);
Register for monitoring, get sensor change value
Sensormanager.registerlistener (listener, sensor, sensormanager.sensor_delay_game);
The third parameter above is the sample rate: fastest, game, normal, user interface. When an application requests a specific sample rate, it is only a recommendation to the sensor subsystem and does not guarantee that a particular sample rate is available.
Fastest: Sensormanager.sensor_delay_fastest
Minimum latency, generally not particularly sensitive handling is not recommended, this mode may cause a large consumption of mobile phone power, due to the transfer of raw data, the algorithm does not handle the game logic will affect the performance of the UI.
Game: Sensormanager.sensor_delay_game
Game latency, the majority of the most real-time high-level games are used in this category.
Normal: Sensormanager.sensor_delay_normal
Standard delay, for general puzzle or easy-level games can be used, but too low a sample rate may have some racing game with the jumping frame phenomenon.
User interface: SENSORMANAGER.SENSOR_DELAY_UI
Generally for the screen direction of automatic rotation use, relatively save energy and logic processing, general game development we do not use.
The difficulty of using the sensor is how to deal with the data and get the desired effect, which involves a lot of knowledge of mathematics and physics ...
Here's a code example that shows how to get the data for direction and field strength:
Packagecom.magnetic;ImportAndroid.hardware.Sensor;Importandroid.hardware.SensorEvent;ImportAndroid.hardware.SensorEventListener;ImportAndroid.hardware.SensorManager;ImportAndroid.os.Bundle;Importandroid.app.Activity;ImportAndroid.view.Menu;ImportAndroid.widget.TextView; Public classMainactivityextendsActivity {PrivateTextView Magneticview; PrivateTextView Orientationview; PrivateTextView Totalmageticview; PrivateSensormanager Sensormanager; PrivateMysensoreventlistener Sensoreventlistener; @Overrideprotected voidonCreate (Bundle savedinstancestate) {Super. OnCreate (savedinstancestate); Setcontentview (R.layout.activity_main); Sensoreventlistener=NewMysensoreventlistener (); Magneticview= (TextView) This. Findviewbyid (R.id.magneticview); Orientationview= (TextView) This. Findviewbyid (R.id.orientationview); Totalmageticview= (TextView) This. Findviewbyid (R.id.totalmageticview); //Get sensor ManagerSensormanager =(Sensormanager) Getsystemservice (Sensor_service); } @Overrideprotected voidOnresume () {//Get Direction sensor@SuppressWarnings ("Deprecation") Sensor Orientationsensor=sensormanager.getdefaultsensor (sensor.type_orientation); Sensormanager.registerlistener (Sensoreventlistener, Orientationsensor, sensormanager.sensor_delay_normal); //Get acceleration SensorSensor Accelerometersensor =sensormanager.getdefaultsensor (Sensor.type_magnetic_field); Sensormanager.registerlistener (Sensoreventlistener, Accelerometersensor, sensormanager.sensor_delay_normal); Super. Onresume (); } @Override Public BooleanOncreateoptionsmenu (Menu menu) {//inflate the menu; This adds items to the action bar if it is present.getmenuinflater (). Inflate (R.menu.main, menu); return true; } Private Final classMysensoreventlistenerImplementsSensoreventlistener {//can get the change value of the sensor in real-time measurement@Override Public voidonsensorchanged (Sensorevent event) {//get the value of the direction if(Event.sensor.getType () = =sensor.type_orientation) { floatx =event.values[sensormanager.data_x]; floaty =event.values[sensormanager.data_y]; floatz =Event.values[sensormanager.data_z]; Orientationview.settext ("Direction:" + x + "," + y + "," +z); } //get the value of acceleration Else if(Event.sensor.getType () = =Sensor.type_magnetic_field) { floatx =event.values[sensormanager.data_x]; floaty =event.values[sensormanager.data_y]; floatz =Event.values[sensormanager.data_z]; Magneticview.settext ("Combined magnetic field strength X, Y, Z components:" + x + "," + Y + "," +z); //calculation and magnetic field strength floatTotal= (float) (Math.sqrt (Math.pow (x,2) +math.pow (y,2) +math.pow (Z, 2))); Totalmageticview.settext ("Combined magnetic field strength:" +Total ); } } //Rewrite changes@Override Public voidOnaccuracychanged (sensor sensor,intaccuracy) { } } //pausing the capture of a sensor@Overrideprotected voidOnPause () {Sensormanager.unregisterlistener (Sensoreventlistener); Super. OnPause (); } }
<?xml version= "1.0" encoding= "Utf-8"?><tablelayout xmlns:android= "Http://schemas.android.com/apk/res/android"Android:layout_width= "Fill_parent"Android:layout_height= "Fill_parent" > <TableRow> <TextView Android:id= "@+id/orientationview"Android:text= "Direction sensor:"Android:layout_width= "Wrap_content"Android:layout_height= "Wrap_content"Android:layout_weight= "1"/> </TableRow> <TableRow> <TextView Android:id= "@+id/magneticview"Android:text= "Magnetic Sensor:"Android:layout_width= "Wrap_content"Android:layout_height= "Wrap_content"/> </TableRow> <TableRow> <TextView Android:id= "@+id/totalmageticview"Android:text= "Magnetic Strength:"Android:layout_width= "Wrap_content"Android:layout_height= "Wrap_content"/> </TableRow></TableLayout>
Android uses sensors to get the data