import java.util.ArrayList; import java.util.LinkedList;
import android.content.Context; import android.hardware.Sensor; import android.hardware.SensorEvent; import android.hardware.SensorEventListener; import android.hardware.SensorManager; import android.os.Handler; import android.os.Message; /**
* 传感器监听,用于实现传感器来获取数据,得到方位角,俯仰角等数据 通过传入的handler来实现数据的回调, 规划院的方位角数据
* {@link handlerMessage MESSAGE_GUIHUAYUAN_ANALYZE_SUCCESS } 自己测试使用的方位角数据
* {@link handlerMessage MESSAGE_ANALYZE_SUCCESS } */
public class MySensor {
private Context context;
private float[] accelerometerValues; private float[] magneticFieldValues; private float[] orientationValues;
private float[] collector = new float[3];// 采集实时数分析 // 传感器
private SensorManager mSensorManager; private Sensor accelerometer; private Sensor magnetic;
private Sensor mOrientation;
private LinkedList
过快的问题
public AngleThread getInstance() {
return task;
/** *
* @param context用于获取方位角和计算摄像头偏差的方位角 * @param handler用于回调信息给UI线程 */
public MySensor(Context context, Handler handler) { }
if (handler != null) { }
this.context = context;
task = new AngleThread(handler);
// 1声明2.注册3.监听4.注销 /** *
* @param context用于获取方位角的 */
public MySensor(Context context) { }
this.context = context;
private boolean shooting;// 在拍照中,用差值计算方位角 private AngleThread task;
}
public void init() {// 初始化
// 实例化传感器管理者
mSensorManager = (SensorManager) context
.getSystemService(Context.SENSOR_SERVICE);
// 初始化加速度传感器
accelerometer = mSensorManager
.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
// 初始化地磁场传感器
magnetic =
mSensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD); mOrientation =
mSensorManager.getDefaultSensor(Sensor.TYPE_ORIENTATION);
public void regist() {// 注册
mSensorManager.registerListener(new MySensorEventListener(),
accelerometer, Sensor.TYPE_ACCELEROMETER);
}
magnetic,
}
mSensorManager.registerListener(new MySensorEventListener(),
Sensor.TYPE_MAGNETIC_FIELD);
mSensorManager.registerListener(new MySensorEventListener(),
mOrientation, Sensor.TYPE_ORIENTATION);
public void unregist() {// 注销
mSensorManager.unregisterListener(new MySensorEventListener());
{ {
}
if (event.sensor.getType() == Sensor.TYPE_ACCELEROMETER) }
if (event.sensor.getType() == Sensor.TYPE_MAGNETIC_FIELD) }
if (event.sensor.getType() == Sensor.TYPE_ORIENTATION) {
orientationValues = event.values; magneticFieldValues = event.values; accelerometerValues = event.values;
@Override
public void onSensorChanged(SensorEvent event) {
class MySensorEventListener implements SensorEventListener {// 监听 }
// if (event.sensor.getType() == Sensor.TYPE_ROTATION_VECTOR) {
// float[] rotationMatrix = new float[16];
// SensorManager.getRotationMatrixFromVector(rotationMatrix, // event.values);
// determineOrientation(rotationMatrix); // }
// 不能为空,不然刚开始的时候就会报空指针,因为三个值不
是同事加载的,
// 但是每加载一次都会去回调3次这个方法,所以这个加载的
速度非常的快(三个传感器的数据是并行的)
}
if (accelerometerValues != null && orientationValues != null
&& magneticFieldValues != null)
calculateOrientation();
@Override
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]);
values[0] = values[0] < 0 ? values[0] + 360 : values[0]; int cor = context.getResources().getConfiguration().orientation; // int c = ((Activity) context).getWindowManager().getDefaultDisplay() // .getRotation();// 界面的方向
values[1] = (float) Math.toDegrees(values[1]); values[2] = (float) Math.toDegrees(values[2]); float angle3 = values[0];
double AZIM = orientationValues[0]; double TILT = orientationValues[1];