前言:本文主要以地磁为主介绍android的传感器类型,以及使用方法,再提供一个简单的demo供新手进行测试。研究生方向主要是物联网方向,虽然刚接触不久,但也有个大致的概念,本文算是开山之作—_—,之后还是想在这里记录一下整个研究的过程,不过大部分是代码类的,一些实用的技术。大神请飘过(哪一天不说这句我就是大神了—_—!)
引用:无线定位是指利用无线电波信号的特征参数估计特定物体在某种参考系中的坐标位置。在无线定位方向,android很多传感器都是值得我们研究的,这其中就包括地磁传感器和加速度传感器等。
(参考之博文-点击打开http://www.2cto.com/kf/201501/367225.html)博文包含一些常用的传感器所检测的内容和值
1、传感器开发步骤
调用Context的getSystemService(Context.SENSOR_SERVICE)方法获取SensorManager对象。
调用SensorManager的getDefaultSensor(int type)方法来获取指定类型的传感器,见2中传感器类型的详情。
一般在Activity的onResume()方法中调用SensorManager的registerListener()为指定传感器注册监听器即可。程序可以通过实现监听器即可获取传感器传回来的数据。
SersorManager提供的注册传感器的方法为registerListener(SensorListener listener, Sensor sensor, int rate)该方法中三个参数说明如下:
listener:监听传感器事件的监听器
sensor:传感器对象
rate:指定获取传感器数据的频率
rate可以获取传感器数据的频率,支持如下几个频率值:
SENSOR_DELAY_FASTEST:最快,延迟最小。
SENSOR_DELAY_GAME:适合游戏的频率。
SENSOR_DELAY_NORMAL:正常频率
SENSOR_DELAY_UI:适合普通用户界面的频率。
2、传感器类型(int type)
SENSOR_TYPE_ACCELEROMETER 1 //加速度
SENSOR_TYPE_MAGNETIC_FIELD 2 //磁力
SENSOR_TYPE_ORIENTATION 3 //方向
SENSOR_TYPE_GYROSCOPE 4 //陀螺仪
SENSOR_TYPE_LIGHT 5 //光线感应
SENSOR_TYPE_PRESSURE 6 //压力
SENSOR_TYPE_TEMPERATURE 7 //温度
SENSOR_TYPE_PROXIMITY 8 //接近
SENSOR_TYPE_GRAVITY 9 //重力
SENSOR_TYPE_LINEAR_ACCELERATION 10//线性加速度
SENSOR_TYPE_ROTATION_VECTOR 11//旋转矢量
3、以地磁传感器为例进行测试
布局文件,主要为三个地磁的三个数据,x,y,z方向的地磁值,单位为uT:
<TextView
android:id="@+id/main_txt"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/hello_world"
android:gravity="center"
/>
<TextView
android:id="@+id/main_txt_x"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@id/main_txt"
android:text="@string/hello_world"
android:gravity="center"
/>
<TextView
android:id="@+id/main_txt_y"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@id/main_txt_x"
android:text="@string/hello_world"
android:gravity="center"
/>
<TextView
android:id="@+id/main_txt_z"
android:layout_below="@id/main_txt_y"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/hello_world"
android:gravity="center"
/>
MainActivity:
public class MainActivity extends ActionBarActivity implements SensorEventListener {//主类直接实现传感器事件监听器
//声明布局文件中的标题TextView和三个显示地磁数值的TextView
private TextView main_txt;
private TextView main_txt_x;
private TextView main_txt_y;
private TextView main_txt_z;
//声明传感器管理对象
private SensorManager sensorManger;
//声明传感器对象
private Sensor magnetic_field_sensor;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//获取到布局文件中的TextView对象
main_txt = (TextView) findViewById(R.id.main_txt);
main_txt_x = (TextView) findViewById(R.id.main_txt_x);
main_txt_y = (TextView) findViewById(R.id.main_txt_y);
main_txt_z = (TextView) findViewById(R.id.main_txt_z);
//从context中获得传感器管理对象
sensorManger = (SensorManager)getSystemService(Context.SENSOR_SERVICE);
//获得磁场传感器对象
magnetic_field_sensor = sensorManger.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD);
//注册传感器对象,此方法主要用在onResume中,此处直接在创建时使用
sensorManger.registerListener(this, magnetic_field_sensor, SensorManager.SENSOR_DELAY_NORMAL);
}
@Override
public void onAccuracyChanged(Sensor arg0, int arg1) {
// 传感器精度发生变化时,调用此方法
Toast.makeText(this, "精度发生改变", Toast.LENGTH_LONG).show();
}
@Override
public void onSensorChanged(SensorEvent arg0) {
// 传感器得到的数值
main_txt.setText("得到的地磁数值:");
main_txt_x.setText("X:"+arg0.values[0]+"");
main_txt_y.setText("Y:"+arg0.values[1]+"");
main_txt_z.setText("Z:"+arg0.values[2]+"");
}
}
效果: