传感器步骤如下:
调用Context的getSystemService(Context.SENSOR_SERVICE)方法获取SensorManager对象。
调用SensorManager的getDefaultSensor(int type)方法来获取指定类型的传感器。
一般在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:适合普通用户界面的频率。
例如方向传感器:
package com.example.mysensor;
import android.app.usage.UsageEvents;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorListener;
import android.hardware.SensorManager;
import android.media.Image;
import android.provider.ContactsContract;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.animation.RotateAnimation;
import android.widget.ImageView;
import android.widget.TextView;
import java.util.List;
public class MainActivity extends AppCompatActivity implements SensorEventListener{
private TextView mTextView;
private SensorManager sensorManager;
private float num=0;
private ImageView mImageView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mTextView= (TextView) findViewById(R.id.text);
sensorManager= (SensorManager) getSystemService(SENSOR_SERVICE);
mImageView= (ImageView) findViewById(R.id.image);
List<Sensor> sensorList=sensorManager.getSensorList(Sensor.TYPE_ALL);
mTextView.setText("传感器的数量"+sensorList.size());
for (Sensor s:sensorList) {
String str=mTextView.getText().toString() +
"传感器名称"+s.getName()
+ "传感器型号"+s.getVersion()
+"传感器供应商"+s.getVendor();
switch (s.getType()){
case Sensor.TYPE_ACCELEROMETER:
mTextView.setText(str);
break;
}
}
}
@Override
protected void onResume() {
super.onResume();
sensorManager.registerListener((SensorEventListener) this,sensorManager.getDefaultSensor(Sensor.TYPE_ORIENTATION),
SensorManager.SENSOR_DELAY_GAME);
}
@Override
public void onSensorChanged(SensorEvent event) {
float degree=0;
if (event.sensor.getType() == Sensor.TYPE_ORIENTATION){
//最重要的是这句话
degree=event.values[0];
RotateAnimation totation=new RotateAnimation(num,-degree,1,0.5f,1,0.5f);
totation.setDuration(200);
//保存状态
totation.setFillAfter(true);
mImageView.setAnimation(totation);
num=-degree;
}
//打印三个坐标轴的信息
int x= (int) event.values[sensorManager.DATA_X];
int y= (int) event.values[sensorManager.DATA_Y];
int z= (int) event.values[sensorManager.DATA_Z];
mTextView.setText("x轴" +x+ "y轴" +y+ "z轴"+z);
}
//当传感器精度发生变化时调用该方法
@Override
public void onAccuracyChanged(Sensor sensor, int accuracy) {
}
//注销时调用该方法
@Override
protected void onPause() {
sensorManager.unregisterListener(this);
super.onPause();
}
}
传感器的坐标系统与屏幕坐标系统不同,传感器坐标系统的X轴沿屏幕向右;Y轴则沿屏幕向上,Z轴在垂直屏幕向上。
当拿着手机横向左右移动时,可能产生X轴上的加速度;拿着手机前后移动时,可能产生Y轴上的加速度;当拿着手机竖向上下移动时,可能产生Z轴上的加速度。
Android的常用传感器
1加速度传感器Accelerometer
加速度传感器主要感应手机的运动,在注册了传感器监听器后加速度传感器主要捕获3个参数values[0]、values[1]、values[2]。
values[0]:空间坐标系中x轴方向上的加速度减去重力加速度减去中立加速度在x轴上的分量。
values[1]:空间坐标系中x轴方向上的加速度减去重力加速度减去中立加速度在y轴上的分量。
values[2]:空间坐标系中x轴方向上的加速度减去重力加速度减去中立加速度在z轴上的分量。
上述3个数据的单位均为米每二次方秒。
距离说明:
当手机平放到桌面静止时,加速度为重力加速度g,通过0减去-g(重力加速度g方向为z轴反方向,故为负值)得到values[2]为g。如果把手机水平方向右推,此时手机x方向上的加速度为正,即values[0]为正。当把手机以a米每二次方秒的加速度竖值向上举时,values[2]的返回值为(a+g)米每二次方秒,通过a减去-g得到。
2 方向传感器Orientation
方向传感器主要感应手机方位的变化,其每次读取的都是静态的状态值,在注册了传感器监听器后方向传感器主要捕获3个参数values[0]、values[1]、values[2],关于三个角度的说明如下:
第一个角度:表示手机顶部朝向与正北方向的夹角。当手机绕着Z轴旋转时,该角度值发生改变。第二个角度:表示手机顶部或尾部翘起的角度,当手机绕着X轴倾斜时,该角度值发生变化。第三个角度:表示手机左侧或右侧翘起的角度。当手机绕着Y轴倾斜时,该角度值发生变化。
2.3磁场传感器Magnetic Field
磁场传感器主要用于感应周围的磁感应强度。即使周围没有任何直接的磁场,手机设备也始终会处于地球磁场中。随着手机状态设备摆放状态的改变,周围磁场在手机的X、Y、Z方向上的会发生改变。
磁场传感器传感器会返回三个数据,三个数据分别代表周围磁场分解到X、Y、Z三个方向上的磁场分量。磁场数据的单位是微特斯拉(uT)。
4光传感器Light
光传感器用于感应周围的光强,注册监听器后只捕获一个参数:values[0]。该参数代表周围的光照强度,单位为勒克斯(lux)。
5温度传感器Temperature
温度传感器用于获取手机设备所处环境的温度。温度传感器会返回一个数据,该数据代表手机设备周围的温度,单位是摄氏度。
6压力传感器 Pressure
压力传感器用于获取手机设备所处环境的压力的大小。压力传感器会返回一个数据,代表手机设备周围的压力大小。
传感器应用案例
开发指南针的思路:先准备一张指南针图片,该图片上方向指针指向北方。接下来开发一个检测方向的传感器,程序检测到手机顶部绕Z轴转过多少度,让指南针图片反向转过多少度即可。代码在上边