手机指南针校准(指南校准针手机版下载)
其实这篇博客不是做真正的指南针,因为真正的指南针需要做一个完整的自定义控件来指示方向。我们这里只是简单通过代码获取用户手机头部指向的方向。这个功能往往在我们定位获取的时候,用户方向变更后进行采集、车辆行驶偏移等有一定的作用。下面我们通过代码简单编写一下。
activity_main.xml
MainActivity.java
public class MainActivity extends BaseActivity
implements SensorEventListener {
private TextView tv_direction;
private SensorManager mSensorMgr;// 声明一个传感管理器对象
private float[] mAcceValues; // 加速度变更值的数组
private float[] mMagnValues; // 磁场强度变更值的数组
private TextView tv_jt;
@Override
protected MvcBaseModel getModelImp() {
return null;
}
@Override
protected int getContentLayoutId() {
return R.layout.activity_main;
}
@Override
protected void initWidget() {
tv_direction = findViewById(R.id.tv_direction);
tv_jt = findViewById(R.id.tv_jt);
// 从系统服务中获取传感管理器对象
mSensorMgr = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
}
@Override
protected void onPause() {
super.onPause();
// 注销当前活动的传感监听器
mSensorMgr.unregisterListener(this);
}
@Override
protected void onResume() {
super.onResume();
int suitable = 0;
// 获取当前设备支持的传感器列表
List sensorList = mSensorMgr.getSensorList(Sensor.TYPE_ALL);
for (Sensor sensor : sensorList) {
if (sensor.getType() == Sensor.TYPE_ACCELEROMETER) { // 找到加速度传感器
suitable += 1;
} else if (sensor.getType() == Sensor.TYPE_MAGNETIC_FIELD) { // 找到磁场传感器
suitable += 10;
}
}
if (suitable / 10 > 0 && suitable % 10 > 0) {
// 给加速度传感器注册传感监听器
mSensorMgr.registerListener(this,
mSensorMgr.getDefaultSensor(Sensor.TYPE_ACCELEROMETER),
SensorManager.SENSOR_DELAY_NORMAL);
// 给磁场传感器注册传感监听器
mSensorMgr.registerListener(this,
mSensorMgr.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD),
SensorManager.SENSOR_DELAY_NORMAL);
} else {
tv_direction.setText("当前设备不支持指南针,请检查是否存在加速度和磁场传感器");
}
}
@Override
public void onSensorChanged(SensorEvent event) {
if (event.sensor.getType() == Sensor.TYPE_ACCELEROMETER) { // 加速度变更事件
mAcceValues = event.values;
} else if (event.sensor.getType() == Sensor.TYPE_MAGNETIC_FIELD) { // 磁场强度变更事件
mMagnValues = event.values;
}
if (mAcceValues != null && mMagnValues != null) {
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, mAcceValues, mMagnValues);
SensorManager.getOrientation(R, values);
values[0] = (float) Math.toDegrees(values[0]);
Log.i("aaaaaaaaaaa",values[0]+"");
tv_jt.setRotation(values[0]);
// 设置罗盘视图中的指南针方向
if (values[0] >= -10 && values[0] < 10) {
tv_direction.setText("手机上部方向是正北");
} else if (values[0] >= 10 && values[0] < 80) {
tv_direction.setText("手机上部方向是东北");
} else if (values[0] >= 80 && values[0] <= 100) {
tv_direction.setText("手机上部方向是正东");
} else if (values[0] >= 100 && values[0] < 170) {
tv_direction.setText("手机上部方向是东南");
} else if ((values[0] >= 170 && values[0] <= 180)
|| (values[0]) >= -180 && values[0] < -170) {
tv_direction.setText("手机上部方向是正南");
} else if (values[0] >= -170 && values[0] < -100) {
tv_direction.setText("手机上部方向是西南");
} else if (values[0] >= -100 && values[0] < -80) {
tv_direction.setText("手机上部方向是正西");
} else if (values[0] >= -80 && values[0] < -10) {
tv_direction.setText("手机上部方向是西北");
}
}
}
这样就实现了方向的获取和配合指针的一个旋转。如果大家需要可以在UI上进行相应的变化。
本文收集自互联网,如果发现有涉嫌侵权或违法违规的内容,请联系6532516@qq.com以便进行及时清除。
文章评论(0)