В моем приложении я хочу, чтобы курс устройства указывался в градусах, поэтому вначале я использовал Sensor.TYPE_MAGNETIC_FIELD
и Sensor.TYPE_ACCELEROMETER
, но иногда это не давало желаемого результата, т. Е. Произошло огромное изменение значения курса.
После этого я услышал о Sensor.TYPE_ROTATION_VECTOR
, что он более стабилен и точен из-за его слитой версии датчиков, но иногда он также дает мне неправильные показания (иногда есть огромная разница в фактическом курсе).
Примечание. Я тестирую его в движущемся поезде.
Вот мой код:
float[] orient = new float[3];
float[] rotmat = new float[9];
sensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
gsensor = sensorManager.getDefaultSensor(Sensor.TYPE_ROTATION_VECTOR);
packageManager = getPackageManager();
if (packageManager.hasSystemFeature(PackageManager.FEATURE_SENSOR_COMPASS)){
sensorManager.registerListener(this, gsensor, SensorManager.SENSOR_DELAY_NORMAL);
}else {
Toast.makeText(OutputScreen.this,"No Compass Sensor !", Toast.LENGTH_SHORT).show();
}
@Override
public void onSensorChanged(SensorEvent event) {
if (event.sensor.getType() == Sensor.TYPE_ROTATION_VECTOR){
SensorManager.getRotationMatrixFromVector(rotmat, event.values);
SensorManager.getOrientation(rotmat, orient);
azimuth = (float) Math.toDegrees(orient[0]);
if (azimuth < 0){
azimuth = azimuth + 360;
}
Log.i("OUTPUT",""+azimuth); //heading in degree
}
}
Я знаю, что в моем коде что-то не так, но не могу понять,Было бы здорово, если бы кто-нибудь помог мне с этим.