一.Android中检测重力感应变化大致需要下面几个步骤:
1.得到传感器服务 getSystemService(SENSOR_SERVICE); 二. 常用的感应器1.获取加速度: 加速度感应器
可以通过这个感应器获得三个浮点型 ![]()
public class MainActivity extends AppCompatActivity {
//设置LOG标签
private static final String TAG = "sensor";
private SensorManager sm;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//1.创建一个SensorManager来获取系统的传感器服务
sm = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
//2.选取加速度感应器
int sensorType = Sensor.TYPE_ACCELEROMETER;
/*
* 最常用的一个方法 注册事件
* 参数1 :SensorEventListener监听器
* 参数2 :Sensor 一个服务可能有多个Sensor实现,此处调用getDefaultSensor获取默认的Sensor
* 参数3 :模式 可选数据变化的刷新频率
* */
sm.registerListener(myAccelerometerListener, sm.getDefaultSensor(sensorType), SensorManager.SENSOR_DELAY_NORMAL);
}
/*
* 3.SensorEventListener接口的实现,需要实现两个方法
* 方法1 onSensorChanged 当数据变化的时候被触发调用
* 方法2 onAccuracyChanged 当获得数据的精度发生变化的时候被调用,比如突然无法获得数据时
* */
final SensorEventListener myAccelerometerListener = new SensorEventListener() {
//4.复写onSensorChanged方法
public void onSensorChanged(SensorEvent sensorEvent) {
if (sensorEvent.sensor.getType() == Sensor.TYPE_ACCELEROMETER) {
Log.i(TAG, "onSensorChanged");
//图解中已经解释三个值的含义
float X_lateral = sensorEvent.values[0];
float Y_longitudinal = sensorEvent.values[1];
float Z_vertical = sensorEvent.values[2];
Log.i(TAG, "\n heading " + X_lateral);
Log.i(TAG, "\n pitch " + Y_longitudinal);
Log.i(TAG, "\n roll " + Z_vertical);
}
}
//复写onAccuracyChanged方法
public void onAccuracyChanged(Sensor sensor, int accuracy) {
Log.i(TAG, "onAccuracyChanged");
}
};
public void onPause() {
/*
* 很关键的部分:注意,说明文档中提到,即使activity不可见的时候,感应器依然会继续的工作,测试的时候可以发现,没有正常的刷新频率
* 也会非常高,所以一定要在onPause方法中关闭触发器,否则讲耗费用户大量电量,很不负责。
* */
sm.unregisterListener(myAccelerometerListener);
super.onPause();
}
}
2.获取用户移动方向:方向感应器android给我们提供的方向数据是一个float型的数组,包含三个方向的值如图 ![]()
public static boolean getRotationMatrix(float[] R, float[] I, float[] gravity, float[] geomagnetic)
public class MainActivity extends AppCompatActivity {
private static final String TAG = "sensor";
//1.得到传感器
private SensorManager sm;
//需要两个Sensor
private Sensor aSensor;
private Sensor mSensor;
float[] accelerometerValues = new float[3];
float[] magneticFieldValues = new float[3];
@Override
public void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//1.得到传感器服务getSystemService(SENSOR_SERVICE);
sm = (SensorManager)getSystemService(Context.SENSOR_SERVICE);
//2.得到传感器类型getDefaultSensor(Sensor.TYPE_GRAVITY);
aSensor = sm.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
mSensor = sm.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD);
//注册监听
sm.registerListener(myListener, aSensor, SensorManager.SENSOR_DELAY_NORMAL);
sm.registerListener(myListener, mSensor,SensorManager.SENSOR_DELAY_NORMAL);
//更新显示数据的方法
calculateOrientation();
}
//再次强调:注意activity暂停的时候释放
public void onPause(){
sm.unregisterListener(myListener);
super.onPause();
}
//3.注册监听器 SensorEventListener
final SensorEventListener myListener = new SensorEventListener() {
//4. 实现监听器的回调函数 onSensorChanged, onAccuracyChanged
public void onSensorChanged(SensorEvent sensorEvent) {
if (sensorEvent.sensor.getType() == Sensor.TYPE_MAGNETIC_FIELD)
magneticFieldValues = sensorEvent.values;
if (sensorEvent.sensor.getType() == Sensor.TYPE_ACCELEROMETER)
accelerometerValues = sensorEvent.values;
calculateOrientation();
}
public void onAccuracyChanged(Sensor sensor, int accuracy) {}
};
/**
* 计算方向
*/
private void calculateOrientation() {
float[] values = new float[3];
float[] R = new float[9];
SensorManager.getRotationMatrix(R, null, accelerometerValues, magneticFieldValues);
SensorManager.getOrientation(R, values);
// 要经过一次数据格式的转换,转换为度
values[0] = (float) Math.toDegrees(values[0]);
Log.i(TAG, values[0] + "");
//values[1] = (float) Math.toDegrees(values[1]);
//values[2] = (float) Math.toDegrees(values[2]);
if(values[0] >= -5 && values[0] < 5){
Log.i(TAG, "正北");
}
else if(values[0] >= 5 && values[0] < 85){
Log.i(TAG, "东北");
}
else if(values[0] >= 85 && values[0] <=95){
Log.i(TAG, "正东");
}
else if(values[0] >= 95 && values[0] <175){
Log.i(TAG, "东南");
}
else if((values[0] >= 175 && values[0] <= 180) || (values[0]) >= -180 && values[0] < -175){
Log.i(TAG, "正南");
}
else if(values[0] >= -175 && values[0] <-95){
Log.i(TAG, "西南");
}
else if(values[0] >= -95 && values[0] < -85){
Log.i(TAG, "正西");
}
else if(values[0] >= -85 && values[0] <-5){
Log.i(TAG, "西北");
}
}
}
打印日志: ![]()
打印日志
特别注意:在Activity暂定的时候,要关闭感应器。不然会很耗电。(责任编辑:最模板) |




高仿|精致lightinthebox模板
人气:5153
ecshop一号店2011最新模板
人气:2597
shopex家天下模板
人气:1661
ecshop亚马逊amazon外贸模板
人气:1451
ecshop多彩鞋子类综合商城
人气:443
Honour多用途外贸英文综合
人气:230