传感器编程
Android手机发展到今天,已经远远超出原来“打电话”的基本功能。现代的Android手机作为一个移动计算设备,不仅能够浏览网络,播放多媒体文件,还带有大量传感器,如磁场,加速度等。手机厂商为这些传感器提供了驱动程序,Android系统提供了这些驱动程序的API。
传感器就像人类的感官一样,能够接收数据,交由处理器分析。Android中使用传感器的步骤都是通用的,无非就是注册传感器并设置一些参数,然后设置监听器,编写如何处理数据的回调函数。
获取所有可用传感器
package com.gacfox.sensordemo;
import android.hardware.Sensor;
import android.hardware.SensorManager;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import java.util.List;
public class MainActivity extends AppCompatActivity
{
private SensorManager sensorManager;
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
sensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);
List<Sensor> sensorList = sensorManager.getSensorList(Sensor.TYPE_ALL);
for(Sensor sensor : sensorList)
{
Log.v("sensorDemo", "sensorName:" + sensor.getName());
}
}
}
上面代码可以查看手机当前支持哪些传感器。
输出结果:
07-16 13:17:02.104 1668-1668/com.gacfox.sensordemo V/sensorDemo: sensorName:LIS3DSH Accelerometer
07-16 13:17:02.104 1668-1668/com.gacfox.sensordemo V/sensorDemo: sensorName:AKM Calibration Lib
07-16 13:17:02.104 1668-1668/com.gacfox.sensordemo V/sensorDemo: sensorName:AK09911 Magnetometer Uncalibrated
07-16 13:17:02.104 1668-1668/com.gacfox.sensordemo V/sensorDemo: sensorName:L3GD20 Gyroscope
07-16 13:17:02.104 1668-1668/com.gacfox.sensordemo V/sensorDemo: sensorName:L3GD20 Gyroscope Uncalibrated
07-16 13:17:02.104 1668-1668/com.gacfox.sensordemo V/sensorDemo: sensorName:RPR0521 Proximity & Light
07-16 13:17:02.104 1668-1668/com.gacfox.sensordemo V/sensorDemo: sensorName:RPR0521 Proximity & Light
07-16 13:17:02.104 1668-1668/com.gacfox.sensordemo V/sensorDemo: sensorName:Gravity
07-16 13:17:02.104 1668-1668/com.gacfox.sensordemo V/sensorDemo: sensorName:Linear Acceleration
07-16 13:17:02.104 1668-1668/com.gacfox.sensordemo V/sensorDemo: sensorName:Rotation Vector
07-16 13:17:02.104 1668-1668/com.gacfox.sensordemo V/sensorDemo: sensorName:Step Detector
07-16 13:17:02.104 1668-1668/com.gacfox.sensordemo V/sensorDemo: sensorName:Step Counter
07-16 13:17:02.104 1668-1668/com.gacfox.sensordemo V/sensorDemo: sensorName:Significant Motion Detector
07-16 13:17:02.104 1668-1668/com.gacfox.sensordemo V/sensorDemo: sensorName:Game Rotation Vector
07-16 13:17:02.104 1668-1668/com.gacfox.sensordemo V/sensorDemo: sensorName:Geomagnetic Rotation Vector
07-16 13:17:02.104 1668-1668/com.gacfox.sensordemo V/sensorDemo: sensorName:Orientation
07-16 13:17:02.104 1668-1668/com.gacfox.sensordemo V/sensorDemo: sensorName:AMD
07-16 13:17:02.104 1668-1668/com.gacfox.sensordemo V/sensorDemo: sensorName:RMD
07-16 13:17:02.104 1668-1668/com.gacfox.sensordemo V/sensorDemo: sensorName:Basic Gestures
07-16 13:17:02.104 1668-1668/com.gacfox.sensordemo V/sensorDemo: sensorName:Facing
07-16 13:17:02.104 1668-1668/com.gacfox.sensordemo V/sensorDemo: sensorName:Tilt
07-16 13:17:02.104 1668-1668/com.gacfox.sensordemo V/sensorDemo: sensorName:Pedometer
07-16 13:17:02.104 1668-1668/com.gacfox.sensordemo V/sensorDemo: sensorName:PEDESTRIAN-ACTIVITY-MONITOR
07-16 13:17:02.104 1668-1668/com.gacfox.sensordemo V/sensorDemo: sensorName:Motion Accel
例子:使用加速度传感器
package com.gacfox.sensordemo;
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.TextView;
import java.text.DecimalFormat;
public class MainActivity extends AppCompatActivity implements SensorEventListener
{
private SensorManager sensorManager;
private TextView textView;
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
textView = (TextView) findViewById(R.id.tv);
sensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);
}
@Override
protected void onResume()
{
super.onResume();
sensorManager.registerListener(this, sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER), SensorManager.SENSOR_DELAY_UI);
}
@Override
protected void onStop()
{
sensorManager.unregisterListener(this);
super.onStop();
}
@Override
public void onSensorChanged(SensorEvent sensorEvent)
{
float[] values = sensorEvent.values;
DecimalFormat decimalFormat=new DecimalFormat("####.00");
textView.setText("X:" + decimalFormat.format(values[0]) + " Y:" + decimalFormat.format(values[1]) + " Z:" + decimalFormat.format(values[2]));
}
@Override
public void onAccuracyChanged(Sensor sensor, int i)
{
}
}
注意:建议在onResume()
中注册传感器的监听器,在onStop()
中取消注册监听器。要求传感器一直捕获数据是比较占用资源的。
作者:Gacfox
版权声明:本网站为非盈利性质,文章如非特殊说明均为原创,版权遵循知识共享协议CC BY-NC-ND 4.0进行授权,转载必须署名,禁止用于商业目的或演绎修改后转载。