这段时间研究安卓上的各种传感器,然后这里做个总结
1.加速度传感器
2.磁场传感器
3.方向传感器
4.陀螺仪传感器
5.重力传感器
6.线性加速度传感器
7.温度传感器
8.光线传感器
9.距离传感器
10.压力传感器
11.计步传感器
首先先查看测试的安卓机拥有的传感器
这里先初始化一个SensorManager的对象,然后把所有支持的sensor类型打印出来看看。
SensorManager mSensorManager; List我使用的是小米4,下面是该手机的sensor信息,接下来会一个个分析sensorList; // 实例化传感器管理者 mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE); // 得到设置支持的所有传感器的List sensorList = mSensorManager.getSensorList(Sensor.TYPE_ALL); List sensorNameList = new ArrayList (); for (Sensor sensor : sensorList) { Log.d(TAG, "onResume: "+sensor.getName()); }
1.加速度传感器
在这这之前先了解一下手机传感器世界的三维坐标
首先先创建3个textView来显示三个方向上的加速度啦,这个就跳过
先给Activity实现SensorEventListener接口,后面要不断要监听来刷新数据
public class MainActivity extends AppCompatActivity implements SensorEventListener {然后创建SensorManager对象,如果前面设置过就不用设置,然后为它注册加速度传感器监听器,采样频率可以自己设置,一般越高越精准但是越耗电
private SensorManager sm;
//创建一个SensorManager来获取系统的传感器服务 sm = (SensorManager) getSystemService(Context.SENSOR_SERVICE); /* * 最常用的一个方法 注册事件 * 参数1 :SensorEventListener监听器 * 参数2 :Sensor 一个服务可能有多个Sensor实现,此处调用getDefaultSensor获取默认的Sensor * 参数3 :模式 可选数据变化的刷新频率,多少微秒取一次。 * */ //加速度传感器 sm.registerListener(this, sm.getDefaultSensor(Sensor.TYPE_ACCELEROMETER), SensorManager.SENSOR_DELAY_NORMAL);接下来我们只要监听这个传感器值的变化,然后更新textView的值就好了
@Override public void onSensorChanged(SensorEvent sensorEvent) { if (sensorEvent.sensor.getType() == Sensor.TYPE_ACCELEROMETER) { float X_lateral = sensorEvent.values[0]; float Y_longitudinal = sensorEvent.values[1]; float Z_vertical = sensorEvent.values[2]; mtextViewx.setText(X_lateral + ""); mtextViewy.setText(Y_longitudinal + ""); mtextViewz.setText(Z_vertical + ""); } }可以看到放在桌子上的时候x和y轴的加速度几乎为0,我手机不太平,而z轴的加速度接近9.8,换了小米note2测出来就是9.8,米4渣渣。其实这个传感器非常敏感,数值是一直在变化的
在activity变为不可见的时候,传感器依然在工作,这样很耗电,所以我们根据需求可以在onPause方法里面停掉传感器的工作
@Override public void onPause() { sm.unregisterListener(this); super.onPause(); }
2.磁场传感器
和加速度计一样,为sensormanager监听磁场变化即可,吧手机放在电脑旁边时候可以清楚看到数值的变化
// 为磁场传感器注册监听器 sm.registerListener(this, sm.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD), SensorManager.SENSOR_DELAY_NORMAL);
else if(sensorEvent.sensor.getType() == Sensor.TYPE_MAGNETIC_FIELD){ float X_lateral = sensorEvent.values[0]; float Y_longitudinal = sensorEvent.values[1]; float Z_vertical = sensorEvent.values[2]; mtextView1.setText("x轴的磁场强度\n"+ X_lateral ); mtextView2.setText("y轴的磁场强度\n"+ Y_longitudinal ); mtextView3.setText("z轴的磁场强度\n"+ Z_vertical ); }
3.方向传感器
这个可以用来做指南针之类的,绕z轴转过的角度为0时大概指向正北。这个TYPE_ORIENTATION接口不够精确已经过时了,可以使用旋转矩阵来代替。这里绕z轴转过的角度是value[0],
详情看这个博客点击打开链接
// 为方向传感器注册监听器 sm.registerListener(this, sm.getDefaultSensor(Sensor.TYPE_ORIENTATION), SensorManager.SENSOR_DELAY_NORMAL);
else if(sensorEvent.sensor.getType() == Sensor.TYPE_ORIENTATION){ float X_lateral = sensorEvent.values[0]; float Y_longitudinal = sensorEvent.values[1]; float Z_vertical = sensorEvent.values[2]; mtextView4.setText("绕z轴转过的角度\n"+ X_lateral ); mtextView5.setText("绕x轴转过的角度\n"+ Y_longitudinal ); mtextView6.setText("绕y轴转过的角度\n"+ Z_vertical ); }4.陀螺仪传感器
// 为陀螺仪传感器注册监听器 sm.registerListener(this, sm.getDefaultSensor(Sensor.TYPE_GYROSCOPE), SensorManager.SENSOR_DELAY_NORMAL);
else if(sensorEvent.sensor.getType() == Sensor.TYPE_GYROSCOPE){ //需要将弧度转为角度 float X = (float)Math.toDegrees(sensorEvent.values[0]); float Y = (float)Math.toDegrees(sensorEvent.values[1]); float Z = (float)Math.toDegrees(sensorEvent.values[2]); mtextView7.setText("绕x轴转过的角速度\n"+ X ); mtextView8.setText("绕y轴转过的角速度\n"+ Y ); mtextView9.setText("绕z轴转过的角速度\n"+ Z );5.重力传感器
就是把重力加速度分解到xyz三个方向上
// 为重力传感器注册监听器 sm.registerListener(this, sm.getDefaultSensor(Sensor.TYPE_GRAVITY), SensorManager.SENSOR_DELAY_NORMAL);
else if(sensorEvent.sensor.getType() == Sensor.TYPE_GRAVITY){ float X = sensorEvent.values[0]; float Y = sensorEvent.values[1]; float Z = sensorEvent.values[2]; mtextViewgx.setText("x方向的重力加速度\n"+ X ); mtextViewgy.setText("Y方向的重力加速度\n"+ Y ); mtextViewgz.setText("Z方向的重力加速度\n"+ Z );6.线性加速度传感器
就是去掉重力加速度后各个方向的加速度
// 为线性加速度传感器注册监听器 sm.registerListener(this, sm.getDefaultSensor(Sensor.TYPE_LINEAR_ACCELERATION), SensorManager.SENSOR_DELAY_NORMAL);
else if(sensorEvent.sensor.getType() == Sensor.TYPE_LINEAR_ACCELERATION){ float X = sensorEvent.values[0]; float Y = sensorEvent.values[1]; float Z = sensorEvent.values[2]; mtextViewlx.setText("x方向的线性加速度\n"+ X ); mtextViewly.setText("Y方向的线性加速度\n"+ Y ); mtextViewlz.setText("Z方向的线性加速度\n"+ Z ); }7.温度传感器
这里的TYPE_TEMPERATURE已经过时,测出来的是cpu的温度,所以测出来的数值有点大,如果测环境温度的话应该使用
TYPE_AMBIENT_TEMPERATURE。不过大部分手机都没有这个传感器,小米note2居然连前面那个都没有
// 为温度传感器注册监听器 sm.registerListener(this, sm.getDefaultSensor(Sensor.TYPE_TEMPERATURE), SensorManager.SENSOR_DELAY_NORMAL); Sensor tempertureSensor = sm.getDefaultSensor(Sensor.TYPE_PRESSURE);
else if(sensorEvent.sensor.getType() == Sensor.TYPE_TEMPERATURE){ float X = sensorEvent.values[0]; mtextView10.setText("温度为"+ X ); }
8.光传感器
// 为光传感器注册监听器 sm.registerListener(this, sm.getDefaultSensor(Sensor.TYPE_LIGHT), SensorManager.SENSOR_DELAY_NORMAL);
else if(sensorEvent.sensor.getType() == Sensor.TYPE_LIGHT){ float X = sensorEvent.values[0]; mtextView11.setText("光强度为为"+ X ); }9.距离传感器
可以控制手机打电话时候息屏,如果使用光线传感器的话在黑夜中打电话就自动息屏了
// 为距离传感器注册监听器 sm.registerListener(this, sm.getDefaultSensor(Sensor.TYPE_PROXIMITY), SensorManager.SENSOR_DELAY_NORMAL);
else if(sensorEvent.sensor.getType() == Sensor.TYPE_PROXIMITY){ float X = sensorEvent.values[0]; mtextView12.setText("距离为"+ X ); }10.压力传感器
// 为压力传感器注册监听器 sm.registerListener(this, sm.getDefaultSensor(Sensor.TYPE_PRESSURE), SensorManager.SENSOR_DELAY_NORMAL);
else if(sensorEvent.sensor.getType() == Sensor.TYPE_PRESSURE){ float X = sensorEvent.values[0]; mtextView13.setText("压强为"+ X ); }11.计步传感器
有两个接口,一个Counter统计的是总步数,而DETECTOR为该计步是否有效,有效的话就置1
// 计步统计 sm.registerListener(this, sm.getDefaultSensor(Sensor.TYPE_STEP_COUNTER), SensorManager.SENSOR_DELAY_NORMAL); // 单次计步 sm.registerListener(this, sm.getDefaultSensor(Sensor.TYPE_STEP_DETECTOR), SensorManager.SENSOR_DELAY_NORMAL);
else if(sensorEvent.sensor.getType() == Sensor.TYPE_STEP_COUNTER){ float X = sensorEvent.values[0]; mtextView14.setText("COUNTER:"+ X ); } else if(sensorEvent.sensor.getType() == Sensor.TYPE_STEP_DETECTOR){ float X = sensorEvent.values[0]; mtextView15.setText("DECTOR:"+ X ); }所有代码
public class MainActivity extends AppCompatActivity implements SensorEventListener { private TextView mtextViewx; private TextView mtextViewy; private TextView mtextViewz; private TextView mtextViewlx; private TextView mtextViewly; private TextView mtextViewlz; private TextView mtextViewgx; private TextView mtextViewgy; private TextView mtextViewgz; private TextView mtextView1; private TextView mtextView2; private TextView mtextView3; private TextView mtextView4; private TextView mtextView5; private TextView mtextView6; private TextView mtextView7; private TextView mtextView8; private TextView mtextView9; private TextView mtextView10; private TextView mtextView11; private TextView mtextView12; private TextView mtextView13; private TextView mtextView14; private TextView mtextView15; private SensorManager sm; private static final String TAG = "sensor"; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); iniView(); } @Override protected void onResume() { super.onResume(); setSensor(); SensorManager mSensorManager; ListsensorList; // 实例化传感器管理者 mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE); // 得到设置支持的所有传感器的List sensorList = mSensorManager.getSensorList(Sensor.TYPE_ALL); List sensorNameList = new ArrayList (); for (Sensor sensor : sensorList) { Log.d(TAG, "onResume: "+sensor.getName()); } } public void iniView() { mtextViewx = (TextView) findViewById(R.id.textViewx); mtextViewy = (TextView) findViewById(R.id.textViewy); mtextViewz = (TextView) findViewById(R.id.textViewz); mtextViewlx = (TextView) findViewById(R.id.textViewlx); mtextViewly = (TextView) findViewById(R.id.textViewly); mtextViewlz = (TextView) findViewById(R.id.textViewlz); mtextViewgx = (TextView) findViewById(R.id.textViewgx); mtextViewgy = (TextView) findViewById(R.id.textViewgy); mtextViewgz = (TextView) findViewById(R.id.textViewgz); mtextView1 = (TextView) findViewById(R.id.textView1); mtextView2 = (TextView) findViewById(R.id.textView2); mtextView3 = (TextView) findViewById(R.id.textView3); mtextView4 = (TextView) findViewById(R.id.textView4); mtextView5 = (TextView) findViewById(R.id.textView5); mtextView6 = (TextView) findViewById(R.id.textView6); mtextView7 = (TextView) findViewById(R.id.textView7); mtextView8 = (TextView) findViewById(R.id.textView8); mtextView9 = (TextView) findViewById(R.id.textView9); mtextView10 = (TextView) findViewById(R.id.textView10); mtextView11 = (TextView) findViewById(R.id.textView11); mtextView12 = (TextView) findViewById(R.id.textView12); mtextView13 = (TextView) findViewById(R.id.textView13); mtextView14 = (TextView) findViewById(R.id.textView14); mtextView15 = (TextView) findViewById(R.id.textView15); } public void setSensor() { //创建一个SensorManager来获取系统的传感器服务 sm = (SensorManager) getSystemService(Context.SENSOR_SERVICE); /* * 最常用的一个方法 注册事件 * 参数1 :SensorEventListener监听器 * 参数2 :Sensor 一个服务可能有多个Sensor实现,此处调用getDefaultSensor获取默认的Sensor * 参数3 :模式 可选数据变化的刷新频率,多少微秒取一次。 * */ //加速度传感器 sm.registerListener(this, sm.getDefaultSensor(Sensor.TYPE_ACCELEROMETER), SensorManager.SENSOR_DELAY_NORMAL); // 为磁场传感器注册监听器 sm.registerListener(this, sm.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD), SensorManager.SENSOR_DELAY_NORMAL); // 为方向传感器注册监听器 sm.registerListener(this, sm.getDefaultSensor(Sensor.TYPE_ORIENTATION), SensorManager.SENSOR_DELAY_NORMAL); // 为陀螺仪传感器注册监听器 sm.registerListener(this, sm.getDefaultSensor(Sensor.TYPE_GYROSCOPE), SensorManager.SENSOR_DELAY_NORMAL); // 为重力传感器注册监听器 sm.registerListener(this, sm.getDefaultSensor(Sensor.TYPE_GRAVITY), SensorManager.SENSOR_DELAY_NORMAL); // 为线性加速度传感器注册监听器 sm.registerListener(this, sm.getDefaultSensor(Sensor.TYPE_LINEAR_ACCELERATION), SensorManager.SENSOR_DELAY_NORMAL); // 为温度传感器注册监听器 sm.registerListener(this, sm.getDefaultSensor(Sensor.TYPE_TEMPERATURE), SensorManager.SENSOR_DELAY_NORMAL); Sensor tempertureSensor = sm.getDefaultSensor(Sensor.TYPE_PRESSURE); // if (tempertureSensor == null) { // Toast.makeText(this, "你的设备不支持该功能", 0).show(); // } // 为光传感器注册监听器 sm.registerListener(this, sm.getDefaultSensor(Sensor.TYPE_LIGHT), SensorManager.SENSOR_DELAY_NORMAL); // 为距离传感器注册监听器 sm.registerListener(this, sm.getDefaultSensor(Sensor.TYPE_PROXIMITY), SensorManager.SENSOR_DELAY_NORMAL); // 为压力传感器注册监听器 sm.registerListener(this, sm.getDefaultSensor(Sensor.TYPE_PRESSURE), SensorManager.SENSOR_DELAY_NORMAL); // 计步统计 sm.registerListener(this, sm.getDefaultSensor(Sensor.TYPE_STEP_COUNTER), SensorManager.SENSOR_DELAY_NORMAL); // 单次计步 sm.registerListener(this, sm.getDefaultSensor(Sensor.TYPE_STEP_DETECTOR), SensorManager.SENSOR_DELAY_NORMAL); } @Override public void onSensorChanged(SensorEvent sensorEvent) { if (sensorEvent.sensor.getType() == Sensor.TYPE_ACCELEROMETER) { float X_lateral = sensorEvent.values[0]; float Y_longitudinal = sensorEvent.values[1]; float Z_vertical = sensorEvent.values[2]; mtextViewx.setText(X_lateral + ""); mtextViewy.setText(Y_longitudinal + ""); mtextViewz.setText(Z_vertical + ""); } else if(sensorEvent.sensor.getType() == Sensor.TYPE_MAGNETIC_FIELD){ float X_lateral = sensorEvent.values[0]; float Y_longitudinal = sensorEvent.values[1]; float Z_vertical = sensorEvent.values[2]; mtextView1.setText("x轴的磁场强度\n"+ X_lateral ); mtextView2.setText("y轴的磁场强度\n"+ Y_longitudinal ); mtextView3.setText("z轴的磁场强度\n"+ Z_vertical ); } else if(sensorEvent.sensor.getType() == Sensor.TYPE_ORIENTATION){ float X_lateral = sensorEvent.values[0]; float Y_longitudinal = sensorEvent.values[1]; float Z_vertical = sensorEvent.values[2]; mtextView4.setText("绕z轴转过的角度\n"+ X_lateral ); mtextView5.setText("绕x轴转过的角度\n"+ Y_longitudinal ); mtextView6.setText("绕y轴转过的角度\n"+ Z_vertical ); } else if(sensorEvent.sensor.getType() == Sensor.TYPE_GYROSCOPE){ //需要将弧度转为角度 float X = (float)Math.toDegrees(sensorEvent.values[0]); float Y = (float)Math.toDegrees(sensorEvent.values[1]); float Z = (float)Math.toDegrees(sensorEvent.values[2]); mtextView7.setText("绕x轴转过的角速度\n"+ X ); mtextView8.setText("绕y轴转过的角速度\n"+ Y ); mtextView9.setText("绕z轴转过的角速度\n"+ Z ); }else if(sensorEvent.sensor.getType() == Sensor.TYPE_GRAVITY){ float X = sensorEvent.values[0]; float Y = sensorEvent.values[1]; float Z = sensorEvent.values[2]; mtextViewgx.setText("x方向的重力加速度\n"+ X ); mtextViewgy.setText("Y方向的重力加速度\n"+ Y ); mtextViewgz.setText("Z方向的重力加速度\n"+ Z ); }else if(sensorEvent.sensor.getType() == Sensor.TYPE_LINEAR_ACCELERATION){ float X = sensorEvent.values[0]; float Y = sensorEvent.values[1]; float Z = sensorEvent.values[2]; mtextViewlx.setText("x方向的线性加速度\n"+ X ); mtextViewly.setText("Y方向的线性加速度\n"+ Y ); mtextViewlz.setText("Z方向的线性加速度\n"+ Z ); }else if(sensorEvent.sensor.getType() == Sensor.TYPE_TEMPERATURE){ float X = sensorEvent.values[0]; mtextView10.setText("温度为"+ X ); }else if(sensorEvent.sensor.getType() == Sensor.TYPE_LIGHT){ float X = sensorEvent.values[0]; mtextView11.setText("光强度为为"+ X ); }else if(sensorEvent.sensor.getType() == Sensor.TYPE_PROXIMITY){ float X = sensorEvent.values[0]; mtextView12.setText("距离为"+ X ); }else if(sensorEvent.sensor.getType() == Sensor.TYPE_PRESSURE){ float X = sensorEvent.values[0]; mtextView13.setText("压强为"+ X ); } else if(sensorEvent.sensor.getType() == Sensor.TYPE_STEP_COUNTER){ float X = sensorEvent.values[0]; mtextView14.setText("COUNTER:"+ X ); } else if(sensorEvent.sensor.getType() == Sensor.TYPE_STEP_DETECTOR){ float X = sensorEvent.values[0]; mtextView15.setText("DECTOR:"+ X ); } } //复写onAccuracyChanged方法 @Override public void onAccuracyChanged(Sensor sensor, int accuracy) { Log.i(TAG, "onAccuracyChanged"); } @Override public void onPause() { sm.unregisterListener(this); super.onPause(); } }