传感器系统:SensorManager.java:实现传感器系统核心的管理类SensorManagerSensor.java:单一传感器的描述性文件SensorSensorEvent.java:表示传感器系统的事件类SensorEventSensorEventListener.java:传感器事件的监听者SensorEventListener接口SensorListener.java:传感器的监听者SensorListener接口(不推荐使用)在这里介绍一下加速度传感器也就是重力传感器: 加速度传感器又叫G-sensor,返回x、y、z三轴的加速度数值。
该数值包含地心引力的影响,单位是m/s^2。 将手机平放在桌面上,x轴默认为0,y轴默认0,z轴默认9.81。
将手机朝下放在桌面上,z轴为-9.81。
将手机向左倾斜,x轴为正值。
将手机向右倾斜,x轴为负值。
将手机向上倾斜,y轴为负值。
将手机向下倾斜,y轴为正值。
测试代码:
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.os.Bundle;
import android.app.Activity;
import android.content.Context;
import android.view.Menu;
import android.widget.TextView;
public class MainActivity extends Activity {
private TextView XT,ZT,YT,ACT;
private SensorManager sm;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//获取组件
XT=(TextView)findViewById(R.id.XT);
YT = (TextView)findViewById(R.id.YT);
ZT = (TextView)findViewById(R.id.ZT);
ACT = (TextView)findViewById(R.id.onAccuracyChanged);
//创建一个SensorManager来获取系统的传感器服务
sm = (SensorManager)getSystemService(Context.SENSOR_SERVICE);
//选取加速度感应器
int sensorType = Sensor.TYPE_ACCELEROMETER;
/*
* 注册事件
* 参数1 :SensorEventListener监听器
* 参数2 :Sensor 一个服务可能有多个Sensor实现,此处调用getDefaultSensor获取默认的Sensor
* 参数3 :模式 可选数据变化的刷新频率
* */
sm.registerListener(mySensorListener,sm.getDefaultSensor(sensorType),SensorManager.SENSOR_DELAY_NORMAL);
}
public void onPause(){
sm.unregisterListener(mySensorListener);
super.onPause();
}
/*
* SensorEventListener接口的实现,需要实现两个方法
* 方法1 onSensorChanged 当数据变化的时候被触发调用
* 方法2 onAccuracyChanged 当获得数据的精度发生变化的时候被调用,比如突然无法获得数据时
* */
final SensorEventListener mySensorListener = new SensorEventListener(){
//重写onSensorChanged方法
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];
XT.setText("x="+X_lateral);
YT.setText("y="+Y_longitudinal);
ZT.setText("z="+Z_vertical);
}
}
//重写onAccuracyChanged方法
public void onAccuracyChanged(Sensor sensor , int accuracy){
ACT.setText("onAccuracyChanged被触发");
}
};
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
}
测试结果:
可以看到x,y,z值的变化,设定一个阀值然后根据摇晃值判断是否进行功能,就可以达到重力感应实现功能的效果
在这里补充一个“重力感应类”,可以在程序中直接用的:
import android.content.Context;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
public class NewSensor implements SensorEventListener {
private SensorManager sm;//传感器管理
private Sensor sensor;//传感器
private Context context;//上下文
//重力感应监听器
private OnShakeListener shakeListener;
//设置速度阀值
private final int SPEED_SHRESHOLD = 4000;
//两次检测的时间间隔
private final int UPTATE_INTERVAL_TIME = 70;
//上次检测时间
private long lastUpdateTime;
public NewSensor(Context c){
this.context = c;
start();
}
//开始检测
public void start(){
//获取系统传感器管理
sm = (SensorManager)context.getSystemService(Context.SENSOR_SERVICE);
//获得重力传感器
sensor = sm.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
//注册
sm.registerListener(this, sensor, SensorManager.SENSOR_DELAY_GAME);
}
//停止检测 (用此方法停止对加速度传感器的使用)
public void stop(){
sm.unregisterListener(this);
}
//摇晃监听接口
public interface OnShakeListener {
public void onShake();
}
@Override
public void onSensorChanged(SensorEvent event) {
//现在检测时间
long currentUpdateTime = System.currentTimeMillis();
//两次检测的时间间隔
long timeInterval = currentUpdateTime - lastUpdateTime;
//判断是否达到了检测时间间隔
if(timeInterval < UPTATE_INTERVAL_TIME)
return;
//现在的时间变成last时间
lastUpdateTime = currentUpdateTime;
//获取坐标
float x = event.values[0];
float y = event.values[1];
float z = event.values[2];
//转变
float lastx = x;
float lasty = y;
float lastz = z;
//获取变化值
float changex = x-lastx;
float changey = y-lasty;
float changez = z-lastz;
//计算摇晃值
double speed = Math.sqrt(changex*changex + changey*changey + changez*changez)/timeInterval * 10000;
//判断是否达到阀值
if(speed>SPEED_SHRESHOLD){
shakeListener.onShake();
}
}
@Override
public void onAccuracyChanged(Sensor sensor, int accuracy) {
}
}
直接在主类里面创建对象 然后在监听里可以实现(播放歌曲、切换图片等功能)